import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, ValueTransformer, } from 'typeorm'; class ArrayTransformer implements ValueTransformer { to(value: string[]): string { return JSON.stringify(value ?? []); } from(value: string): string[] { try { return value ? JSON.parse(value) : []; } catch { return []; } } } export enum ArticleStatus { DRAFT = 'draft', PUBLISHED = 'published', ARCHIVED = 'archived', } @Entity('authors') export class Author { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; @Column({ unique: true }) slug: string; @Column({ nullable: true }) bio: string; @Column({ nullable: true }) avatar: string; @Column({ default: false }) isActive: boolean; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; } @Entity('categories') export class Category { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; @Column({ unique: true }) slug: string; @Column({ nullable: true }) description: string; @Column({ nullable: true }) parentId: string; @Column({ default: 0 }) order: number; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; @ManyToOne(() => Category, { onDelete: 'SET NULL' }) @JoinColumn({ name: 'parentId' }) parent: Category; } @Entity('articles') export class Article { @PrimaryGeneratedColumn('uuid') id: string; @Column() title: string; @Column('text') content: string; @Column({ type: 'text', nullable: true }) excerpt: string; @Column({ default: '' }) slug: string; @Column({ default: '' }) featuredImage: string; @Column({ type: 'text', default: '[]', transformer: new ArrayTransformer(), }) tags: string[]; @Column({ type: 'text', default: 'draft', }) status: ArticleStatus; @Column({ default: 0 }) views: number; @Column({ nullable: true }) strapiId: string; @Column({ nullable: true }) authorId: string; @Column({ nullable: true }) categoryId: string; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; @ManyToOne(() => Author, { onDelete: 'SET NULL' }) @JoinColumn({ name: 'authorId' }) author: Author; @ManyToOne(() => Category, { onDelete: 'SET NULL' }) @JoinColumn({ name: 'categoryId' }) category: Category; }