mirror of
https://github.com/KevinMidboe/immich.git
synced 2026-01-04 16:25:50 +00:00
* Person birth date (data layer) * Person birth date (data layer) * Person birth date (service layer) * Person birth date (service layer, API) * Person birth date (service layer, API) * Person birth date (UI) (wip) * Person birth date (UI) (wip) * Person birth date (UI) (wip) * Person birth date (UI) (wip) * UI: Use "date of birth" everywhere * UI: better modal dialog Similar to the API key modal. * UI: set date of birth from people page * Use typed events for modal dispatcher * Date of birth tests (wip) * Regenerate API * Code formatting * Fix Svelte typing * Fix Svelte typing * Fix person model [skip ci] * Minor refactoring [skip ci] * Typed event dispatcher [skip ci] * Refactor typed event dispatcher [skip ci] * Fix unchanged birthdate check [skip ci] * Remove unnecessary custom transformer [skip ci] * PersonUpdate: call search index update job only when needed * Regenerate API * Code formatting * Fix tests * Fix DTO * Regenerate API * chore: verbiage and view mode * feat: show current age * test: person e2e * fix: show name for birth date selection --------- Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
138 lines
2.4 KiB
TypeScript
138 lines
2.4 KiB
TypeScript
import { AssetFaceEntity, PersonEntity } from '@app/infra/entities';
|
|
import { ApiProperty } from '@nestjs/swagger';
|
|
import { Transform, Type } from 'class-transformer';
|
|
import {
|
|
IsArray,
|
|
IsBoolean,
|
|
IsDate,
|
|
IsNotEmpty,
|
|
IsOptional,
|
|
IsString,
|
|
ValidateIf,
|
|
ValidateNested,
|
|
} from 'class-validator';
|
|
import { toBoolean, ValidateUUID } from '../domain.util';
|
|
|
|
export class PersonUpdateDto {
|
|
/**
|
|
* Person name.
|
|
*/
|
|
@IsOptional()
|
|
@IsString()
|
|
name?: string;
|
|
|
|
/**
|
|
* Person date of birth.
|
|
*/
|
|
@IsOptional()
|
|
@IsDate()
|
|
@Type(() => Date)
|
|
@ValidateIf((value) => value !== null)
|
|
@ApiProperty({ format: 'date' })
|
|
birthDate?: Date | null;
|
|
|
|
/**
|
|
* Asset is used to get the feature face thumbnail.
|
|
*/
|
|
@IsOptional()
|
|
@IsString()
|
|
featureFaceAssetId?: string;
|
|
|
|
/**
|
|
* Person visibility
|
|
*/
|
|
@IsOptional()
|
|
@IsBoolean()
|
|
isHidden?: boolean;
|
|
}
|
|
|
|
export class PeopleUpdateDto {
|
|
@IsArray()
|
|
@ValidateNested({ each: true })
|
|
@Type(() => PeopleUpdateItem)
|
|
people!: PeopleUpdateItem[];
|
|
}
|
|
|
|
export class PeopleUpdateItem {
|
|
/**
|
|
* Person id.
|
|
*/
|
|
@IsString()
|
|
@IsNotEmpty()
|
|
id!: string;
|
|
|
|
/**
|
|
* Person name.
|
|
*/
|
|
@IsOptional()
|
|
@IsString()
|
|
name?: string;
|
|
|
|
/**
|
|
* Person date of birth.
|
|
*/
|
|
@IsOptional()
|
|
@IsDate()
|
|
@Type(() => Date)
|
|
@ApiProperty({ format: 'date' })
|
|
birthDate?: Date | null;
|
|
|
|
/**
|
|
* Asset is used to get the feature face thumbnail.
|
|
*/
|
|
@IsOptional()
|
|
@IsString()
|
|
featureFaceAssetId?: string;
|
|
|
|
/**
|
|
* Person visibility
|
|
*/
|
|
@IsOptional()
|
|
@IsBoolean()
|
|
isHidden?: boolean;
|
|
}
|
|
|
|
export class MergePersonDto {
|
|
@ValidateUUID({ each: true })
|
|
ids!: string[];
|
|
}
|
|
|
|
export class PersonSearchDto {
|
|
@IsBoolean()
|
|
@Transform(toBoolean)
|
|
withHidden?: boolean = false;
|
|
}
|
|
|
|
export class PersonResponseDto {
|
|
id!: string;
|
|
name!: string;
|
|
@ApiProperty({ format: 'date' })
|
|
birthDate!: Date | null;
|
|
thumbnailPath!: string;
|
|
isHidden!: boolean;
|
|
}
|
|
|
|
export class PeopleResponseDto {
|
|
@ApiProperty({ type: 'integer' })
|
|
total!: number;
|
|
|
|
@ApiProperty({ type: 'integer' })
|
|
visible!: number;
|
|
|
|
people!: PersonResponseDto[];
|
|
}
|
|
|
|
export function mapPerson(person: PersonEntity): PersonResponseDto {
|
|
return {
|
|
id: person.id,
|
|
name: person.name,
|
|
birthDate: person.birthDate,
|
|
thumbnailPath: person.thumbnailPath,
|
|
isHidden: person.isHidden,
|
|
};
|
|
}
|
|
|
|
export function mapFace(face: AssetFaceEntity): PersonResponseDto {
|
|
return mapPerson(face.person);
|
|
}
|