import Monitor from "./Monitor"; import MonitorGroup from "./MonitorGroup"; import Project from "./Project"; import StatusPage from "./StatusPage"; import StatusPageGroup from "./StatusPageGroup"; import User from "./User"; import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel"; import Route from "../../Types/API/Route"; import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl"; import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl"; import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn"; import ColumnLength from "../../Types/Database/ColumnLength"; import ColumnType from "../../Types/Database/ColumnType"; import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint"; import EnableDocumentation from "../../Types/Database/EnableDocumentation"; import EnableWorkflow from "../../Types/Database/EnableWorkflow"; import SlugifyColumn from "../../Types/Database/SlugifyColumn"; import TableColumn from "../../Types/Database/TableColumn"; import TableColumnType from "../../Types/Database/TableColumnType"; import TableMetadata from "../../Types/Database/TableMetadata"; import TenantColumn from "../../Types/Database/TenantColumn"; import IconProp from "../../Types/Icon/IconProp"; import ObjectID from "../../Types/ObjectID"; import Permission from "../../Types/Permission"; import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; import UptimePrecision from "../../Types/StatusPage/UptimePrecision"; @EnableDocumentation() @CanAccessIfCanReadOn("statusPage") @TenantColumn("projectId") @TableAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.DeleteStatusPageResource, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @EnableWorkflow({ create: true, delete: true, update: true, read: true, }) @CrudApiEndpoint(new Route("/status-page-resource")) @SlugifyColumn("name", "slug") @TableMetadata({ tableName: "StatusPageResource", singularName: "Status Page Resource", pluralName: "Status Page Resources", icon: IconProp.AltGlobe, tableDescription: "Add resources like monitors to your status page", }) @Entity({ name: "StatusPageResource", }) export default class StatusPageResource extends BaseModel { @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "projectId", type: TableColumnType.Entity, modelType: Project, title: "Project", description: "Relation to Project Resource in which this object belongs", }) @ManyToOne( () => { 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.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: "Project ID", description: "ID of your OneUptime Project in which this object belongs", example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public projectId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "statusPageId", type: TableColumnType.Entity, modelType: StatusPage, title: "Status Page", description: "Relation to Status Page Resource in which this object belongs", }) @ManyToOne( () => { 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.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, title: "Status Page ID", description: "ID of your Status Page resource where this object belongs", example: "f6a7b8c9-d0e1-2345-6789-abcdef012345", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public statusPageId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ manyToOneRelationColumn: "monitorId", type: TableColumnType.Entity, modelType: Monitor, title: "Monitor", description: "Relation to Monitor Resource in which this object belongs", }) @ManyToOne( () => { return Monitor; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "monitorId" }) public monitor?: Monitor = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, title: "Monitor ID", description: "Relation to Monitor ID Resource in which this object belongs", example: "a7b8c9d0-e1f2-3456-789a-bcdef0123456", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public monitorId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ manyToOneRelationColumn: "monitorGroupId", type: TableColumnType.Entity, modelType: MonitorGroup, title: "Monitor Group", description: "Relation to Monitor Group Resource in which this object belongs", }) @ManyToOne( () => { return MonitorGroup; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "monitorGroupId" }) public monitorGroup?: MonitorGroup = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, title: "Monitor Group ID", description: "Relation to Monitor Group ID Resource in which this object belongs", example: "b8c9d0e1-f2a3-4567-89ab-cdef01234567", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public monitorGroupId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ manyToOneRelationColumn: "statusPageGroupId", type: TableColumnType.Entity, modelType: StatusPageGroup, title: "Status Page Group", description: "Does this monitor belong to a status page group? If so - which one is it?", }) @ManyToOne( () => { return StatusPageGroup; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "statusPageGroupId" }) public statusPageGroup?: StatusPageGroup = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, title: "Group ID", description: "Does this monitor belong to a status page group?", example: "c9d0e1f2-a3b4-5678-9abc-def012345678", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public statusPageGroupId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ required: true, type: TableColumnType.ShortText, title: "Display Name", description: "Display name of the monitor on the Status Page", example: "API Server", }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public displayName?: string = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ required: false, type: TableColumnType.Markdown, title: "Display Description", description: "Display description of the monitor on the Status Page. This is in markdown format.", example: "Main API server handling all REST requests", }) @Column({ nullable: true, type: ColumnType.Markdown, }) public displayDescription?: string = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ required: false, type: TableColumnType.LongText, title: "Display Tooltip", description: "Tooltip of the monitor on the Status Page", }) @Column({ nullable: true, type: ColumnType.LongText, length: ColumnLength.LongText, }) public displayTooltip?: string = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ isDefaultValueColumn: true, type: TableColumnType.Boolean, title: "Show current status", description: "Show current status like offline, operational or degraded.", defaultValue: true, }) @Column({ type: ColumnType.Boolean, default: true, }) public showCurrentStatus?: boolean = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ isDefaultValueColumn: true, type: TableColumnType.Boolean, title: "Show Uptime Percent", description: "Show uptime percent of this monitor for the last 90 days", defaultValue: false, }) @Column({ type: ColumnType.Boolean, default: false, }) public showUptimePercent?: boolean = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ type: TableColumnType.ShortText, title: "Uptime Percent Precision", required: false, description: "Precision of uptime percent of this monitor for the last 90 days", }) @Column({ type: ColumnType.ShortText, nullable: true, }) public uptimePercentPrecision?: UptimePrecision = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ isDefaultValueColumn: true, type: TableColumnType.Boolean, title: "Show History Chart", description: "Show a 90 day uptime history of this monitor", defaultValue: true, }) @Column({ type: ColumnType.Boolean, default: true, }) public showStatusHistoryChart?: boolean = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], 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( () => { return User; }, { eager: false, nullable: true, onDelete: "SET NULL", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "createdByUserId" }) public createdByUser?: User = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], 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)", example: "d0e1f2a3-b4c5-6789-abcd-ef0123456789", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public createdByUserId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateStatusPageResource, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadStatusPageResource, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditStatusPageResource, ], }) @TableColumn({ isDefaultValueColumn: false, type: TableColumnType.Number, title: "Order", description: "Order / Priority of this resource", }) @Column({ type: ColumnType.Number, }) public order?: number = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ manyToOneRelationColumn: "deletedByUserId", type: TableColumnType.Entity, title: "Deleted by User", modelType: User, description: "Relation to User who deleted this object (if this object was deleted by a User)", }) @ManyToOne( () => { return User; }, { cascade: false, eager: false, nullable: true, onDelete: "SET NULL", 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)", example: "e1f2a3b4-c5d6-789a-bcde-f01234567890", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public deletedByUserId?: ObjectID = undefined; }