Files
immich/server/src/dtos/memory.dto.ts
Michel Heusschen b73f7fe16f refactor: deduplicate MemoryType and ReactionType enums (#11479)
* refactor: deduplicate memorytype and reactiontype enums

* fix mobile
2024-07-31 12:08:31 -05:00

86 lines
2.0 KiB
TypeScript

import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsEnum, IsInt, IsObject, IsPositive, ValidateNested } from 'class-validator';
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
import { MemoryEntity, MemoryType } from 'src/entities/memory.entity';
import { ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation';
class MemoryBaseDto {
@ValidateBoolean({ optional: true })
isSaved?: boolean;
@ValidateDate({ optional: true })
seenAt?: Date;
}
class OnThisDayDto {
@IsInt()
@IsPositive()
year!: number;
}
type MemoryData = OnThisDayDto;
export class MemoryUpdateDto extends MemoryBaseDto {
@ValidateDate({ optional: true })
memoryAt?: Date;
}
export class MemoryCreateDto extends MemoryBaseDto {
@IsEnum(MemoryType)
@ApiProperty({ enum: MemoryType, enumName: 'MemoryType' })
type!: MemoryType;
@IsObject()
@ValidateNested()
@Type((options) => {
switch (options?.object.type) {
case MemoryType.ON_THIS_DAY: {
return OnThisDayDto;
}
default: {
return Object;
}
}
})
data!: MemoryData;
@ValidateDate()
memoryAt!: Date;
@ValidateUUID({ optional: true, each: true })
assetIds?: string[];
}
export class MemoryResponseDto {
id!: string;
createdAt!: Date;
updatedAt!: Date;
deletedAt?: Date;
memoryAt!: Date;
seenAt?: Date;
ownerId!: string;
@ApiProperty({ enumName: 'MemoryType', enum: MemoryType })
type!: MemoryType;
data!: MemoryData;
isSaved!: boolean;
assets!: AssetResponseDto[];
}
export const mapMemory = (entity: MemoryEntity): MemoryResponseDto => {
return {
id: entity.id,
createdAt: entity.createdAt,
updatedAt: entity.updatedAt,
deletedAt: entity.deletedAt,
memoryAt: entity.memoryAt,
seenAt: entity.seenAt,
ownerId: entity.ownerId,
type: entity.type,
data: entity.data,
isSaved: entity.isSaved,
assets: entity.assets.map((asset) => mapAsset(asset)),
};
};