import type { BaseMapper } from "@cv/system"; import { Injectable } from "@nestjs/common"; import type { Prisma } from "@prisma/client"; import { CredentialsMapper } from "./credentials.mapper"; import { User, UserRole } from "./user.entity"; type PrismaUserWithCredentials = Prisma.UserGetPayload<{ include: { credentials: true }; }>; @Injectable() export class UserMapper implements BaseMapper { constructor(private readonly credentialsMapper: CredentialsMapper) {} toDomain(prismaUser: null): null; toDomain(prismaUser: PrismaUserWithCredentials): User; toDomain(prismaUser: PrismaUserWithCredentials | null): User | null; toDomain(prismaUser: PrismaUserWithCredentials | null): User | null { if (prismaUser === null) { return null; } const credentials = prismaUser.credentials ? this.credentialsMapper.toDomain(prismaUser.credentials) : null; return new User( prismaUser.id, prismaUser.name, prismaUser.createdAt, prismaUser.updatedAt, credentials, prismaUser.role as UserRole, ); } mapToDomain(prismaUsers: PrismaUserWithCredentials[]): User[] { return prismaUsers.map((user) => this.toDomain(user)); } }