mirror of
https://github.com/immich-app/immich.git
synced 2026-05-25 09:02:31 -04:00
90 lines
2.4 KiB
TypeScript
90 lines
2.4 KiB
TypeScript
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 { FaceClusterTable } from 'src/schema/tables/face-cluster.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_faceClusterId_idx', columns: ['assetId', 'faceClusterId'] })
|
|
@Index({
|
|
name: 'asset_face_faceClusterId_assetId_notDeleted_isVisible_idx',
|
|
columns: ['faceClusterId', 'assetId'],
|
|
where: '"deletedAt" IS NULL AND "isVisible" IS TRUE',
|
|
})
|
|
@Index({ columns: ['faceClusterId', 'assetId'] })
|
|
export class AssetFaceTable {
|
|
@PrimaryGeneratedColumn()
|
|
id!: Generated<string>;
|
|
|
|
@ForeignKeyColumn(() => AssetTable, {
|
|
onDelete: 'CASCADE',
|
|
onUpdate: 'CASCADE',
|
|
// [assetId, personId] is the PK constraint
|
|
index: false,
|
|
})
|
|
assetId!: string;
|
|
|
|
@ForeignKeyColumn(() => FaceClusterTable, {
|
|
onDelete: 'SET NULL',
|
|
onUpdate: 'CASCADE',
|
|
nullable: true,
|
|
// [faceClusterId, assetId] makes this redundant
|
|
index: false,
|
|
})
|
|
faceClusterId!: string | null;
|
|
|
|
@Column({ default: 0, type: 'integer' })
|
|
imageWidth!: Generated<number>;
|
|
|
|
@Column({ default: 0, type: 'integer' })
|
|
imageHeight!: Generated<number>;
|
|
|
|
@Column({ default: 0, type: 'integer' })
|
|
boundingBoxX1!: Generated<number>;
|
|
|
|
@Column({ default: 0, type: 'integer' })
|
|
boundingBoxY1!: Generated<number>;
|
|
|
|
@Column({ default: 0, type: 'integer' })
|
|
boundingBoxX2!: Generated<number>;
|
|
|
|
@Column({ default: 0, type: 'integer' })
|
|
boundingBoxY2!: Generated<number>;
|
|
|
|
@Column({ default: SourceType.MachineLearning, enum: asset_face_source_type })
|
|
sourceType!: Generated<SourceType>;
|
|
|
|
@DeleteDateColumn()
|
|
deletedAt!: Timestamp | null;
|
|
|
|
@UpdateDateColumn()
|
|
updatedAt!: Generated<Timestamp>;
|
|
|
|
@UpdateIdColumn()
|
|
updateId!: Generated<string>;
|
|
|
|
@Column({ type: 'boolean', default: true })
|
|
isVisible!: Generated<boolean>;
|
|
}
|