import { Column, CreateDateColumn, Entity, Index, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToOne, PrimaryGeneratedColumn, Unique, UpdateDateColumn, } from 'typeorm'; import { ExifEntity } from './exif.entity'; import { SharedLinkEntity } from './shared-link.entity'; import { SmartInfoEntity } from './smart-info.entity'; import { TagEntity } from './tag.entity'; import { UserEntity } from './user.entity'; @Entity('assets') @Unique('UQ_userid_checksum', ['owner', 'checksum']) export class AssetEntity { @PrimaryGeneratedColumn('uuid') id!: string; @Column() deviceAssetId!: string; @ManyToOne(() => UserEntity, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: false }) owner!: UserEntity; @Column() ownerId!: string; @Column() deviceId!: string; @Column() type!: AssetType; @Column() originalPath!: string; @Column({ type: 'varchar', nullable: true }) resizePath!: string | null; @Column({ type: 'varchar', nullable: true, default: '' }) webpPath!: string | null; @Column({ type: 'varchar', nullable: true, default: '' }) encodedVideoPath!: string | null; @CreateDateColumn({ type: 'timestamptz' }) createdAt!: string; @UpdateDateColumn({ type: 'timestamptz' }) updatedAt!: string; @Column({ type: 'timestamptz' }) fileCreatedAt!: string; @Column({ type: 'timestamptz' }) fileModifiedAt!: string; @Column({ type: 'boolean', default: false }) isFavorite!: boolean; @Column({ type: 'varchar', nullable: true }) mimeType!: string | null; @Column({ type: 'bytea', nullable: true, select: false }) @Index({ where: `'checksum' IS NOT NULL` }) // avoid null index checksum?: Buffer | null; // sha1 checksum @Column({ type: 'varchar', nullable: true }) duration!: string | null; @Column({ type: 'boolean', default: true }) isVisible!: boolean; @OneToOne(() => AssetEntity, { nullable: true, onUpdate: 'CASCADE', onDelete: 'SET NULL' }) @JoinColumn() livePhotoVideo!: AssetEntity | null; @Column({ nullable: true }) livePhotoVideoId!: string | null; @OneToOne(() => ExifEntity, (exifEntity) => exifEntity.asset) exifInfo?: ExifEntity; @OneToOne(() => SmartInfoEntity, (smartInfoEntity) => smartInfoEntity.asset) smartInfo?: SmartInfoEntity; @ManyToMany(() => TagEntity, (tag) => tag.assets, { cascade: true }) @JoinTable({ name: 'tag_asset' }) tags!: TagEntity[]; @ManyToMany(() => SharedLinkEntity, (link) => link.assets, { cascade: true }) @JoinTable({ name: 'shared_link__asset' }) sharedLinks!: SharedLinkEntity[]; } export enum AssetType { IMAGE = 'IMAGE', VIDEO = 'VIDEO', AUDIO = 'AUDIO', OTHER = 'OTHER', }