import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn, } from 'typeorm'; import { TenantAwareEntity } from '@/shared/entities/tenant-aware.entity'; import { Brand } from '@/modules/crm/entities/brand.entity'; export enum AssetType { IMAGE = 'image', VIDEO = 'video', DOCUMENT = 'document', AUDIO = 'audio', OTHER = 'other', } export enum AssetStatus { UPLOADING = 'uploading', PROCESSING = 'processing', READY = 'ready', ERROR = 'error', } @Entity('assets', { schema: 'assets' }) @Index(['tenant_id', 'brand_id']) @Index(['tenant_id', 'type']) export class Asset extends TenantAwareEntity { @PrimaryGeneratedColumn('uuid') id: string; @Column('uuid', { nullable: true }) brand_id: string | null; @ManyToOne(() => Brand, { onDelete: 'SET NULL' }) @JoinColumn({ name: 'brand_id' }) brand: Brand; @Column({ length: 255 }) name: string; @Column({ length: 255 }) original_name: string; @Column({ type: 'enum', enum: AssetType, default: AssetType.IMAGE }) type: AssetType; @Column({ length: 100 }) mime_type: string; @Column({ type: 'bigint' }) size: number; @Column({ type: 'text' }) url: string; @Column({ type: 'text', nullable: true }) thumbnail_url: string | null; @Column({ type: 'int', nullable: true }) width: number | null; @Column({ type: 'int', nullable: true }) height: number | null; @Column({ type: 'int', nullable: true }) duration: number | null; // For video/audio in seconds @Column({ type: 'text', nullable: true }) alt_text: string | null; @Column({ type: 'text', nullable: true }) description: string | null; @Column('simple-array', { nullable: true }) tags: string[] | null; @Column({ type: 'jsonb', nullable: true }) metadata: Record | null; @Column({ type: 'enum', enum: AssetStatus, default: AssetStatus.READY }) status: AssetStatus; @Column({ length: 255, nullable: true }) storage_path: string | null; @Column({ length: 50, nullable: true }) storage_provider: string | null; // 's3', 'gcs', 'local' @CreateDateColumn({ type: 'timestamptz' }) created_at: Date; @UpdateDateColumn({ type: 'timestamptz' }) updated_at: Date; @Column({ type: 'timestamptz', nullable: true }) deleted_at: Date | null; }