import { User, UserStatus, UserAuthLevel } from '../entities/user.entity'; import { Company } from '../entities/company.entity'; import { CreateUserDto, UpdateUserDto, UserResponseDto, JwtTokenDto, LoginResponseDto, UserRequestDto, LoginRequestDto, RemoveUserDto, PasswordResetRequestDto, PasswordResetDto, EmailConfirmationDto, PremiumSubscriptionDto, CompanyRegistrationDto } from '../dto/user.dto'; export class UserMapper { static toEntity(createUserDto: CreateUserDto): User { const user = new User(); user.username = createUserDto.username; user.FirstName = createUserDto.FirstName; user.LastName = createUserDto.LastName; user.email = createUserDto.email; user.password = createUserDto.password; user.CompanyId = createUserDto.CompanyId; user.authLevel = createUserDto.authLevel || UserAuthLevel.STANDARD; user.status = createUserDto.status || UserStatus.PENDING_CONFIRMATION; return user; } static toResponseDto(user: User): UserResponseDto { const dto = new UserResponseDto(); dto.id = user.id; dto.guid = user.guid; dto.username = user.username; dto.FirstName = user.FirstName; dto.LastName = user.LastName; dto.email = user.email; dto.createdAt = user.createdAt; dto.updatedAt = user.updatedAt; dto.status = user.status; dto.authLevel = user.authLevel; dto.premiumExpirationDate = user.premiumExpirationDate; dto.CompanyId = user.CompanyId; dto.companyRegistered = user.companyRegistered; dto.companyRegistrationDate = user.companyRegistrationDate; return dto; } static toJwtTokenDto(user: User): JwtTokenDto { const dto = new JwtTokenDto(); dto.userId = user.id; dto.username = user.username; dto.companyId = user.CompanyId; dto.authLevel = user.authLevel; dto.status = user.status; return dto; } static toLoginResponseDto(user: User, token: string): LoginResponseDto { const dto = new LoginResponseDto(); dto.username = user.username; dto.id = user.id; dto.companyId = user.CompanyId; dto.authLevel = user.authLevel; dto.status = user.status; dto.token = token; return dto; } static updateEntity(user: User, updateUserDto: UpdateUserDto): User { if (updateUserDto.username !== undefined) user.username = updateUserDto.username; if (updateUserDto.FirstName !== undefined) user.FirstName = updateUserDto.FirstName; if (updateUserDto.LastName !== undefined) user.LastName = updateUserDto.LastName; if (updateUserDto.email !== undefined) user.email = updateUserDto.email; if (updateUserDto.password !== undefined) user.password = updateUserDto.password; if (updateUserDto.status !== undefined) user.status = updateUserDto.status; if (updateUserDto.authLevel !== undefined) user.authLevel = updateUserDto.authLevel; if (updateUserDto.securityToken !== undefined) user.securityToken = updateUserDto.securityToken; if (updateUserDto.securityTokenExpiry !== undefined) user.securityTokenExpiry = updateUserDto.securityTokenExpiry; if (updateUserDto.premiumExpirationDate !== undefined) user.premiumExpirationDate = updateUserDto.premiumExpirationDate; if (updateUserDto.CompanyId !== undefined) user.CompanyId = updateUserDto.CompanyId; if (updateUserDto.companyRegistered !== undefined) user.companyRegistered = updateUserDto.companyRegistered; if (updateUserDto.companyRegistrationDate !== undefined) user.companyRegistrationDate = updateUserDto.companyRegistrationDate; return user; } static toResponseDtoArray(users: User[]): UserResponseDto[] { return users.map(user => this.toResponseDto(user)); } static toQueryParams(requestDto: UserRequestDto): any { const params: any = {}; if (requestDto.guid) params.guid = requestDto.guid; if (requestDto.username) params.username = requestDto.username; if (requestDto.email) params.email = requestDto.email; if (requestDto.status !== undefined) params.status = requestDto.status; if (requestDto.authLevel !== undefined) params.authLevel = requestDto.authLevel; if (requestDto.CompanyId) params.CompanyId = requestDto.CompanyId; if (requestDto.companyRegistered !== undefined) params.companyRegistered = requestDto.companyRegistered; return params; } static canMapToResponse(user: User): boolean { return user.status !== UserStatus.DELETED; } static toPublicResponseDto(user: User): Partial { const dto = this.toResponseDto(user); const publicDto: Partial = { ...dto }; delete publicDto.email; delete publicDto.premiumExpirationDate; delete publicDto.companyRegistrationDate; return publicDto; } }