@fonderie/workspaces 5.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/README.md +2 -2
- package/brain/outcomes.md +1 -0
- package/brain/signatures.md +6 -0
- package/dist/index.cjs +66 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +62 -1
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
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
|
-
|
|
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
|