Skip to content

Commit d1c5576

Browse files
feat: add availability and ooo permissions to PBAC registry (calcom#24081)
* feat: add availability and ooo permissions to PBAC registry - Add Availability and OutOfOffice resources to Resource enum - Add CRUD permissions for both resources with empty scope arrays - Create migration to seed admin_role with all CRUD permissions - Create migration to seed member_role with read-only permissions Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * feat: add i18n entries for availability and ooo permissions - Add pbac_resource_availability and pbac_resource_out_of_office resource names - Add description entries for all CRUD operations on both resources - Follow existing PBAC i18n pattern for consistency Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 7090e3e commit d1c5576

3 files changed

Lines changed: 130 additions & 0 deletions

File tree

apps/web/public/static/locales/en/common.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3510,10 +3510,20 @@
35103510
"pbac_desc_update_workflows": "Edit and modify workflow settings",
35113511
"pbac_desc_delete_workflows": "Remove workflows from the system",
35123512
"pbac_resource_webhook": "Webhook",
3513+
"pbac_resource_availability": "Availability",
3514+
"pbac_resource_out_of_office": "Out of Office",
35133515
"pbac_desc_create_webhooks": "Create webhooks",
35143516
"pbac_desc_view_webhooks": "View webhooks",
35153517
"pbac_desc_update_webhooks": "Update webhooks",
35163518
"pbac_desc_delete_webhooks": "Delete webhooks",
3519+
"pbac_desc_create_availability": "Create availability",
3520+
"pbac_desc_view_availability": "View availability",
3521+
"pbac_desc_update_availability": "Update availability",
3522+
"pbac_desc_delete_availability": "Delete availability",
3523+
"pbac_desc_create_out_of_office": "Create out of office",
3524+
"pbac_desc_view_out_of_office": "View out of office",
3525+
"pbac_desc_update_out_of_office": "Update out of office",
3526+
"pbac_desc_delete_out_of_office": "Delete out of office",
35173527
"pbac_desc_manage_workflows": "Full management access to all workflows",
35183528
"pbac_desc_create_event_types": "Create event types",
35193529
"pbac_desc_view_event_types": "View event types",

packages/features/pbac/domain/types/permission-registry.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export enum Resource {
1010
RoutingForm = "routingForm",
1111
Workflow = "workflow",
1212
Webhook = "webhook",
13+
Availability = "availability",
14+
OutOfOffice = "ooo",
1315
}
1416

1517
export enum CrudAction {
@@ -114,6 +116,7 @@ export const isValidPermissionString = (val: unknown): val is PermissionString =
114116
* @returns A new object without the _resource property
115117
*/
116118
export const filterResourceConfig = (config: ResourceConfig): Omit<ResourceConfig, "_resource"> => {
119+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
117120
const { _resource, ...rest } = config;
118121
return rest;
119122
};
@@ -556,4 +559,76 @@ export const PERMISSION_REGISTRY: PermissionRegistry = {
556559
dependsOn: ["webhook.read"],
557560
},
558561
},
562+
[Resource.Availability]: {
563+
_resource: {
564+
i18nKey: "pbac_resource_availability",
565+
},
566+
[CrudAction.Create]: {
567+
description: "Create availability",
568+
category: "availability",
569+
i18nKey: "pbac_action_create",
570+
descriptionI18nKey: "pbac_desc_create_availability",
571+
scope: [],
572+
dependsOn: ["availability.read"],
573+
},
574+
[CrudAction.Read]: {
575+
description: "View availability",
576+
category: "availability",
577+
i18nKey: "pbac_action_read",
578+
descriptionI18nKey: "pbac_desc_view_availability",
579+
scope: [],
580+
},
581+
[CrudAction.Update]: {
582+
description: "Update availability",
583+
category: "availability",
584+
i18nKey: "pbac_action_update",
585+
descriptionI18nKey: "pbac_desc_update_availability",
586+
scope: [],
587+
dependsOn: ["availability.read"],
588+
},
589+
[CrudAction.Delete]: {
590+
description: "Delete availability",
591+
category: "availability",
592+
i18nKey: "pbac_action_delete",
593+
descriptionI18nKey: "pbac_desc_delete_availability",
594+
scope: [],
595+
dependsOn: ["availability.read"],
596+
},
597+
},
598+
[Resource.OutOfOffice]: {
599+
_resource: {
600+
i18nKey: "pbac_resource_out_of_office",
601+
},
602+
[CrudAction.Create]: {
603+
description: "Create out of office",
604+
category: "ooo",
605+
i18nKey: "pbac_action_create",
606+
descriptionI18nKey: "pbac_desc_create_out_of_office",
607+
scope: [],
608+
dependsOn: ["ooo.read"],
609+
},
610+
[CrudAction.Read]: {
611+
description: "View out of office",
612+
category: "ooo",
613+
i18nKey: "pbac_action_read",
614+
descriptionI18nKey: "pbac_desc_view_out_of_office",
615+
scope: [],
616+
},
617+
[CrudAction.Update]: {
618+
description: "Update out of office",
619+
category: "ooo",
620+
i18nKey: "pbac_action_update",
621+
descriptionI18nKey: "pbac_desc_update_out_of_office",
622+
scope: [],
623+
dependsOn: ["ooo.read"],
624+
},
625+
[CrudAction.Delete]: {
626+
description: "Delete out of office",
627+
category: "ooo",
628+
i18nKey: "pbac_action_delete",
629+
descriptionI18nKey: "pbac_desc_delete_out_of_office",
630+
scope: [],
631+
dependsOn: ["ooo.read"],
632+
},
633+
},
559634
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
-- Add availability permissions for admin role (create, read, update, delete)
2+
INSERT INTO "RolePermission" (id, "roleId", resource, action, "createdAt")
3+
SELECT
4+
gen_random_uuid(), 'admin_role', resource, action, NOW()
5+
FROM (
6+
VALUES
7+
('availability', 'create'),
8+
('availability', 'read'),
9+
('availability', 'update'),
10+
('availability', 'delete')
11+
) AS permissions(resource, action)
12+
ON CONFLICT ("roleId", resource, action) DO NOTHING;
13+
14+
-- Add ooo permissions for admin role (create, read, update, delete)
15+
INSERT INTO "RolePermission" (id, "roleId", resource, action, "createdAt")
16+
SELECT
17+
gen_random_uuid(), 'admin_role', resource, action, NOW()
18+
FROM (
19+
VALUES
20+
('ooo', 'create'),
21+
('ooo', 'read'),
22+
('ooo', 'update'),
23+
('ooo', 'delete')
24+
) AS permissions(resource, action)
25+
ON CONFLICT ("roleId", resource, action) DO NOTHING;
26+
27+
-- Add availability read permission for member role
28+
INSERT INTO "RolePermission" (id, "roleId", resource, action, "createdAt")
29+
SELECT
30+
gen_random_uuid(), 'member_role', resource, action, NOW()
31+
FROM (
32+
VALUES
33+
('availability', 'read')
34+
) AS permissions(resource, action)
35+
ON CONFLICT ("roleId", resource, action) DO NOTHING;
36+
37+
-- Add ooo read permission for member role
38+
INSERT INTO "RolePermission" (id, "roleId", resource, action, "createdAt")
39+
SELECT
40+
gen_random_uuid(), 'member_role', resource, action, NOW()
41+
FROM (
42+
VALUES
43+
('ooo', 'read')
44+
) AS permissions(resource, action)
45+
ON CONFLICT ("roleId", resource, action) DO NOTHING;

0 commit comments

Comments
 (0)