/** * 用户数据映射器 * 负责 User 模型与 API 响应、数据库记录之间的转换 */ import { UserModel } from '../../data/models'; import type { UserDTO } from '../../types/dto'; // 数据库用户记录类型 export interface UserDbRecord { id: string; data: string; updatedAt: string; } export class UserMapper { 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, createdAt: dto.created_at ? new Date(dto.created_at) : undefined, }; } 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 || '', cover_url: '', bio: model.bio || '', website: model.website || '', location: model.location || '', email: model.email, phone: model.phone, followers_count: model.followersCount || 0, following_count: model.followingCount || 0, posts_count: model.postsCount || 0, is_following: model.isFollowing, created_at: model.createdAt?.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 || '', cover_url: '', bio: model.bio || '', website: model.website || '', location: model.location || '', email: model.email, phone: model.phone, followers_count: model.followersCount || 0, following_count: model.followingCount || 0, posts_count: model.postsCount || 0, is_following: model.isFollowing, created_at: model.createdAt?.toISOString() || '', }; } }