Skip to content

Commit 317ff80

Browse files
committed
feat: add user roster management fields and access control to OnCallDutyPolicySchedule and OnCallDutyPolicyScheduleLayer
1 parent e175291 commit 317ff80

File tree

4 files changed

+269
-0
lines changed

4 files changed

+269
-0
lines changed

Common/Models/DatabaseModels/OnCallDutyPolicySchedule.ts

+151
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,155 @@ export default class OnCallDutyPolicySchedule extends BaseModel {
400400
transformer: ObjectID.getDatabaseTransformer(),
401401
})
402402
public deletedByUserId?: ObjectID = undefined;
403+
404+
@ColumnAccessControl({
405+
create: [
406+
Permission.ProjectOwner,
407+
Permission.ProjectAdmin,
408+
Permission.ProjectMember,
409+
Permission.CreateProjectOnCallDutyPolicySchedule,
410+
],
411+
read: [
412+
Permission.ProjectOwner,
413+
Permission.ProjectAdmin,
414+
Permission.ProjectMember,
415+
Permission.ReadProjectOnCallDutyPolicySchedule,
416+
],
417+
update: [],
418+
})
419+
@TableColumn({
420+
manyToOneRelationColumn: "currentUserIdOnRoster",
421+
type: TableColumnType.Entity,
422+
modelType: User,
423+
title: "Current User On Roster",
424+
description:
425+
"Relation to User who is currently on roster",
426+
})
427+
@ManyToOne(
428+
() => {
429+
return User;
430+
},
431+
{
432+
eager: false,
433+
nullable: true,
434+
onDelete: "SET NULL",
435+
orphanedRowAction: "nullify",
436+
},
437+
)
438+
@JoinColumn({ name: "currentUserIdOnRoster" })
439+
public currentUserOnRoster?: User = undefined;
440+
441+
@ColumnAccessControl({
442+
create: [
443+
444+
],
445+
read: [
446+
Permission.ProjectOwner,
447+
Permission.ProjectAdmin,
448+
Permission.ProjectMember,
449+
Permission.ReadProjectOnCallDutyPolicySchedule,
450+
],
451+
update: [],
452+
})
453+
@TableColumn({
454+
type: TableColumnType.ObjectID,
455+
title: "Current User ID On Roster",
456+
description:
457+
"User ID who is currently on roster",
458+
})
459+
@Column({
460+
type: ColumnType.ObjectID,
461+
nullable: true,
462+
transformer: ObjectID.getDatabaseTransformer(),
463+
})
464+
public currentUserIdOnRoster?: ObjectID = undefined;
465+
466+
467+
@ColumnAccessControl({
468+
create: [
469+
Permission.ProjectOwner,
470+
Permission.ProjectAdmin,
471+
Permission.ProjectMember,
472+
Permission.CreateProjectOnCallDutyPolicySchedule,
473+
],
474+
read: [
475+
Permission.ProjectOwner,
476+
Permission.ProjectAdmin,
477+
Permission.ProjectMember,
478+
Permission.ReadProjectOnCallDutyPolicySchedule,
479+
],
480+
update: [],
481+
})
482+
@TableColumn({
483+
manyToOneRelationColumn: "nextUserIdOnRoster",
484+
type: TableColumnType.Entity,
485+
modelType: User,
486+
title: "Next User On Roster",
487+
description:
488+
"Relation to User who is next on roster",
489+
})
490+
@ManyToOne(
491+
() => {
492+
return User;
493+
},
494+
{
495+
eager: false,
496+
nullable: true,
497+
onDelete: "SET NULL",
498+
orphanedRowAction: "nullify",
499+
},
500+
)
501+
@JoinColumn({ name: "nextUserIdOnRoster" })
502+
public nextUserOnRoster?: User = undefined;
503+
504+
@ColumnAccessControl({
505+
create: [
506+
507+
],
508+
read: [
509+
Permission.ProjectOwner,
510+
Permission.ProjectAdmin,
511+
Permission.ProjectMember,
512+
Permission.ReadProjectOnCallDutyPolicySchedule,
513+
],
514+
update: [],
515+
})
516+
@TableColumn({
517+
type: TableColumnType.ObjectID,
518+
title: "Next User ID On Roster",
519+
description:
520+
"Next ID who is currently on roster",
521+
})
522+
@Column({
523+
type: ColumnType.ObjectID,
524+
nullable: true,
525+
transformer: ObjectID.getDatabaseTransformer(),
526+
})
527+
public nextUserIdOnRoster?: ObjectID = undefined;
528+
529+
530+
@ColumnAccessControl({
531+
create: [
532+
533+
],
534+
read: [
535+
Permission.ProjectOwner,
536+
Permission.ProjectAdmin,
537+
Permission.ProjectMember,
538+
Permission.ReadProjectOnCallDutyPolicySchedule,
539+
],
540+
update: [],
541+
})
542+
@TableColumn({
543+
type: TableColumnType.Date,
544+
title: "Roster Next Handoff At",
545+
description:
546+
"When is the next roster handoff for this schedule?",
547+
})
548+
@Column({
549+
type: ColumnType.Date,
550+
nullable: true,
551+
})
552+
public rosterNextHandoffAt?: Date = undefined;
553+
403554
}

Common/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.ts

