profile avatar

This commit is contained in:
2026-07-10 13:50:25 +03:30
parent cefd42de17
commit 42f08397a2
6 changed files with 59 additions and 15 deletions
+9 -9
View File
@@ -39,6 +39,7 @@ export interface AuthTokensResponse {
lastName: string; lastName: string;
mobile: string; mobile: string;
role: UserRole; role: UserRole;
avatarUrl: string | null;
}; };
} }
@@ -403,13 +404,7 @@ export class AuthService {
const user = await this.usersService.findOne(authUser.id); const user = await this.usersService.findOne(authUser.id);
const response: MeResponse = { const response: MeResponse = {
user: { user: this.toAuthUserResponse(user),
id: user.id,
firstName: user.firstName,
lastName: user.lastName,
mobile: user.mobile,
role: user.role,
},
}; };
if (user.role === UserRole.SALON) { if (user.role === UserRole.SALON) {
@@ -477,13 +472,18 @@ export class AuthService {
return { return {
accessToken, accessToken,
refreshToken, refreshToken,
user: { user: this.toAuthUserResponse(user),
};
}
private toAuthUserResponse(user: User): AuthTokensResponse['user'] {
return {
id: user.id, id: user.id,
firstName: user.firstName, firstName: user.firstName,
lastName: user.lastName, lastName: user.lastName,
mobile: user.mobile, mobile: user.mobile,
role: user.role, role: user.role,
}, avatarUrl: user.avatarUrl ?? null,
}; };
} }
+3
View File
@@ -16,6 +16,9 @@ class AuthUserResponseDto {
@ApiProperty({ enum: UserRole }) @ApiProperty({ enum: UserRole })
role: UserRole; role: UserRole;
@ApiProperty({ nullable: true, required: false })
avatarUrl?: string | null;
} }
export class AuthTokensResponseDto { export class AuthTokensResponseDto {
+3
View File
@@ -18,6 +18,9 @@ class MeUserResponseDto {
@ApiProperty({ enum: UserRole }) @ApiProperty({ enum: UserRole })
role: UserRole; role: UserRole;
@ApiPropertyOptional({ nullable: true })
avatarUrl?: string | null;
} }
export class MeResponseDto { export class MeResponseDto {
@@ -0,0 +1,21 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
export class AddUserAvatarUrl1722200000000 implements MigrationInterface {
name = 'AddUserAvatarUrl1722200000000';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumn(
'users',
new TableColumn({
name: 'avatarUrl',
type: 'varchar',
length: '500',
isNullable: true,
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumn('users', 'avatarUrl');
}
}
+15 -1
View File
@@ -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'; import { UserRole } from '../enums/user-role.enum';
export class UpdateUserDto { export class UpdateUserDto {
@@ -19,4 +27,10 @@ export class UpdateUserDto {
@IsOptional() @IsOptional()
@IsEnum(UserRole) @IsEnum(UserRole)
role?: UserRole; role?: UserRole;
@IsOptional()
@ValidateIf((_, value) => value !== null)
@IsString()
@IsUrl()
avatarUrl?: string | null;
} }
+3
View File
@@ -24,6 +24,9 @@ export class User {
@Column({ type: 'enum', enum: UserRole, default: UserRole.CUSTOMER }) @Column({ type: 'enum', enum: UserRole, default: UserRole.CUSTOMER })
role: UserRole; role: UserRole;
@Column({ type: 'varchar', length: 500, nullable: true })
avatarUrl: string | null;
@CreateDateColumn() @CreateDateColumn()
createdAt: Date; createdAt: Date;