rwadurian/backend/services/referral-service/src/api/dto/referral.dto.ts

129 lines
3.6 KiB
TypeScript

import { IsString, IsOptional, Length, Matches, IsInt, Min, Max } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
export class ValidateReferralCodeDto {
@ApiProperty({ description: '推荐码', example: 'RWA123ABC' })
@IsString()
@Length(6, 20)
@Matches(/^[A-Z0-9]+$/, { message: '推荐码只能包含大写字母和数字' })
code: string;
}
export class CreateReferralDto {
@ApiProperty({ description: '用户ID', example: '123456789' })
@IsString()
userId: string;
@ApiProperty({ description: '账户序列号 (新格式: D + YYMMDD + 5位序号)', example: 'D2512110008' })
@IsString()
accountSequence: string; // 格式: D + YYMMDD + 5位序号
@ApiProperty({ description: '用户的推荐码(由 identity-service 生成)', example: 'ABC123' })
@IsString()
@Length(6, 20)
referralCode: string;
@ApiPropertyOptional({ description: '推荐人的推荐码', example: 'RWA123ABC' })
@IsOptional()
@IsString()
@Length(6, 20)
referrerCode?: string;
@ApiPropertyOptional({ description: '邀请人账户序列号 (新格式: D + YYMMDD + 5位序号)', example: 'D2512110007' })
@IsOptional()
@IsString()
inviterAccountSequence?: string;
}
export class GetDirectReferralsDto {
@ApiPropertyOptional({ description: '每页数量', default: 50 })
@IsOptional()
@IsInt()
@Min(1)
@Max(100)
limit?: number = 50;
@ApiPropertyOptional({ description: '偏移量', default: 0 })
@IsOptional()
@IsInt()
@Min(0)
offset?: number = 0;
}
export class ReferralInfoResponseDto {
@ApiProperty({ description: '用户ID' })
userId: string;
@ApiProperty({ description: '推荐码' })
referralCode: string;
@ApiProperty({ description: '推荐人ID', nullable: true })
referrerId: string | null;
@ApiProperty({ description: '推荐链深度' })
referralChainDepth: number;
@ApiProperty({ description: '直推人数' })
directReferralCount: number;
@ApiProperty({ description: '团队总认种量' })
totalTeamCount: number;
@ApiProperty({ description: '个人认种量' })
personalPlantingCount: number;
@ApiProperty({ description: '团队认种量' })
teamPlantingCount: number;
@ApiProperty({ description: '龙虎榜分值' })
leaderboardScore: number;
@ApiProperty({ description: '龙虎榜排名', nullable: true })
leaderboardRank: number | null;
@ApiProperty({ description: '创建时间' })
createdAt: Date;
}
export class DirectReferralResponseDto {
@ApiProperty({ description: '用户ID' })
userId: string;
@ApiProperty({ description: '账户序列号 (新格式: D + YYMMDD + 5位序号)' })
accountSequence: string; // 格式: D + YYMMDD + 5位序号
@ApiProperty({ description: '推荐码' })
referralCode: string;
@ApiProperty({ description: '个人认种量' })
personalPlantingCount: number;
@ApiProperty({ description: '团队认种量' })
teamPlantingCount: number;
@ApiProperty({ description: '直推人数(用于判断是否有下级)' })
directReferralCount: number;
@ApiProperty({ description: '加入时间' })
joinedAt: Date;
}
export class DirectReferralsResponseDto {
@ApiProperty({ type: [DirectReferralResponseDto] })
referrals: DirectReferralResponseDto[];
@ApiProperty({ description: '总数' })
total: number;
@ApiProperty({ description: '是否有更多' })
hasMore: boolean;
}
export class ValidateCodeResponseDto {
@ApiProperty({ description: '是否有效' })
valid: boolean;
@ApiPropertyOptional({ description: '推荐人ID' })
referrerId?: string;
}