because I got bored of customising my CV for every job
1import type { BaseMapper } from "@cv/system";
2import { Injectable } from "@nestjs/common";
3import type { Prisma } from "@prisma/client";
4import { CredentialsMapper } from "./credentials.mapper";
5import { User, UserRole } from "./user.entity";
6
7type PrismaUserWithCredentials = Prisma.UserGetPayload<{
8 include: { credentials: true };
9}>;
10
11@Injectable()
12export class UserMapper implements BaseMapper<PrismaUserWithCredentials, User> {
13 constructor(private readonly credentialsMapper: CredentialsMapper) {}
14
15 toDomain(prismaUser: null): null;
16 toDomain(prismaUser: PrismaUserWithCredentials): User;
17 toDomain(prismaUser: PrismaUserWithCredentials | null): User | null;
18 toDomain(prismaUser: PrismaUserWithCredentials | null): User | null {
19 if (prismaUser === null) {
20 return null;
21 }
22 const credentials = prismaUser.credentials
23 ? this.credentialsMapper.toDomain(prismaUser.credentials)
24 : null;
25 return new User(
26 prismaUser.id,
27 prismaUser.name,
28 prismaUser.createdAt,
29 prismaUser.updatedAt,
30 credentials,
31 prismaUser.role as UserRole,
32 );
33 }
34
35 mapToDomain(prismaUsers: PrismaUserWithCredentials[]): User[] {
36 return prismaUsers.map((user) => this.toDomain(user));
37 }
38}