import { Column, CreateDateColumn, DeleteDateColumn, Entity, JoinColumn, ManyToOne, PrimaryColumn, UpdateDateColumn } from 'typeorm' import type { AppDeploymentRecordAttributes, AppDeploymentRemovalRecordAttributes, DNSRecordAttributes } from '../types' import { Deployer } from './Deployer' import { Project } from './Project' import { User } from './User' export enum Environment { Production = 'Production', Preview = 'Preview', Development = 'Development' } export enum DeploymentStatus { Building = 'Building', Ready = 'Ready', Error = 'Error', Deleting = 'Deleting' } export interface ApplicationDeploymentRequest { type: string version: string name: string application: string lrn?: string auction?: string config: string meta: string payment?: string dns?: string } export interface ApplicationDeploymentRemovalRequest { type: string version: string deployment: string auction?: string payment?: string } export interface ApplicationRecord { type: string version: string name: string description?: string homepage?: string license?: string author?: string repository?: string[] app_version?: string repository_ref: string app_type: string } @Entity() export class Deployment { // TODO: set custom generated id @PrimaryColumn('varchar') id!: string @Column() projectId!: string @ManyToOne(() => Project, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'projectId' }) project!: Project @Column('varchar') branch!: string @Column('varchar') commitHash!: string @Column('varchar') commitMessage!: string @Column('varchar', { nullable: true }) url!: string | null @Column('varchar') applicationRecordId!: string @Column('simple-json') applicationRecordData!: ApplicationRecord @Column('varchar', { nullable: true }) applicationDeploymentRequestId!: string | null @Column('simple-json', { nullable: true }) applicationDeploymentRequestData!: ApplicationDeploymentRequest | null @Column('varchar', { nullable: true }) applicationDeploymentRecordId!: string | null @Column('simple-json', { nullable: true }) applicationDeploymentRecordData!: AppDeploymentRecordAttributes | null @Column('varchar', { nullable: true }) applicationDeploymentRemovalRequestId!: string | null @Column('simple-json', { nullable: true }) applicationDeploymentRemovalRequestData!: ApplicationDeploymentRemovalRequest | null @Column('varchar', { nullable: true }) applicationDeploymentRemovalRecordId!: string | null @Column('simple-json', { nullable: true }) applicationDeploymentRemovalRecordData!: AppDeploymentRemovalRecordAttributes | null @Column('simple-json', { nullable: true }) dnsRecordData!: DNSRecordAttributes | null @ManyToOne(() => Deployer) @JoinColumn({ name: 'deployerLrn' }) deployer!: Deployer @Column({ enum: Environment }) environment!: Environment @Column('boolean', { default: false }) isCurrent!: boolean @Column('boolean', { default: false }) isCanonical!: boolean @Column({ enum: DeploymentStatus }) status!: DeploymentStatus @ManyToOne(() => User) @JoinColumn({ name: 'createdBy' }) createdBy!: User @CreateDateColumn() createdAt!: Date @UpdateDateColumn() updatedAt!: Date @DeleteDateColumn() deletedAt!: Date | null }