@fonderie/workspaces 4.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -19,7 +19,7 @@ interface IWorkspacesConfig {
19
19
  personalWorkspace?: boolean;
20
20
  routes?: Partial<Record<WorkspaceRouteId, WorkspaceRouteOverride>>;
21
21
  }
22
- type WorkspaceRouteId = 'createWorkspace' | 'listWorkspaces' | 'getWorkspace' | 'updateWorkspace' | 'archive' | 'restore' | 'getSettings' | 'updateSettings' | 'listMembers' | 'removeMember' | 'getMemberRoles' | 'addMemberRole' | 'removeMemberRole' | 'listInvitations' | 'invite' | 'cancelInvitation' | 'acceptInvitation' | 'createRole' | 'listRoles' | 'getRole' | 'updateRole' | 'removeRole' | 'setRolePermissions';
22
+ type WorkspaceRouteId = 'createWorkspace' | 'listWorkspaces' | 'getWorkspace' | 'updateWorkspace' | 'archive' | 'restore' | 'getSettings' | 'updateSettings' | 'listMembers' | 'removeMember' | 'getMemberRoles' | 'addMemberRole' | 'removeMemberRole' | 'listInvitations' | 'invite' | 'cancelInvitation' | 'acceptInvitation' | 'createRole' | 'listRoles' | 'getRole' | 'updateRole' | 'removeRole' | 'getRolePermissions' | 'setRolePermissions';
23
23
  type WorkspaceRouteOverride = string | {
24
24
  method?: string;
25
25
  path?: string;
@@ -214,4 +214,11 @@ interface IImportMembership {
214
214
  }
215
215
  declare function importMembership(store: IStoreAdapter, m: IImportMembership): Promise<void>;
216
216
 
217
- export { EVENT_KEYS, type IImportMembership, type IImportRole, type IImportWorkspace, IInvitation, type IInvitationDTO, IMember, type IMemberDTO, IRole, type IRoleDTO, IWorkspace, type IWorkspaceDTO, IWorkspaceSettings, type IWorkspaceSettingsDTO, type IWorkspacesConfig, MESSAGE_KEYS, type WorkspacesEventKey, type WorkspacesMessageKey, WorkspacesModule, importMembership, importRole, importWorkspace, schemas, toInvitationDTO, toMemberDTO, toRoleDTO, toSettingsDTO, toWorkspaceDTO };
217
+ declare function deleteUserData(store: IStoreAdapter, userId: string): Promise<number>;
218
+ declare function exportUserData(store: IStoreAdapter, userId: string): Promise<unknown>;
219
+ declare function workspaceExportContributor(store: IStoreAdapter): {
220
+ name: string;
221
+ collect: (userId: string) => Promise<unknown>;
222
+ };
223
+
224
+ export { EVENT_KEYS, type IImportMembership, type IImportRole, type IImportWorkspace, IInvitation, type IInvitationDTO, IMember, type IMemberDTO, IRole, type IRoleDTO, IWorkspace, type IWorkspaceDTO, IWorkspaceSettings, type IWorkspaceSettingsDTO, type IWorkspacesConfig, MESSAGE_KEYS, type WorkspacesEventKey, type WorkspacesMessageKey, WorkspacesModule, deleteUserData, exportUserData, importMembership, importRole, importWorkspace, schemas, toInvitationDTO, toMemberDTO, toRoleDTO, toSettingsDTO, toWorkspaceDTO, workspaceExportContributor };
package/dist/index.js CHANGED
@@ -586,6 +586,19 @@ async function setRolePermissions(roleId, workspaceId, permissions, store) {
586
586
  }
587
587
  });
588
588
  }
589
+ async function getRolePermissions(roleId, workspaceId, store) {
590
+ return store.query(
591
+ `SELECT permission_key AS "permissionKey",
592
+ can_create AS "canCreate",
593
+ can_read AS "canRead",
594
+ can_update AS "canUpdate",
595
+ can_delete AS "canDelete"
596
+ FROM fonderie_role_permissions
597
+ WHERE role_id = $1 AND workspace_id = $2
598
+ ORDER BY permission_key`,
599
+ [roleId, workspaceId]
600
+ );
601
+ }
589
602
 
590
603
  // src/models/role.model.ts
