diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 5c27d33..b1463d6 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -39,6 +39,7 @@ export interface AuthTokensResponse { lastName: string; mobile: string; role: UserRole; + avatarUrl: string | null; }; } @@ -403,13 +404,7 @@ export class AuthService { const user = await this.usersService.findOne(authUser.id); const response: MeResponse = { - user: { - id: user.id, - firstName: user.firstName, - lastName: user.lastName, - mobile: user.mobile, - role: user.role, - }, + user: this.toAuthUserResponse(user), }; if (user.role === UserRole.SALON) { @@ -477,13 +472,18 @@ export class AuthService { return { accessToken, refreshToken, - user: { - id: user.id, - firstName: user.firstName, - lastName: user.lastName, - mobile: user.mobile, - role: user.role, - }, + user: this.toAuthUserResponse(user), + }; + } + + private toAuthUserResponse(user: User): AuthTokensResponse['user'] { + return { + id: user.id, + firstName: user.firstName, + lastName: user.lastName, + mobile: user.mobile, + role: user.role, + avatarUrl: user.avatarUrl ?? null, }; } diff --git a/src/auth/dto/auth-tokens-response.dto.ts b/src/auth/dto/auth-tokens-response.dto.ts index 8efac9d..a164284 100644 --- a/src/auth/dto/auth-tokens-response.dto.ts +++ b/src/auth/dto/auth-tokens-response.dto.ts @@ -16,6 +16,9 @@ class AuthUserResponseDto { @ApiProperty({ enum: UserRole }) role: UserRole; + + @ApiProperty({ nullable: true, required: false }) + avatarUrl?: string | null; } export class AuthTokensResponseDto { diff --git a/src/auth/dto/me-response.dto.ts b/src/auth/dto/me-response.dto.ts index aea0bba..c1accfa 100644 --- a/src/auth/dto/me-response.dto.ts +++ b/src/auth/dto/me-response.dto.ts @@ -18,6 +18,9 @@ class MeUserResponseDto { @ApiProperty({ enum: UserRole }) role: UserRole; + + @ApiPropertyOptional({ nullable: true }) + avatarUrl?: string | null; } export class MeResponseDto { diff --git a/src/database/migrations/1722200000000-AddUserAvatarUrl.ts b/src/database/migrations/1722200000000-AddUserAvatarUrl.ts new file mode 100644 index 0000000..a5dbd0f --- /dev/null +++ b/src/database/migrations/1722200000000-AddUserAvatarUrl.ts @@ -0,0 +1,21 @@ +import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; + +export class AddUserAvatarUrl1722200000000 implements MigrationInterface { + name = 'AddUserAvatarUrl1722200000000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.addColumn( + 'users', + new TableColumn({ + name: 'avatarUrl', + type: 'varchar', + length: '500', + isNullable: true, + }), + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.dropColumn('users', 'avatarUrl'); + } +} diff --git a/src/users/dto/update-user.dto.ts b/src/users/dto/update-user.dto.ts index 56f1bb5..dc0f0b5 100644 --- a/src/users/dto/update-user.dto.ts +++ b/src/users/dto/update-user.dto.ts @@ -1,4 +1,12 @@ -import { IsEnum, IsOptional, IsString, Length, Matches } from 'class-validator'; +import { + IsEnum, + IsOptional, + IsString, + IsUrl, + Length, + Matches, + ValidateIf, +} from 'class-validator'; import { UserRole } from '../enums/user-role.enum'; export class UpdateUserDto { @@ -19,4 +27,10 @@ export class UpdateUserDto { @IsOptional() @IsEnum(UserRole) role?: UserRole; + + @IsOptional() + @ValidateIf((_, value) => value !== null) + @IsString() + @IsUrl() + avatarUrl?: string | null; } diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index c4a09aa..a64c83f 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -24,6 +24,9 @@ export class User { @Column({ type: 'enum', enum: UserRole, default: UserRole.CUSTOMER }) role: UserRole; + @Column({ type: 'varchar', length: 500, nullable: true }) + avatarUrl: string | null; + @CreateDateColumn() createdAt: Date;