diff --git a/Common/Types/Permission.ts b/Common/Types/Permission.ts index c9ea381340..65eed126dc 100644 --- a/Common/Types/Permission.ts +++ b/Common/Types/Permission.ts @@ -400,6 +400,12 @@ enum Permission { CanReadProjectOnCallDutyPolicyEscalationRuleUser = 'CanReadProjectOnCallDutyPolicyEscalationRuleUser', // Resource Permissions (Team Permission) + CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule = 'CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule', + CanEditProjectOnCallDutyPolicyEscalationRuleOnCallSchedule = 'CanEditProjectOnCallDutyPolicyEscalationRuleOnCallSchedule', + CanDeleteProjectOnCallDutyPolicyEscalationRuleOnCallSchedule = 'CanDeleteProjectOnCallDutyPolicyEscalationRuleOnCallSchedule', + CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule = 'CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule', + + CanCreateProjectOnCallDutyPolicyEscalationRuleTeam = 'CanCreateProjectOnCallDutyPolicyEscalationRuleTeam', CanEditProjectOnCallDutyPolicyEscalationRuleTeam = 'CanEditProjectOnCallDutyPolicyEscalationRuleTeam', CanDeleteProjectOnCallDutyPolicyEscalationRuleTeam = 'CanDeleteProjectOnCallDutyPolicyEscalationRuleTeam', @@ -1686,6 +1692,45 @@ export class PermissionHelper { isAccessControlPermission: true, }, + + { + permission: + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + title: 'Can Create On-Call Duty Policy Escalation Rule Schedule', + description: + 'This permission can create teams in on-call duty escalation rule schedule this project.', + isAssignableToTenant: true, + isAccessControlPermission: true, + }, + { + permission: + Permission.CanDeleteProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + title: 'Can Delete On-Call Duty Policy Escalation Rule Schedule', + description: + 'This permission can delete teams in on-call duty escalation rule schedule of this project.', + isAssignableToTenant: true, + isAccessControlPermission: true, + }, + { + permission: + Permission.CanEditProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + title: 'Can Edit On-Call Duty Policy Escalation Rule Schedule', + description: + 'This permission can edit teams in on-call duty escalation rule schedule of this project.', + isAssignableToTenant: true, + isAccessControlPermission: true, + }, + { + permission: + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + title: 'Can Read On-Call Duty Policy Escalation Rule Schedule', + description: + 'This permission can read teams in on-call duty escalation rule schedule of this project.', + isAssignableToTenant: true, + isAccessControlPermission: true, + }, + + { permission: Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleUser, diff --git a/CommonServer/Services/OnCallDutyPolicyEscalationRuleOnCallScheduleService.ts b/CommonServer/Services/OnCallDutyPolicyEscalationRuleOnCallScheduleService.ts new file mode 100644 index 0000000000..dcadc04bac --- /dev/null +++ b/CommonServer/Services/OnCallDutyPolicyEscalationRuleOnCallScheduleService.ts @@ -0,0 +1,11 @@ +import PostgresDatabase from '../Infrastructure/PostgresDatabase'; +import Model from 'Model/Models/OnCallDutyPolicyEscalationRuleOnCallSchedule'; +import DatabaseService from './DatabaseService'; + +export class Service extends DatabaseService { + public constructor(postgresDatabase?: PostgresDatabase) { + super(Model, postgresDatabase); + } +} + +export default new Service(); diff --git a/Model/Models/OnCallDutyPolicyEscalationRuleOnCallSchedule.ts b/Model/Models/OnCallDutyPolicyEscalationRuleOnCallSchedule.ts new file mode 100644 index 0000000000..78fdcabe1f --- /dev/null +++ b/Model/Models/OnCallDutyPolicyEscalationRuleOnCallSchedule.ts @@ -0,0 +1,421 @@ +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 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 IconProp from 'Common/Types/Icon/IconProp'; +import EnableDocumentation from 'Common/Types/Database/EnableDocumentation'; +import OnCallDutyPolicy from './OnCallDutyPolicy'; +import OnCallDutyPolicySchedule from './OnCallDutyPolicySchedule'; +import OnCallDutyPolicyEscalationRule from './OnCallDutyPolicyEscalationRule'; + +@EnableDocumentation() +@TenantColumn('projectId') +@TableAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + delete: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanDeleteProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanEditProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], +}) +@CrudApiEndpoint(new Route('/on-call-duty-policy-esclation-rule-schedule')) +@Entity({ + name: 'OnCallDutyPolicyEscalationRuleSchedule', +}) +@TableMetadata({ + tableName: 'OnCallDutyPolicyEscalationRuleSchedule', + singularName: 'On-Call Duty Escalation Rule Schedule', + pluralName: 'On-Call Duty Escalation Rule Schedules', + icon: IconProp.Calendar, + tableDescription: + 'Manage schedules for on-call duty policy escalation rules.', +}) +export default class OnCallDutyPolicyEscalationRuleSchedule extends BaseModel { + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + 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.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + 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.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'onCallDutyPolicyId', + type: TableColumnType.Entity, + modelType: OnCallDutyPolicy, + title: 'On-Call Policy', + description: + 'Relation to On-Call Policy where this escalation rule belongs.', + }) + @ManyToOne( + (_type: string) => { + return OnCallDutyPolicy; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'onCallDutyPolicyId' }) + public onCallDutyPolicy?: OnCallDutyPolicy = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnRelationQuery: true, + title: 'On-Call Policy ID', + description: + 'ID of your On-Call Policy where this escalation rule belongs.', + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public onCallDutyPolicyId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'onCallDutyPolicyScheduleId', + type: TableColumnType.Entity, + modelType: OnCallDutyPolicySchedule, + title: 'On Call Policy Schedule', + description: 'Relation to On Call Policy Schedule who is in this escalation rule.', + }) + @ManyToOne( + (_type: string) => { + return OnCallDutyPolicySchedule; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'onCallDutyPolicyScheduleId' }) + public onCallDutyPolicySchedule?: OnCallDutyPolicySchedule = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [], + }) + @TableColumn({ + type: TableColumnType.ObjectID, + title: 'On Call Duty Policy Schedule ID', + description: 'ID of the on call schedule which is in this escalation rule.', + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public onCallDutyPolicyScheduleId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'onCallDutyPolicyEscalationRuleId', + type: TableColumnType.Entity, + modelType: OnCallDutyPolicyEscalationRule, + title: 'Escalation Rule', + description: + 'Relation to On-Call Policy Escalation Rule where this user belongs.', + }) + @ManyToOne( + (_type: string) => { + return OnCallDutyPolicyEscalationRule; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'onCallDutyPolicyEscalationRuleId' }) + public onCallDutyPolicyEscalationRule?: OnCallDutyPolicyEscalationRule = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnRelationQuery: true, + title: 'On-Call Policy Escalation Rule ID', + description: + 'ID of your On-Call Policy Escalation Rule where this user belongs.', + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public onCallDutyPolicyEscalationRuleId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + 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.CanCreateProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadProjectOnCallDutyPolicyEscalationRuleOnCallSchedule, + ], + 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: [], + 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; +}