import { AfterDeleteTrigger, Column, DeleteDateColumn, ForeignKeyColumn, Generated, Index, PrimaryGeneratedColumn, Table, Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators'; import { SourceType } from 'src/enum'; import { asset_face_source_type } from 'src/schema/enums'; import { asset_face_audit } from 'src/schema/functions'; import { AssetTable } from 'src/schema/tables/asset.table'; import { PersonTable } from 'src/schema/tables/person.table'; @Table({ name: 'asset_face' }) @UpdatedAtTrigger('asset_face_updatedAt') @AfterDeleteTrigger({ scope: 'statement', function: asset_face_audit, referencingOldTableAs: 'old', when: 'pg_trigger_depth() = 0', }) // schemaFromDatabase does not preserve column order @Index({ name: 'asset_face_assetId_personId_idx', columns: ['assetId', 'personId'] }) @Index({ name: 'asset_face_personId_assetId_notDeleted_isVisible_idx', columns: ['personId', 'assetId'], where: '"deletedAt" IS NULL AND "isVisible" IS TRUE', }) @Index({ columns: ['personId', 'assetId'] }) export class AssetFaceTable { @PrimaryGeneratedColumn() id!: Generated; @ForeignKeyColumn(() => AssetTable, { onDelete: 'CASCADE', onUpdate: 'CASCADE', // [assetId, personId] is the PK constraint index: false, }) assetId!: string; @ForeignKeyColumn(() => PersonTable, { onDelete: 'SET NULL', onUpdate: 'CASCADE', nullable: true, // [personId, assetId] makes this redundant index: false, }) personId!: string | null; @Column({ default: 0, type: 'integer' }) imageWidth!: Generated; @Column({ default: 0, type: 'integer' }) imageHeight!: Generated; @Column({ default: 0, type: 'integer' }) boundingBoxX1!: Generated; @Column({ default: 0, type: 'integer' }) boundingBoxY1!: Generated; @Column({ default: 0, type: 'integer' }) boundingBoxX2!: Generated; @Column({ default: 0, type: 'integer' }) boundingBoxY2!: Generated; @Column({ default: SourceType.MachineLearning, enum: asset_face_source_type }) sourceType!: Generated; @DeleteDateColumn() deletedAt!: Timestamp | null; @UpdateDateColumn() updatedAt!: Generated; @UpdateIdColumn() updateId!: Generated; @Column({ type: 'boolean', default: true }) isVisible!: Generated; }