From 77dcb16e8b67311670792ae4edfe3514d03e687a Mon Sep 17 00:00:00 2001 From: Simon Larsen Date: Mon, 1 Jul 2024 13:42:17 +0100 Subject: [PATCH] feat: Add permissions for creating, deleting, editing, and reading probe owner teams and users --- Common/Types/Permission.ts | 80 +++++++ Model/Models/Index.ts | 5 + Model/Models/ProbeOwnerTeam.ts | 424 +++++++++++++++++++++++++++++++++ Model/Models/ProbeOwnerUser.ts | 423 ++++++++++++++++++++++++++++++++ 4 files changed, 932 insertions(+) create mode 100644 Model/Models/ProbeOwnerTeam.ts create mode 100644 Model/Models/ProbeOwnerUser.ts diff --git a/Common/Types/Permission.ts b/Common/Types/Permission.ts index c1cc6e4e2a..03b29f7a83 100644 --- a/Common/Types/Permission.ts +++ b/Common/Types/Permission.ts @@ -467,6 +467,17 @@ enum Permission { ReadCopilotAction = "ReadCopilotAction", + CreateProbeOwnerTeam = "CreateProbeOwnerTeam", + DeleteProbeOwnerTeam = "DeleteProbeOwnerTeam", + EditProbeOwnerTeam = "EditProbeOwnerTeam", + ReadProbeOwnerTeam = "ReadProbeOwnerTeam", + + CreateProbeOwnerUser = "CreateProbeOwnerUser", + DeleteProbeOwnerUser = "DeleteProbeOwnerUser", + EditProbeOwnerUser = "EditProbeOwnerUser", + ReadProbeOwnerUser = "ReadProbeOwnerUser", + + CreateServiceRepository = "CreateServiceRepository", DeleteServiceRepository = "DeleteServiceRepository", EditServiceRepository = "EditServiceRepository", @@ -2446,6 +2457,75 @@ export class PermissionHelper { isAccessControlPermission: false, }, + + { + permission: Permission.CreateProbeOwnerTeam, + title: "Create Probe Owner Team", + description: + "This permission can create owners for probes.", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.DeleteProbeOwnerTeam, + title: "Delete Probe Owner Team", + description: + "This permission can delete owners for probes", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.EditProbeOwnerTeam, + title: "Edit Probe Owner Team", + description: + "This permission can edit owners for probes", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.ReadProbeOwnerTeam, + title: "Read Probe Owner Team", + description: + "This permission can read owners for probes", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + + + { + permission: Permission.CreateProbeOwnerUser, + title: "Create Probe Owner User", + description: + "This permission can create owners for probes.", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.DeleteProbeOwnerUser, + title: "Delete Probe Owner User", + description: + "This permission can delete owners for probes", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.EditProbeOwnerUser, + title: "Edit Probe Owner User", + description: + "This permission can edit owners for probes", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.ReadProbeOwnerUser, + title: "Read Probe Owner User", + description: + "This permission can read owners for probes", + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + + { permission: Permission.CreateServiceCatalog, title: "Create Service Catalog", diff --git a/Model/Models/Index.ts b/Model/Models/Index.ts index cefea0560f..07ddab9336 100644 --- a/Model/Models/Index.ts +++ b/Model/Models/Index.ts @@ -62,6 +62,8 @@ import OnCallDutyPolicySchedule from "./OnCallDutyPolicySchedule"; import OnCallDutyPolicyScheduleLayer from "./OnCallDutyPolicyScheduleLayer"; import OnCallDutyPolicyScheduleLayerUser from "./OnCallDutyPolicyScheduleLayerUser"; import Probe from "./Probe"; +import ProbeOwnerTeam from "./ProbeOwnerTeam"; +import ProbeOwnerUser from "./ProbeOwnerUser"; import Project from "./Project"; import ProjectCallSMSConfig from "./ProjectCallSMSConfig"; // Project SMTP Config. @@ -268,4 +270,7 @@ export default [ CodeRepository, CopilotAction, ServiceRepository, + + ProbeOwnerTeam, + ProbeOwnerUser ]; diff --git a/Model/Models/ProbeOwnerTeam.ts b/Model/Models/ProbeOwnerTeam.ts new file mode 100644 index 0000000000..dc7f378a53 --- /dev/null +++ b/Model/Models/ProbeOwnerTeam.ts @@ -0,0 +1,424 @@ +import Probe from "./Probe"; +import Project from "./Project"; +import Team from "./Team"; +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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + delete: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.DeleteProbeOwnerTeam, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.EditProbeOwnerTeam, + ], +}) +@EnableWorkflow({ + create: true, + delete: true, + update: true, + read: true, +}) +@CrudApiEndpoint(new Route("/probe-owner-team")) +@TableMetadata({ + tableName: "ProbeOwnerTeam", + singularName: "Probe Owner Team", + pluralName: "Probe Owner Teams", + icon: IconProp.Signal, + tableDescription: "Add teams as owners to your probes.", +}) +@Entity({ + name: "ProbeOwnerTeam", +}) +export default class ProbeOwnerTeam extends BaseModel { + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: "teamId", + type: TableColumnType.Entity, + modelType: Team, + title: "Team", + description: + "Team that is the owner. All users in this team will receive notifications. ", + }) + @ManyToOne( + () => { + return Team; + }, + { + eager: false, + nullable: true, + onDelete: "CASCADE", + orphanedRowAction: "nullify", + }, + ) + @JoinColumn({ name: "teamId" }) + public team?: Team = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnRelationQuery: true, + title: "Team ID", + description: "ID of your OneUptime Team in which this object belongs", + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public teamId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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.ReadProbeOwnerTeam, + ], + 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.ReadProbeOwnerTeam, + ], + 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.CreateProbeOwnerTeam, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.ReadProbeOwnerTeam, + ], + 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; +} diff --git a/Model/Models/ProbeOwnerUser.ts b/Model/Models/ProbeOwnerUser.ts new file mode 100644 index 0000000000..6b34fbdf87 --- /dev/null +++ b/Model/Models/ProbeOwnerUser.ts @@ -0,0 +1,423 @@ +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; +}