placebo.mk/backend/src/modules/entities.ts
2026-01-10 20:16:08 +01:00

148 lines
2.4 KiB
TypeScript

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;
}