import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEmail, IsNotEmpty, IsString, MinLength } from 'class-validator'; import { APIKeyEntity } from 'src/entities/api-key.entity'; import { SharedLinkEntity } from 'src/entities/shared-link.entity'; import { UserTokenEntity } from 'src/entities/user-token.entity'; import { UserEntity } from 'src/entities/user.entity'; export class AuthDto { user!: UserEntity; apiKey?: APIKeyEntity; sharedLink?: SharedLinkEntity; userToken?: UserTokenEntity; } export class LoginCredentialDto { @IsEmail({ require_tld: false }) @Transform(({ value }) => value?.toLowerCase()) @IsNotEmpty() @ApiProperty({ example: 'testuser@email.com' }) email!: string; @IsString() @IsNotEmpty() @ApiProperty({ example: 'password' }) password!: string; } export class LoginResponseDto { accessToken!: string; userId!: string; userEmail!: string; name!: string; profileImagePath!: string; isAdmin!: boolean; shouldChangePassword!: boolean; } export function mapLoginResponse(entity: UserEntity, accessToken: string): LoginResponseDto { return { accessToken: accessToken, userId: entity.id, userEmail: entity.email, name: entity.name, isAdmin: entity.isAdmin, profileImagePath: entity.profileImagePath, shouldChangePassword: entity.shouldChangePassword, }; } export class LogoutResponseDto { successful!: boolean; redirectUri!: string; } export class SignUpDto extends LoginCredentialDto { @IsString() @IsNotEmpty() @ApiProperty({ example: 'Admin' }) name!: string; } export class ChangePasswordDto { @IsString() @IsNotEmpty() @ApiProperty({ example: 'password' }) password!: string; @IsString() @IsNotEmpty() @MinLength(8) @ApiProperty({ example: 'password' }) newPassword!: string; } export class ValidateAccessTokenResponseDto { authStatus!: boolean; } export class AuthDeviceResponseDto { id!: string; createdAt!: string; updatedAt!: string; current!: boolean; deviceType!: string; deviceOS!: string; } export const mapUserToken = (entity: UserTokenEntity, currentId?: string): AuthDeviceResponseDto => ({ id: entity.id, createdAt: entity.createdAt.toISOString(), updatedAt: entity.updatedAt.toISOString(), current: currentId === entity.id, deviceOS: entity.deviceOS, deviceType: entity.deviceType, }); export class OAuthCallbackDto { @IsNotEmpty() @IsString() @ApiProperty() url!: string; } export class OAuthConfigDto { @IsNotEmpty() @IsString() redirectUri!: string; } export class OAuthAuthorizeResponseDto { url!: string; }