+88
Original file line numberDiff line numberDiff line change
@@ -552,4 +552,92 @@ export default class OnCallDutyPolicyScheduleLayer extends BaseModel {
552552
transformer: RestrictionTimes.getDatabaseTransformer(),
553553
})
554554
public restrictionTimes?: RestrictionTimes = undefined;
555+
556+
557+
@ColumnAccessControl({
558+
create: [
559+
Permission.ProjectOwner,
560+
Permission.ProjectAdmin,
561+
Permission.ProjectMember,
562+
Permission.CreateProjectOnCallDutyPolicySchedule,
563+
],
564+
read: [
565+
Permission.ProjectOwner,
566+
Permission.ProjectAdmin,
567+
Permission.ProjectMember,
568+
Permission.ReadProjectOnCallDutyPolicySchedule,
569+
],
570+
update: [],
571+
})
572+
@TableColumn({
573+
manyToOneRelationColumn: "nextUserIdOnLayer",
574+
type: TableColumnType.Entity,
575+
modelType: User,
576+
title: "Next User On Layer",
577+
description:
578+
"Relation to User who is next on layer",
579+
})
580+
@ManyToOne(
581+
() => {
582+
return User;
583+
},
584+
{
585+
eager: false,
586+
nullable: true,
587+
onDelete: "SET NULL",
588+
orphanedRowAction: "nullify",
589+
},
590+
)
591+
@JoinColumn({ name: "nextUserIdOnLayer" })
592+
public nextUserOnLayer?: User = undefined;
593+
594+
@ColumnAccessControl({
595+
create: [
596+
597+
],
598+
read: [
599+
Permission.ProjectOwner,
600+
Permission.ProjectAdmin,
601+
Permission.ProjectMember,
602+
Permission.ReadProjectOnCallDutyPolicySchedule,
603+
],
604+
update: [],
605+
})
606+
@TableColumn({
607+
type: TableColumnType.ObjectID,
608+
title: "Next User ID On Layer",
609+
description:
610+
"Next ID who is currently on layer",
611+
})
612+
@Column({
613+
type: ColumnType.ObjectID,
614+
nullable: true,
615+
transformer: ObjectID.getDatabaseTransformer(),
616+
})
617+
public nextUserIdOnLayer?: ObjectID = undefined;
618+
619+
620+
@ColumnAccessControl({
621+
create: [
622+
623+
],
624+
read: [
625+
Permission.ProjectOwner,
626+
Permission.ProjectAdmin,
627+
Permission.ProjectMember,
628+
Permission.ReadProjectOnCallDutyPolicySchedule,
629+
],
630+
update: [],
631+
})
632+
@TableColumn({
633+
type: TableColumnType.Date,
634+
title: "Layer Next Handoff At",
635+
description:
636+
"When is the next layer handoff for this schedule?",
637+
})
638+
@Column({
639+
type: ColumnType.Date,
640+
nullable: true,
641+
})
642+
public layerNextHandoffAt?: Date = undefined;
555643
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class MigrationName1743530326936 implements MigrationInterface {
4+
public name = 'MigrationName1743530326936'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" ADD "currentUserIdOnRoster" uuid`);
8+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" ADD "nextUserIdOnRoster" uuid`);
9+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" ADD "rosterNextHandoffAt" TIMESTAMP WITH TIME ZONE`);
10+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ADD "nextUserIdOnLayer" uuid`);
11+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ADD "layerNextHandoffAt" TIMESTAMP WITH TIME ZONE`);
12+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" ADD CONSTRAINT "FK_49ffa461b854ad28bebd3661db5" FOREIGN KEY ("currentUserIdOnRoster") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`);
13+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" ADD CONSTRAINT "FK_775f3837d5094d9d8f433596238" FOREIGN KEY ("nextUserIdOnRoster") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`);
14+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" ADD CONSTRAINT "FK_815023b155d367f28cc6855b843" FOREIGN KEY ("nextUserIdOnLayer") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`);
15+
}
16+
17+
public async down(queryRunner: QueryRunner): Promise<void> {
18+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" DROP CONSTRAINT "FK_815023b155d367f28cc6855b843"`);
19+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" DROP CONSTRAINT "FK_775f3837d5094d9d8f433596238"`);
20+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" DROP CONSTRAINT "FK_49ffa461b854ad28bebd3661db5"`);
21+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" DROP COLUMN "layerNextHandoffAt"`);
22+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicyScheduleLayer" DROP COLUMN "nextUserIdOnLayer"`);
23+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" DROP COLUMN "rosterNextHandoffAt"`);
24+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" DROP COLUMN "nextUserIdOnRoster"`);
25+
await queryRunner.query(`ALTER TABLE "OnCallDutyPolicySchedule" DROP COLUMN "currentUserIdOnRoster"`);
26+
}
27+
28+
}

Common/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ import { MigrationName1743006662678 } from "./1743006662678-MigrationName";
125125
import { MigrationName1743186793413 } from "./1743186793413-MigrationName";
126126
import { MigrationName1743518485566 } from "./1743518485566-MigrationName";
127127
import { MigrationName1743521461137 } from "./1743521461137-MigrationName";
128+
import { MigrationName1743530326936 } from "./1743530326936-MigrationName";
128129

129130
export default [
130131
InitialMigration,
@@ -254,4 +255,5 @@ export default [
254255
MigrationName1743186793413,
255256
MigrationName1743518485566,
256257
MigrationName1743521461137,
258+
MigrationName1743530326936
257259
];

0 commit comments

Comments
 (0)