64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
/**
|
|
* 用户 DTO
|
|
*/
|
|
import {
|
|
UserSchema,
|
|
type UserInput,
|
|
type UserData,
|
|
} from "@/data/schemas/user/user";
|
|
import { PersonalityTraits } from "./personality_traits";
|
|
|
|
export class User {
|
|
declare readonly id: string;
|
|
declare readonly username: string;
|
|
declare readonly email: string;
|
|
declare readonly platform: string;
|
|
declare readonly country: string;
|
|
declare readonly countryCode: string;
|
|
declare readonly intimacy: number;
|
|
declare readonly dolBalance: number;
|
|
declare readonly creditBalance: number;
|
|
declare readonly dailyFreeChatLimit: number;
|
|
declare readonly dailyFreeChatUsed: number;
|
|
declare readonly dailyFreeChatRemaining: number;
|
|
declare readonly dailyFreePrivateLimit: number;
|
|
declare readonly dailyFreePrivateUsed: number;
|
|
declare readonly dailyFreePrivateRemaining: number;
|
|
declare readonly personalityTraits: PersonalityTraits;
|
|
declare readonly preferredLanguage: string;
|
|
declare readonly createdAt: string;
|
|
declare readonly lastMessageAt: string;
|
|
|
|
private constructor(input: UserInput) {
|
|
const data = UserSchema.parse(input);
|
|
Object.assign(this, {
|
|
...data,
|
|
personalityTraits: PersonalityTraits.from(data.personalityTraits),
|
|
});
|
|
Object.freeze(this);
|
|
}
|
|
|
|
static from(input: UserInput): User {
|
|
return new User(input);
|
|
}
|
|
|
|
static fromJson(json: unknown): User {
|
|
return User.from(json as UserInput);
|
|
}
|
|
|
|
/**
|
|
* 创建一个具有空 id/username 的 User 实例(用于可选 user 字段的默认占位)
|
|
*/
|
|
static empty(): User {
|
|
return new User({ id: "", username: "" });
|
|
}
|
|
|
|
toJson(): UserData {
|
|
const { personalityTraits, ...rest } = this;
|
|
return {
|
|
...rest,
|
|
personalityTraits: personalityTraits.toJson(),
|
|
};
|
|
}
|
|
}
|