import { Min } from 'class-validator'
import { CreateDateColumn, DeleteDateColumn, PrimaryGeneratedColumn, UpdateDateColumn, VersionColumn } from 'typeorm'

/**
 * 基实体
 *
 *
 * ### 说明
 *
 * ```markdown
 * 1. 当前实体包含了所有实体都会用到的一些公共列。
 * 2. 所有实体都应当继承当前的基实体,避免重复定义这些公共列。
 * ```
 */
export abstract class AbstractEntity {
  /** 主键 ID */
  @PrimaryGeneratedColumn({
    comment: '主键 ID',
  })
  @Min(1)
  id: number

  /**
   * 创建时间
   *
   *
   * ### 说明
   *
   * ```markdown
   * 1. `创建时间` 列由 MySQL 触发器自动维护,禁止在代码中手动更新。
   * ```
   */
  @CreateDateColumn({
    name: 'create_time',
    select: false,
    update: false,
    insert: false,
    comment: '创建时间',
  })
  createTime: Date

  /**
   * 更新时间
   *
   *
   * ### 说明
   *
   * ```markdown
   * 1. `更新时间` 列由 MySQL 触发器自动维护,禁止在代码中手动更新。
   * ```
   */
  @UpdateDateColumn({
    name: 'update_time',
    select: false,
    update: false,
    insert: false,
    comment: '更新时间',
  })
  updateTime: Date

  /**
   * 删除时间(软删标记)
   *
   *
   * ### 说明
   *
   * ```markdown
   * 1. 当前列由框架自动维护,禁止在代码中手动更新。
   * ```
   */
  @DeleteDateColumn({
    name: 'delete_time',
    select: false,
    update: false,
    insert: false,
    comment: '删除时间(软删标记)',
  })
  deleteTime: Date

  /**
   * 自动存储计数(更新次数)
   *
   *
   * ### 说明
   *
   * ```markdown
   * 1. 当前列由框架自动维护,禁止在代码中手动更新。
   * ```
   */
  @VersionColumn({
    select: false,
    comment: '自动存储计数(更新次数)',
  })
  version: number
}