···11+import { Injectable } from "@nestjs/common";
22+import type { User as PrismaUser } from "@prisma/client";
33+import type { BaseMapper } from "@/modules/base/mapper.interface";
44+import { User } from "./user.entity";
55+66+/**
77+ * Mapper service for converting between Prisma User entities and domain User entities
88+ */
99+@Injectable()
1010+export class UserMapper implements BaseMapper<PrismaUser, User> {
1111+ /**
1212+ * Maps a Prisma User entity to a domain User entity
1313+ * Uses overloads to return the correct type based on input
1414+ */
1515+ toDomain(prismaUser: null): null;
1616+ toDomain(prismaUser: PrismaUser): User;
1717+ toDomain(prismaUser: PrismaUser | null): User | null;
1818+ toDomain(prismaUser: PrismaUser | null): User | null {
1919+ if (prismaUser === null) {
2020+ return null;
2121+ }
2222+ return new User(
2323+ prismaUser.id,
2424+ prismaUser.email,
2525+ prismaUser.name,
2626+ prismaUser.createdAt,
2727+ prismaUser.updatedAt,
2828+ );
2929+ }
3030+3131+ /**
3232+ * Maps an array of Prisma User entities to domain User entities
3333+ */
3434+ mapToDomain(prismaUsers: PrismaUser[]): User[] {
3535+ return prismaUsers.map((user) => this.toDomain(user));
3636+ }
3737+}
+12
apps/server/src/modules/user/user.module.ts
···11+import { Module } from "@nestjs/common";
22+import { DatabaseModule } from "@/modules/database/database.module";
33+import { UserSeedService } from "./seed/user.seed";
44+import { UserMapper } from "./user.mapper";
55+import { UserService } from "./user.service";
66+77+@Module({
88+ imports: [DatabaseModule],
99+ providers: [UserService, UserMapper, UserSeedService],
1010+ exports: [UserService, UserMapper],
1111+})
1212+export class UserModule {}