// ============ Commands ============ export class AutoCreateAccountCommand { constructor( public readonly deviceId: string, public readonly deviceName?: string, public readonly inviterReferralCode?: string, public readonly provinceCode?: string, public readonly cityCode?: string, ) {} } export class RecoverByMnemonicCommand { constructor( public readonly accountSequence: number, public readonly mnemonic: string, public readonly newDeviceId: string, public readonly deviceName?: string, ) {} } export class RecoverByPhoneCommand { constructor( public readonly accountSequence: number, public readonly phoneNumber: string, public readonly smsCode: string, public readonly newDeviceId: string, public readonly deviceName?: string, ) {} } export class AutoLoginCommand { constructor( public readonly refreshToken: string, public readonly deviceId: string, ) {} } export class RegisterCommand { constructor( public readonly phoneNumber: string, public readonly smsCode: string, public readonly deviceId: string, public readonly provinceCode: string, public readonly cityCode: string, public readonly deviceName?: string, public readonly inviterReferralCode?: string, ) {} } export class LoginCommand { constructor( public readonly phoneNumber: string, public readonly smsCode: string, public readonly deviceId: string, ) {} } export class BindPhoneNumberCommand { constructor( public readonly userId: string, public readonly phoneNumber: string, public readonly smsCode: string, ) {} } export class UpdateProfileCommand { constructor( public readonly userId: string, public readonly nickname?: string, public readonly avatarUrl?: string, public readonly address?: string, ) {} } export class BindWalletAddressCommand { constructor( public readonly userId: string, public readonly chainType: string, public readonly address: string, ) {} } export class SubmitKYCCommand { constructor( public readonly userId: string, public readonly realName: string, public readonly idCardNumber: string, public readonly idCardFrontUrl: string, public readonly idCardBackUrl: string, ) {} } export class ReviewKYCCommand { constructor( public readonly userId: string, public readonly approved: boolean, public readonly reason?: string, ) {} } export class RemoveDeviceCommand { constructor( public readonly userId: string, public readonly currentDeviceId: string, public readonly deviceIdToRemove: string, ) {} } export class SendSmsCodeCommand { constructor( public readonly phoneNumber: string, public readonly type: 'REGISTER' | 'LOGIN' | 'BIND' | 'RECOVER', ) {} } // ============ Queries ============ export class GetMyProfileQuery { constructor(public readonly userId: string) {} } export class GetMyDevicesQuery { constructor( public readonly userId: string, public readonly currentDeviceId: string, ) {} } export class GetUserByReferralCodeQuery { constructor(public readonly referralCode: string) {} } // ============ Results ============ export interface AutoCreateAccountResult { userId: string; accountSequence: number; referralCode: string; mnemonic: string; walletAddresses: { kava: string; dst: string; bsc: string }; accessToken: string; refreshToken: string; } export interface RecoverAccountResult { userId: string; accountSequence: number; nickname: string; avatarUrl: string | null; referralCode: string; accessToken: string; refreshToken: string; } export interface AutoLoginResult { userId: string; accountSequence: number; accessToken: string; refreshToken: string; } export interface RegisterResult { userId: string; accountSequence: number; referralCode: string; accessToken: string; refreshToken: string; } export interface LoginResult { userId: string; accountSequence: number; accessToken: string; refreshToken: string; } export interface UserProfileDTO { userId: string; accountSequence: number; phoneNumber: string | null; nickname: string; avatarUrl: string | null; referralCode: string; province: string; city: string; address: string | null; walletAddresses: Array<{ chainType: string; address: string }>; kycStatus: string; kycInfo: { realName: string; idCardNumber: string } | null; status: string; registeredAt: Date; lastLoginAt: Date | null; } export interface DeviceDTO { deviceId: string; deviceName: string; addedAt: Date; lastActiveAt: Date; isCurrent: boolean; } export interface UserBriefDTO { userId: string; accountSequence: number; nickname: string; avatarUrl: string | null; }