import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm'; import AccessControlModel from 'Common/Models/AccessControlModel'; 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/BaseDatabase/TableColumnType'; import TableColumn from 'Common/Types/Database/TableColumn'; import ColumnType from 'Common/Types/Database/ColumnType'; import ObjectID from 'Common/Types/ObjectID'; import TableAccessControl from 'Common/Types/Database/AccessControl/TableAccessControl'; import Permission from 'Common/Types/Permission'; import ColumnAccessControl from 'Common/Types/Database/AccessControl/ColumnAccessControl'; import TenantColumn from 'Common/Types/Database/TenantColumn'; import TableMetadata from 'Common/Types/Database/TableMetadata'; import EnableWorkflow from 'Common/Types/Model/EnableWorkflow'; import IconProp from 'Common/Types/Icon/IconProp'; import EnableDocumentation from 'Common/Types/Model/EnableDocumentation'; import Monitor from './Monitor'; import Probe from './Probe'; import { JSONObject } from 'Common/Types/JSON'; @EnableDocumentation() @TenantColumn('projectId') @TableAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanDeleteMonitorProbe, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanEditMonitorProbe, ], }) @EnableWorkflow({ create: true, delete: true, update: true, read: true, }) @CrudApiEndpoint(new Route('/monitor-probe')) @TableMetadata({ tableName: 'MonitorProbe', singularName: 'Monitor Probe', pluralName: 'Monitor Probes', icon: IconProp.Signal, tableDescription: 'Add probes to monitor your resource from multiple locations around the world.', }) @Entity({ name: 'MonitorProbe', }) export default class MonitorProbe extends AccessControlModel { @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], 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.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], 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.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'probeId', type: TableColumnType.Entity, modelType: Probe, title: 'Probe', description: 'Relation to Probe Resource in which this object belongs', }) @ManyToOne( (_type: string) => { return Probe; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'probeId' }) public probe?: Probe = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: 'Probe ID', description: 'ID of your OneUptime Probe in which this object belongs', }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public probeId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'monitorId', type: TableColumnType.Entity, modelType: Monitor, title: 'Monitor', description: 'Relation to Monitor Resource in which this object belongs', }) @ManyToOne( (_type: string) => { return Monitor; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'monitorId' }) public monitor?: Monitor = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: 'Monitor ID', description: 'ID of your OneUptime Monitor in which this object belongs', }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public monitorId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @TableColumn({ type: TableColumnType.Date }) @Column({ type: ColumnType.Date, nullable: true, unique: false, }) public lastPingAt?: Date = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @TableColumn({ type: TableColumnType.Date }) @Column({ type: ColumnType.Date, nullable: true, unique: false, }) public nextPingAt?: Date = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], 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.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], 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.CanReadMonitorProbe, ], 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: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], 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; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateMonitorProbe, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanEditMonitorProbe, ], }) @TableColumn({ isDefaultValueColumn: true, required: true, type: TableColumnType.Boolean, }) @Column({ type: ColumnType.Boolean, nullable: false, unique: false, default: true, }) public isEnabled?: boolean = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadMonitorProbe, ], update: [], }) @TableColumn({ isDefaultValueColumn: false, required: false, type: TableColumnType.JSON, }) @Column({ type: ColumnType.JSON, nullable: true, unique: false, }) public lastMonitoringLog?: JSONObject = undefined; }