import Probe from "./Probe"; import Project from "./Project"; import User from "./User"; import BaseModel from "Common/Models/BaseModel"; import Route from "Common/Types/API/Route"; import { PlanType } from "Common/Types/Billing/SubscriptionPlan"; import ColumnAccessControl from "Common/Types/Database/AccessControl/ColumnAccessControl"; import TableAccessControl from "Common/Types/Database/AccessControl/TableAccessControl"; import TableBillingAccessControl from "Common/Types/Database/AccessControl/TableBillingAccessControl"; import ColumnType from "Common/Types/Database/ColumnType"; import CrudApiEndpoint from "Common/Types/Database/CrudApiEndpoint"; import EnableDocumentation from "Common/Types/Database/EnableDocumentation"; import EnableWorkflow from "Common/Types/Database/EnableWorkflow"; import TableColumn from "Common/Types/Database/TableColumn"; import TableColumnType from "Common/Types/Database/TableColumnType"; import TableMetadata from "Common/Types/Database/TableMetadata"; import TenantColumn from "Common/Types/Database/TenantColumn"; import IconProp from "Common/Types/Icon/IconProp"; import ObjectID from "Common/Types/ObjectID"; import Permission from "Common/Types/Permission"; import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; @EnableDocumentation() @TenantColumn("projectId") @TableBillingAccessControl({ create: PlanType.Growth, read: PlanType.Free, update: PlanType.Growth, delete: PlanType.Free, }) @TableAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.DeleteProbeOwnerUser, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.EditProbeOwnerUser, ], }) @EnableWorkflow({ create: true, delete: true, update: true, read: true, }) @CrudApiEndpoint(new Route("/probe-owner-user")) @TableMetadata({ tableName: "ProbeOwnerUser", singularName: "Probe User Owner", pluralName: "Probe User Owners", icon: IconProp.Signal, tableDescription: "Add users as owners to your probes.", }) @Entity({ name: "ProbeOwnerUser", }) export default class ProbeOwnerUser extends BaseModel { @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], 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: false, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "projectId" }) public project?: Project = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], 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.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "userId", type: TableColumnType.Entity, modelType: User, title: "User", description: "User that is the owner. This user will receive notifications. ", }) @ManyToOne( () => { return User; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userId" }) public user?: User = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: "User ID", description: "ID of your OneUptime User in which this object belongs", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public userId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "probeId", type: TableColumnType.Entity, modelType: Probe, title: "Probe", description: "Relation to Probe Resource in which this object belongs", }) @ManyToOne( () => { return Probe; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "probeId" }) public probe?: Probe = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], 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.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], 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: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "createdByUserId" }) public createdByUser?: User = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], 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.ReadProbeOwnerUser, ], 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( () => { 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.ReadProbeOwnerUser, ], 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.ProjectMember, Permission.CreateProbeOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadProbeOwnerUser, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.Boolean, required: true, isDefaultValueColumn: true, title: "Are Owners Notified", description: "Are owners notified of this resource ownership?", }) @Column({ type: ColumnType.Boolean, nullable: false, default: false, }) public isOwnerNotified?: boolean = undefined; }