refactor(models): migrate 28 data models to Zod schema-driven pattern

This commit is contained in:
2026-06-08 14:50:20 +08:00
parent 700ad0bc1a
commit d7943f5f06
36 changed files with 1204 additions and 1358 deletions
+23 -23
View File
@@ -1,35 +1,35 @@
/**
* 头像数据模型 - 对应后端 AvatarData schema
* 原始 Dart: AvatarData (lib/data/models/user/user.dart)
*
* 注:原始 Dart 中 `avatarUrl` 为 `String?`,按"全部非空"约定兜底为空串。
*/
export class AvatarData {
readonly avatarUrl: string;
readonly userId: string;
import { z } from "zod";
constructor(params: { avatarUrl?: string; userId: string }) {
this.avatarUrl = params.avatarUrl ?? "";
this.userId = params.userId;
export const AvatarDataSchema = z.object({
avatarUrl: z.string().default(""),
userId: z.string(),
});
export type AvatarDataInput = z.input<typeof AvatarDataSchema>;
export type AvatarDataData = z.output<typeof AvatarDataSchema>;
export class AvatarData {
declare readonly avatarUrl: string;
declare readonly userId: string;
private constructor(data: AvatarDataData) {
Object.assign(this, data);
Object.freeze(this);
}
toJson(): Record<string, unknown> {
return {
avatarUrl: this.avatarUrl,
userId: this.userId,
};
static from(input: AvatarDataInput): AvatarData {
return new AvatarData(AvatarDataSchema.parse(input));
}
static fromJson(json: Record<string, unknown>): AvatarData {
const userId = json.userId;
if (typeof userId !== "string") {
throw new Error("AvatarData.userId is required and must be a string");
}
return new AvatarData({
userId,
avatarUrl:
typeof json.avatarUrl === "string" ? json.avatarUrl : undefined,
});
static fromJson(json: unknown): AvatarData {
return AvatarData.from(json as AvatarDataInput);
}
toJson(): AvatarDataData {
return AvatarDataSchema.parse(this);
}
}