FullStack-Blog-Nestjs-Nextjs-Postgres
This commit is contained in:
82
backend/src/blog-posts/entities/blog-post.entity.ts
Normal file
82
backend/src/blog-posts/entities/blog-post.entity.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { User } from '../../users/entities/user.entity';
|
||||
|
||||
export enum PostStatus {
|
||||
DRAFT = 'draft',
|
||||
PUBLISHED = 'published',
|
||||
ARCHIVED = 'archived',
|
||||
}
|
||||
|
||||
export enum ContentFormat {
|
||||
MARKDOWN = 'markdown',
|
||||
HTML = 'html',
|
||||
}
|
||||
|
||||
@Entity('blog_posts')
|
||||
export class BlogPost {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
@Column({ length: 255 })
|
||||
title: string;
|
||||
|
||||
@Column({ length: 300, nullable: true, unique: true })
|
||||
slug: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 20, default: PostStatus.DRAFT })
|
||||
status: PostStatus;
|
||||
|
||||
@Column({ type: 'text', default: '' })
|
||||
excerpt: string;
|
||||
|
||||
@Column({ type: 'text' })
|
||||
content: string;
|
||||
|
||||
@Column({ name: 'content_format', type: 'varchar', length: 20, default: ContentFormat.MARKDOWN })
|
||||
contentFormat: ContentFormat;
|
||||
|
||||
@Column({ name: 'author_id' })
|
||||
authorId: string;
|
||||
|
||||
@ManyToOne(() => User, { onDelete: 'RESTRICT' })
|
||||
@JoinColumn({ name: 'author_id' })
|
||||
author: User;
|
||||
|
||||
@Column({ name: 'featured_image_url', length: 500, nullable: true })
|
||||
featuredImageUrl: string;
|
||||
|
||||
@Column({ name: 'featured_image_alt', length: 255, nullable: true })
|
||||
featuredImageAlt: string;
|
||||
|
||||
@Column({ name: 'is_featured', default: false })
|
||||
isFeatured: boolean;
|
||||
|
||||
@Column({ default: 0 })
|
||||
views: number;
|
||||
|
||||
@Column({ type: 'simple-array', default: '' })
|
||||
tags: string[];
|
||||
|
||||
@Column({ type: 'simple-array', default: '' })
|
||||
categories: string[];
|
||||
|
||||
@CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
|
||||
createdAt: Date;
|
||||
|
||||
@UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
|
||||
updatedAt: Date;
|
||||
|
||||
/** Virtual getter — templates use `post.featuredImage.url` and `post.featuredImage.alt` */
|
||||
get featuredImage(): { url: string; alt: string } | null {
|
||||
if (!this.featuredImageUrl) return null;
|
||||
return { url: this.featuredImageUrl, alt: this.featuredImageAlt || '' };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user