/** * 用户数据映射器 * 负责 User 模型与 API 响应、数据库记录之间的转换 */ import { UserModel } from '../models'; import type { UserDTO, User } from '../../types/dto'; // 数据库用户记录类型 export interface UserDbRecord { id: string; data: string; updatedAt: string; } export class UserMapper { /** * 将 API DTO 转换为应用模型 */ static fromDTO(dto: UserDTO): UserModel { return { id: String(dto.id || ''), username: dto.username || '', nickname: dto.nickname, avatar: dto.avatar, bio: dto.bio, website: dto.website, location: dto.location, email: dto.email, phone: dto.phone, followersCount: dto.followers_count, followingCount: dto.following_count, postsCount: dto.posts_count, isFollowing: dto.is_following, isBlocked: dto.is_blocked, createdAt: dto.created_at ? new Date(dto.created_at) : undefined, updatedAt: dto.updated_at ? new Date(dto.updated_at) : undefined, }; } /** * 将 User 类型转换为应用模型 */ static fromUser(user: User): UserModel { return { id: String(user.id || ''), username: user.username || '', nickname: user.nickname, avatar: user.avatar, bio: user.bio, website: user.website, location: user.location, email: user.email, phone: user.phone, followersCount: user.followers_count, followingCount: user.following_count, postsCount: user.posts_count, isFollowing: user.is_following, isBlocked: user.is_blocked, createdAt: user.created_at ? new Date(user.created_at) : undefined, updatedAt: user.updated_at ? new Date(user.updated_at) : undefined, }; } /** * 将 DTO 数组转换为应用模型数组 */ static fromDTOList(dtos: UserDTO[]): UserModel[] { return dtos.map(dto => this.fromDTO(dto)); } /** * 从数据库记录转换为应用模型 */ static fromDbRecord(record: UserDbRecord): UserModel | null { try { const data = JSON.parse(record.data) as UserDTO; return this.fromDTO(data); } catch { return null; } } /** * 将应用模型转换为数据库记录 */ static toDbRecord(model: UserModel): UserDbRecord { const dto: UserDTO = { id: model.id, username: model.username, nickname: model.nickname, avatar: model.avatar, bio: model.bio, website: model.website, location: model.location, email: model.email, phone: model.phone, followers_count: model.followersCount, following_count: model.followingCount, posts_count: model.postsCount, is_following: model.isFollowing, is_blocked: model.isBlocked, created_at: model.createdAt?.toISOString(), updated_at: model.updatedAt?.toISOString(), }; return { id: model.id, data: JSON.stringify(dto), updatedAt: new Date().toISOString(), }; } /** * 将应用模型转换为 API 请求数据 */ static toApiRequest(model: Partial): Record { const request: Record = {}; if (model.nickname !== undefined) { request.nickname = model.nickname; } if (model.avatar !== undefined) { request.avatar = model.avatar; } if (model.bio !== undefined) { request.bio = model.bio; } if (model.website !== undefined) { request.website = model.website; } if (model.location !== undefined) { request.location = model.location; } if (model.phone !== undefined) { request.phone = model.phone; } if (model.email !== undefined) { request.email = model.email; } return request; } /** * 将应用模型转换为 DTO */ static toDTO(model: UserModel): UserDTO { return { id: model.id, username: model.username, nickname: model.nickname, avatar: model.avatar, bio: model.bio, website: model.website, location: model.location, email: model.email, phone: model.phone, followers_count: model.followersCount, following_count: model.followingCount, posts_count: model.postsCount, is_following: model.isFollowing, is_blocked: model.isBlocked, created_at: model.createdAt?.toISOString(), updated_at: model.updatedAt?.toISOString(), }; } }