import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm'; import BaseModel from 'Common/Models/BaseModel'; import User from './User'; import Project from './Project'; import CrudApiEndpoint from 'Common/Types/Database/CrudApiEndpoint'; import Route from 'Common/Types/API/Route'; 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 UniqueColumnBy from 'Common/Types/Database/UniqueColumnBy'; import TenantColumn from 'Common/Types/Database/TenantColumn'; import TableMetadata from 'Common/Types/Database/TableMetadata'; import EnableWorkflow from 'Common/Types/Database/EnableWorkflow'; import IconProp from 'Common/Types/Icon/IconProp'; import StatusPage from './StatusPage'; import Domain from './Domain'; import CanAccessIfCanReadOn from 'Common/Types/Database/CanAccessIfCanReadOn'; import EnableDocumentation from 'Common/Types/Database/EnableDocumentation'; import { JSONObject } from 'Common/Types/JSON'; @EnableDocumentation() @CanAccessIfCanReadOn('statusPage') @TenantColumn('projectId') @TableAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanDeleteStatusPageDomain, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanEditStatusPageDomain, ], }) @EnableWorkflow({ create: true, delete: true, update: true, read: true, }) @CrudApiEndpoint(new Route('/status-page-domain')) @TableMetadata({ tableName: 'StatusPageDomain', singularName: 'Status Page Domain', pluralName: 'Status Page Domains', icon: IconProp.Globe, tableDescription: 'Manage custom domains for your status page', }) @Entity({ name: 'StatusPageDomain', }) export default class StatusPageDomain extends BaseModel { @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'projectId', type: TableColumnType.Entity, modelType: Project, title: 'Project', description: 'Relation to Project Resource in which this object belongs', }) @ManyToOne( (_type: string) => { return Project; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'projectId' }) public project?: Project = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: 'Project ID', description: 'ID of your OneUptime Project in which this object belongs', }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public projectId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'domainId', type: TableColumnType.Entity, modelType: Domain, }) @ManyToOne( (_type: string) => { return Domain; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'domainId' }) public domain?: Domain = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public domainId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'statusPageId', type: TableColumnType.Entity, modelType: StatusPage, title: 'Status Page', description: 'Relation to Status Page Resource in which this object belongs', }) @ManyToOne( (_type: string) => { return StatusPage; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'statusPageId' }) public statusPage?: StatusPage = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, title: 'Status Page ID', description: 'ID of your Status Page resource where this object belongs', }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public statusPageId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanEditStatusPageDomain, ], }) @TableColumn({ required: true, type: TableColumnType.ShortText, title: 'Sumdomain', description: 'Subdomain of your status page - like (status)', }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public subdomain?: string = undefined; @UniqueColumnBy('projectId') @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ required: true, type: TableColumnType.ShortText, title: 'Full Domain', description: 'Full domain of your status page (like status.acmeinc.com). This is autogenerated and is derived from subdomain and domain.', }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public fullDomain?: string = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], 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: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], 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: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], 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.JSON, title: 'SSL Provider Config', description: 'SSL Provider Config', }) @Column({ type: ColumnType.JSON, nullable: true, unique: false, }) public greenlockConfig?: JSONObject = undefined; // This token is used by the Worker. // worker pings the status page of customers - eg: status.company.com/verify-token/:id // and the end point on Status Page project returns 200. // when that happens the isCnameVerified is set to True and the certificate is added to Greenlock. @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateStatusPageDomain, ], read: [], update: [], }) @TableColumn({ required: true, type: TableColumnType.ShortText, title: 'CNAME Verification Token', description: 'CNAME Verification Token', }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public cnameVerificationToken?: string = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ isDefaultValueColumn: true, required: true, type: TableColumnType.Boolean, title: 'CNAME Verified', description: 'Is CNAME Verified?', }) @Column({ type: ColumnType.Boolean, nullable: false, unique: false, default: false, }) public isCnameVerified?: boolean = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ isDefaultValueColumn: true, required: true, type: TableColumnType.Boolean, title: 'Connected to Certificate Provider', description: 'Is this domain connected to certificate provider?', }) @Column({ type: ColumnType.Boolean, nullable: false, unique: false, default: false, }) public isAddedToGreenlock?: boolean = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ isDefaultValueColumn: true, required: true, type: TableColumnType.Boolean, title: 'SSLm Provisioned', description: 'Is SSL provisioned?', }) @Column({ type: ColumnType.Boolean, nullable: false, unique: false, default: false, }) public isSslProvisioned?: boolean = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadStatusPageDomain, ], update: [], }) @TableColumn({ isDefaultValueColumn: true, required: true, type: TableColumnType.Boolean, title: 'Self Signed Cert Generated', description: 'Is self signed certificate generated?', }) @Column({ type: ColumnType.Boolean, nullable: false, unique: false, default: false, }) public isSelfSignedSslGenerated?: boolean = undefined; }