From 5ca048c10efcfff6feea12da5d1f0d8f8fb50a82 Mon Sep 17 00:00:00 2001 From: CapoMK25 Date: Fri, 30 Jan 2026 19:11:09 +0200 Subject: [PATCH 1/2] Changed the tests to reflect changes --- .../data/player/createPlayerDtoBuilder.ts | 18 +++++++++--------- .../player/data/player/playerBuilder.ts | 18 +++++++++--------- .../player/data/player/playerDtoBuilder.ts | 18 +++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/__tests__/player/data/player/createPlayerDtoBuilder.ts b/src/__tests__/player/data/player/createPlayerDtoBuilder.ts index 247b855e9..7f9109153 100644 --- a/src/__tests__/player/data/player/createPlayerDtoBuilder.ts +++ b/src/__tests__/player/data/player/createPlayerDtoBuilder.ts @@ -16,15 +16,15 @@ export default class CreatePlayerDtoBuilder profile_id: undefined, battleCharacter_ids: [], avatar: { - head: 1, - hair: 1, - eyes: 1, - nose: 1, - mouth: 1, - eyebrows: 1, - clothes: 1, - feet: 1, - hands: 1, + head: { id: 1, color: '#ffffff' }, + hair: { id: 1, color: '#ffffff' }, + eyes: { id: 1, color: '#ffffff' }, + nose: { id: 1, color: '#ffffff' }, + mouth: { id: 1, color: '#ffffff' }, + eyebrows: { id: 1, color: '#ffffff' }, + clothes: { id: 1, color: '#ffffff' }, + feet: { id: 1, color: '#ffffff' }, + hands: { id: 1, color: '#ffffff' }, skinColor: '#f5cba7', }, }; diff --git a/src/__tests__/player/data/player/playerBuilder.ts b/src/__tests__/player/data/player/playerBuilder.ts index ae124177c..e6d95e9bf 100644 --- a/src/__tests__/player/data/player/playerBuilder.ts +++ b/src/__tests__/player/data/player/playerBuilder.ts @@ -23,15 +23,15 @@ export default class PlayerBuilder { clan_id: undefined, battleCharacter_ids: [], avatar: { - head: 1, - hair: 1, - eyes: 1, - nose: 1, - mouth: 1, - eyebrows: 1, - clothes: 1, - feet: 1, - hands: 1, + head: { id: 1, color: '#ff0000' }, + hair: { id: 1, color: '#ff0000' }, + eyes: { id: 1, color: '#ff0000' }, + nose: { id: 1, color: '#ff0000' }, + mouth: { id: 1, color: '#ff0000' }, + eyebrows: { id: 1, color: '#ff0000' }, + clothes: { id: 1, color: '#ff0000' }, + feet: { id: 1, color: '#ff0000' }, + hands: { id: 1, color: '#ff0000' }, skinColor: '#f5cba7', }, clanRole_id: null, diff --git a/src/__tests__/player/data/player/playerDtoBuilder.ts b/src/__tests__/player/data/player/playerDtoBuilder.ts index 6d98df0fd..4e667e0c0 100644 --- a/src/__tests__/player/data/player/playerDtoBuilder.ts +++ b/src/__tests__/player/data/player/playerDtoBuilder.ts @@ -17,15 +17,15 @@ export default class PlayerDtoBuilder implements IDataBuilder { parentalAuth: false, currentAvatarId: 101, avatar: { - head: 1, - hair: 1, - eyes: 1, - nose: 1, - mouth: 1, - eyebrows: 1, - clothes: 1, - feet: 1, - hands: 1, + head: { id: 1, color: '#ffffff' }, + hair: { id: 1, color: '#ffffff' }, + eyes: { id: 1, color: '#ffffff' }, + nose: { id: 1, color: '#ffffff' }, + mouth: { id: 1, color: '#ffffff' }, + eyebrows: { id: 1, color: '#ffffff' }, + clothes: { id: 1, color: '#ffffff' }, + feet: { id: 1, color: '#ffffff' }, + hands: { id: 1, color: '#ffffff' }, skinColor: '#f5cba7', }, gameStatistics: { From 57962ad1be7a2ce534d81399f20e9f2c7cbdf1ef Mon Sep 17 00:00:00 2001 From: CapoMK25 Date: Fri, 30 Jan 2026 19:12:55 +0200 Subject: [PATCH 2/2] Refactored the player avatar --- src/player/dto/avatar.dto.ts | 96 ++++++++++----------- src/player/dto/modifyAvatar.dto.ts | 125 +++++++++++----------------- src/player/player.controller.ts | 2 +- src/player/schemas/avatar.schema.ts | 46 ++++++---- 4 files changed, 123 insertions(+), 146 deletions(-) diff --git a/src/player/dto/avatar.dto.ts b/src/player/dto/avatar.dto.ts index 006ca0fb4..7a2a3b496 100644 --- a/src/player/dto/avatar.dto.ts +++ b/src/player/dto/avatar.dto.ts @@ -1,83 +1,75 @@ -import { Expose } from 'class-transformer'; +import { Expose, Type } from 'class-transformer'; +import { IsNumber, IsHexColor, ValidateNested } from 'class-validator'; -export class AvatarDto { +export class AvatarPieceDto { /** - * Head variant identifier - * + * Piece identifier * @example 1 */ @Expose() - head: number; + @IsNumber() + id: number; /** - * Hairstyle identifier - * - * @example 2 + * Piece color in HEX format + * @example "#ff0000" */ @Expose() - hair: number; + @IsHexColor() + color: string; +} - /** - * Eye style identifier - * - * @example 3 - */ +export class AvatarDto { @Expose() - eyes: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + head: AvatarPieceDto; - /** - * Nose style identifier - * - * @example 1 - */ @Expose() - nose: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + hair: AvatarPieceDto; - /** - * Mouth style identifier - * - * @example 2 - */ @Expose() - mouth: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + eyes: AvatarPieceDto; - /** - * Eyebrows style identifier - * - * @example 1 - */ @Expose() - eyebrows: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + nose: AvatarPieceDto; - /** - * Clothes identifier - * - * @example 4 - */ @Expose() - clothes: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + mouth: AvatarPieceDto; - /** - * Feet (footwear) identifier - * - * @example 1 - */ @Expose() - feet: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + eyebrows: AvatarPieceDto; + + @Expose() + @ValidateNested() + @Type(() => AvatarPieceDto) + clothes: AvatarPieceDto; + + @Expose() + @ValidateNested() + @Type(() => AvatarPieceDto) + feet: AvatarPieceDto; - /** - * Hands (gloves, etc.) identifier - * - * @example 2 - */ @Expose() - hands: number; + @ValidateNested() + @Type(() => AvatarPieceDto) + hands: AvatarPieceDto; /** * Avatar skin color in HEX format - * * @example "#FAD9B5" */ @Expose() + @IsHexColor() skinColor: string; } diff --git a/src/player/dto/modifyAvatar.dto.ts b/src/player/dto/modifyAvatar.dto.ts index 2f0a34db6..0962b33c8 100644 --- a/src/player/dto/modifyAvatar.dto.ts +++ b/src/player/dto/modifyAvatar.dto.ts @@ -1,83 +1,58 @@ -import { IsInt, IsString } from 'class-validator'; +import { IsHexColor, IsOptional, ValidateNested } from 'class-validator'; +import { Type } from 'class-transformer'; +import { AvatarPieceDto } from './avatar.dto'; export class ModifyAvatarDto { - /** - * Head variant ID - * - * @example 1 - */ - @IsInt() - head: number; - - /** - * Hair style ID - * - * @example 3 - */ - @IsInt() - hair: number; - - /** - * Eyes style ID - * - * @example 2 - */ - @IsInt() - eyes: number; - - /** - * Nose style ID - * - * @example 1 - */ - @IsInt() - nose: number; - - /** - * Mouth style ID - * - * @example 2 - */ - @IsInt() - mouth: number; - - /** - * Eyebrows style ID - * - * @example 1 - */ - @IsInt() - eyebrows: number; - - /** - * Clothes set ID - * - * @example 4 - */ - @IsInt() - clothes: number; - - /** - * Feet (footwear) ID - * - * @example 1 - */ - @IsInt() - feet: number; - - /** - * Hands (gloves/accessories) ID - * - * @example 2 - */ - @IsInt() - hands: number; + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + head?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + hair?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + eyes?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + nose?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + mouth?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + eyebrows?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + clothes?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + feet?: AvatarPieceDto; + + @IsOptional() + @ValidateNested() + @Type(() => AvatarPieceDto) + hands?: AvatarPieceDto; /** * Skin color as a hex string - * * @example "#FAD9B5" */ - @IsString() - skinColor: string; + @IsOptional() + @IsHexColor() + skinColor?: string; } diff --git a/src/player/player.controller.ts b/src/player/player.controller.ts index 2e667d6a6..e8fe6b3c0 100644 --- a/src/player/player.controller.ts +++ b/src/player/player.controller.ts @@ -169,7 +169,7 @@ export default class PlayerController { player: PlayerDto, body: UpdatePlayerDto, ) { - if (player?.avatar?.clothes !== body?.avatar?.clothes) { + if (player?.avatar?.clothes?.id !== body?.avatar?.clothes?.id) { this.emitterService.EmitNewDailyTaskEvent( body._id, ServerTaskName.CHANGE_AVATAR_CLOTHES, diff --git a/src/player/schemas/avatar.schema.ts b/src/player/schemas/avatar.schema.ts index 2cf1b3b4c..9e8fba95b 100644 --- a/src/player/schemas/avatar.schema.ts +++ b/src/player/schemas/avatar.schema.ts @@ -1,4 +1,14 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +@Schema({ _id: false }) +export class AvatarPiece { + @Prop({ type: Number, required: true }) + id: number; + + @Prop({ type: String, required: true }) + color: string; +} + +const AvatarPieceSchema = SchemaFactory.createForClass(AvatarPiece); @Schema({ toJSON: { virtuals: true }, @@ -6,32 +16,32 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; _id: false, }) export class Avatar { - @Prop({ type: Number, required: true }) - head: number; + @Prop({ type: AvatarPieceSchema, required: true }) + head: AvatarPiece; - @Prop({ type: Number, required: true }) - hair: number; + @Prop({ type: AvatarPieceSchema, required: true }) + hair: AvatarPiece; - @Prop({ type: Number, required: true }) - eyes: number; + @Prop({ type: AvatarPieceSchema, required: true }) + eyes: AvatarPiece; - @Prop({ type: Number, required: true }) - nose: number; + @Prop({ type: AvatarPieceSchema, required: true }) + nose: AvatarPiece; - @Prop({ type: Number, required: true }) - mouth: number; + @Prop({ type: AvatarPieceSchema, required: true }) + mouth: AvatarPiece; - @Prop({ type: Number, required: true }) - eyebrows: number; + @Prop({ type: AvatarPieceSchema, required: true }) + eyebrows: AvatarPiece; - @Prop({ type: Number, required: true }) - clothes: number; + @Prop({ type: AvatarPieceSchema, required: true }) + clothes: AvatarPiece; - @Prop({ type: Number, required: true }) - feet: number; + @Prop({ type: AvatarPieceSchema, required: true }) + feet: AvatarPiece; - @Prop({ type: Number, required: true }) - hands: number; + @Prop({ type: AvatarPieceSchema, required: true }) + hands: AvatarPiece; @Prop({ type: String, required: true }) skinColor: string;