591
604
  var RoleModel = class {
@@ -614,6 +627,9 @@ var RoleModel = class {
614
627
  setPermissions(roleId, workspaceId, permissions) {
615
628
  return setRolePermissions(roleId, workspaceId, permissions, this.store);
616
629
  }
630
+ getPermissions(roleId, workspaceId) {
631
+ return getRolePermissions(roleId, workspaceId, this.store);
632
+ }
617
633
  };
618
634
 
619
635
  // src/dtos/workspace.ts
@@ -994,6 +1010,24 @@ function roleController(store) {
994
1010
  await roles.delete(roleId, ctx.workspace.id);
995
1011
  return setApiResponse4(HTTP4.OK, "ROLE_DELETED", "Role deleted successfully.");
996
1012
  },
1013
+ async getPermissions(ctx) {
1014
+ if (!ctx.workspace) {
1015
+ return setApiResponse4(HTTP4.NOT_FOUND, "NOT_FOUND", "Workspace not found");
1016
+ }
1017
+ const params = ctx.meta["params"];
1018
+ const roleId = params?.["roleId"];
1019
+ if (!roleId) {
1020
+ return setApiResponse4(HTTP4.UNPROCESSABLE, "INVALID_PARAMETER", "roleId is required");
1021
+ }
1022
+ const role = await roles.findById(roleId);
1023
+ if (!role) {
1024
+ return setApiResponse4(HTTP4.NOT_FOUND, "NOT_FOUND", "Role not found");
1025
+ }
1026
+ const permissions = await roles.getPermissions(roleId, ctx.workspace.id);
1027
+ return setApiResponse4(HTTP4.OK, "PERMISSIONS_FETCHED", "Role permissions retrieved successfully.", {
1028
+ permissions
1029
+ });
1030
+ },
997
1031
  async setPermissions(ctx) {
998
1032
  if (!ctx.workspace) {
999
1033
  return setApiResponse4(HTTP4.NOT_FOUND, "NOT_FOUND", "Workspace not found");
@@ -1304,6 +1338,7 @@ function buildWorkspaceRoutes(store, config, bus) {
1304
1338
  R("getRole", "GET", "/workspaces/roles/:roleId", requireAuth, wsCtx, role.get),
1305
1339
  R("updateRole", "PUT", "/workspaces/roles/:roleId", requireAuth, wsCtx, validate(updateRoleSchema), role.update),
1306
1340
  R("removeRole", "DELETE", "/workspaces/roles/:roleId", requireAuth, wsCtx, role.remove),
1341
+ R("getRolePermissions", "GET", "/workspaces/roles/:roleId/permissions", requireAuth, wsCtx, role.getPermissions),
1307
1342
  R("setRolePermissions", "POST", "/workspaces/roles/:roleId/permissions", requireAuth, wsCtx, validate(setRolePermissionsSchema), role.setPermissions),
1308
1343
  // ── Workspace lifecycle
1309
1344
  R("archive", "POST", "/workspaces/archive", requireAuth, wsCtx, workspace.archive),
@@ -1460,10 +1495,35 @@ async function importMembership(store, m) {
1460
1495
  vals
1461
1496
  );
1462
1497
  }
1498
+
1499
+ // src/retention.ts
1500
+ async function deleteUserData(store, userId) {
1501
+ const rows = await store.query(
1502
+ `DELETE FROM fonderie_role_user_workspaces WHERE user_id = $1 RETURNING user_id`,
1503
+ [userId]
1504
+ );
1505
+ return rows.length;
1506
+ }
1507
+ async function exportUserData(store, userId) {
1508
+ const rows = await store.query(
1509
+ `SELECT ruw.workspace_id, ruw.role_id, r.name AS role_name
1510
+ FROM fonderie_role_user_workspaces ruw
1511
+ JOIN fonderie_roles r ON r.id = ruw.role_id
1512
+ WHERE ruw.user_id = $1 AND ruw.removed = false
1513
+ ORDER BY ruw.workspace_id`,
1514
+ [userId]
1515
+ );
1516
+ return { memberships: rows };
1517
+ }
1518
+ function workspaceExportContributor(store) {
1519
+ return { name: "workspaces", collect: (userId) => exportUserData(store, userId) };
1520
+ }
1463
1521
  export {
1464
1522
  EVENT_KEYS,
1465
1523
  MESSAGE_KEYS,
1466
1524
  WorkspacesModule,
1525
+ deleteUserData,
1526
+ exportUserData,
1467
1527
  importMembership,
1468
1528
  importRole,
1469
1529
  importWorkspace,
@@ -1474,6 +1534,7 @@ export {
1474
1534
  toRoleDTO,
1475
1535
  toSettingsDTO,
1476
1536
  toWorkspaceDTO,
1477
- withWorkspace
1537
+ withWorkspace,
1538
+ workspaceExportContributor
1478
1539
  };
1479
1540
  //# sourceMappingURL=index.js.map