import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm'; import User from './User'; import TableColumnType from 'Common/Types/Database/TableColumnType'; import TableColumn from 'Common/Types/Database/TableColumn'; import ColumnType from 'Common/Types/Database/ColumnType'; import ObjectID from 'Common/Types/ObjectID'; import ColumnLength from 'Common/Types/Database/ColumnLength'; import TableAccessControl from 'Common/Types/Database/AccessControl/TableAccessControl'; import Permission from 'Common/Types/Permission'; import ColumnAccessControl from 'Common/Types/Database/AccessControl/ColumnAccessControl'; import TableMetadata from 'Common/Types/Database/TableMetadata'; import IconProp from 'Common/Types/Icon/IconProp'; import BaseModel from 'Common/Models/BaseModel'; @TableAccessControl({ create: [], read: [], delete: [], update: [], }) @TableMetadata({ tableName: 'DataMigration', singularName: 'Data Migration', pluralName: 'Data Migrations', icon: IconProp.Database, tableDescription: 'Log of all the database migrations executed.', }) @Entity({ name: 'DataMigrations', }) export default class DataMigration extends BaseModel { @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ required: true, type: TableColumnType.ShortText, title: 'Name', description: 'Name of the migration.', }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public name?: string = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ required: true, type: TableColumnType.Boolean, title: 'Executed', description: 'Did the migration execute successfully?', }) @Column({ nullable: false, type: ColumnType.Boolean, default: true, }) public executed?: boolean = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ required: true, type: TableColumnType.Date, title: 'Executed At', description: 'When was the migration executed?', }) @Column({ nullable: false, type: ColumnType.Date, }) public executedAt?: Date = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateProjectLabel, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadProjectLabel, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'createdByUserId', type: TableColumnType.Entity, modelType: User, title: 'Created by User', description: 'Relation to User who created this object (if this object was created by a User)', }) @ManyToOne( (_type: string) => { return User; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'createdByUserId' }) public createdByUser?: User = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ type: TableColumnType.ObjectID, title: 'Created by User ID', description: 'User ID who created this object (if this object was created by a User)', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public createdByUserId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ manyToOneRelationColumn: 'deletedByUserId', type: TableColumnType.Entity, title: 'Deleted by User', description: 'Relation to User who deleted this object (if this object was deleted by a User)', }) @ManyToOne( (_type: string) => { return User; }, { cascade: false, eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'deletedByUserId' }) public deletedByUser?: User = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ type: TableColumnType.ObjectID, title: 'Deleted by User ID', description: 'User ID who deleted this object (if this object was deleted by a User)', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public deletedByUserId?: ObjectID = undefined; }