@jskit-ai/workspaces-core 0.1.42 → 0.1.44
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/package.descriptor.mjs +5 -5
- package/package.json +9 -9
- package/src/server/common/repositories/workspaceMembershipsRepository.js +11 -6
- package/src/shared/resources/workspaceInvitesResource.js +5 -1
- package/src/shared/resources/workspaceMembershipsResource.js +4 -1
- package/src/shared/resources/workspaceResource.js +4 -1
- package/test/resourcesCanonical.test.js +14 -0
- package/test/workspaceMembershipsRepository.test.js +12 -6
package/package.descriptor.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export default Object.freeze({
|
|
2
2
|
packageVersion: 1,
|
|
3
3
|
packageId: "@jskit-ai/workspaces-core",
|
|
4
|
-
version: "0.1.
|
|
4
|
+
version: "0.1.44",
|
|
5
5
|
kind: "runtime",
|
|
6
6
|
description: "Workspace tenancy runtime plus HTTP routes, role catalog, and workspace config scaffolding.",
|
|
7
7
|
dependsOn: [
|
|
@@ -142,10 +142,10 @@ export default Object.freeze({
|
|
|
142
142
|
mutations: {
|
|
143
143
|
dependencies: {
|
|
144
144
|
runtime: {
|
|
145
|
-
"@jskit-ai/json-rest-api-core": "0.1.
|
|
146
|
-
"@jskit-ai/resource-core": "0.1.
|
|
147
|
-
"@jskit-ai/resource-crud-core": "0.1.
|
|
148
|
-
"@jskit-ai/users-core": "0.1.
|
|
145
|
+
"@jskit-ai/json-rest-api-core": "0.1.13",
|
|
146
|
+
"@jskit-ai/resource-core": "0.1.13",
|
|
147
|
+
"@jskit-ai/resource-crud-core": "0.1.13",
|
|
148
|
+
"@jskit-ai/users-core": "0.1.78"
|
|
149
149
|
},
|
|
150
150
|
dev: {}
|
|
151
151
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jskit-ai/workspaces-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.44",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node --test"
|
|
@@ -17,14 +17,14 @@
|
|
|
17
17
|
"./shared/resources/workspaceSettingsResource": "./src/shared/resources/workspaceSettingsResource.js"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@jskit-ai/auth-core": "0.1.
|
|
21
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
22
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
23
|
-
"@jskit-ai/json-rest-api-core": "0.1.
|
|
24
|
-
"@jskit-ai/kernel": "0.1.
|
|
25
|
-
"@jskit-ai/resource-crud-core": "0.1.
|
|
26
|
-
"@jskit-ai/resource-core": "0.1.
|
|
27
|
-
"@jskit-ai/users-core": "0.1.
|
|
20
|
+
"@jskit-ai/auth-core": "0.1.67",
|
|
21
|
+
"@jskit-ai/database-runtime": "0.1.68",
|
|
22
|
+
"@jskit-ai/http-runtime": "0.1.67",
|
|
23
|
+
"@jskit-ai/json-rest-api-core": "0.1.13",
|
|
24
|
+
"@jskit-ai/kernel": "0.1.68",
|
|
25
|
+
"@jskit-ai/resource-crud-core": "0.1.13",
|
|
26
|
+
"@jskit-ai/resource-core": "0.1.13",
|
|
27
|
+
"@jskit-ai/users-core": "0.1.78",
|
|
28
28
|
"json-rest-schema": "1.x.x"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -119,7 +119,8 @@ function createRepository({ api, knex } = {}) {
|
|
|
119
119
|
workspace: normalizedWorkspaceId,
|
|
120
120
|
user: normalizedUserId
|
|
121
121
|
},
|
|
122
|
-
options
|
|
122
|
+
options,
|
|
123
|
+
{ include: ["workspace", "user"] }
|
|
123
124
|
);
|
|
124
125
|
|
|
125
126
|
return normalizeMembershipRecord(rows[0] || null);
|
|
@@ -289,13 +290,17 @@ function createRepository({ api, knex } = {}) {
|
|
|
289
290
|
return [];
|
|
290
291
|
}
|
|
291
292
|
|
|
292
|
-
const rows = await queryMemberships(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
293
|
+
const rows = await queryMemberships(
|
|
294
|
+
{
|
|
295
|
+
user: normalizedUserId,
|
|
296
|
+
status: "active"
|
|
297
|
+
},
|
|
298
|
+
options,
|
|
299
|
+
{ include: ["workspace"] }
|
|
300
|
+
);
|
|
296
301
|
|
|
297
302
|
return rows
|
|
298
|
-
.map((row) => normalizeDbRecordId(row?.workspaceId, { fallback: null }))
|
|
303
|
+
.map((row) => normalizeDbRecordId(row?.workspace?.id || row?.workspaceId, { fallback: null }))
|
|
299
304
|
.filter(Boolean);
|
|
300
305
|
}
|
|
301
306
|
|
|
@@ -5,7 +5,11 @@ const workspaceInvitesResource = defineCrudResource({
|
|
|
5
5
|
namespace: "workspaceInvites",
|
|
6
6
|
tableName: "workspace_invites",
|
|
7
7
|
searchSchema: {
|
|
8
|
-
id: { type: "id", actualField: "id" }
|
|
8
|
+
id: { type: "id", actualField: "id" },
|
|
9
|
+
workspace: { type: "id", actualField: "workspace_id", filterOperator: "=" },
|
|
10
|
+
email: { type: "string", actualField: "email", filterOperator: "=" },
|
|
11
|
+
status: { type: "string", actualField: "status", filterOperator: "=" },
|
|
12
|
+
tokenHash: { type: "string", actualField: "token_hash", filterOperator: "=" }
|
|
9
13
|
},
|
|
10
14
|
schema: {
|
|
11
15
|
workspaceId: {
|
|
@@ -5,7 +5,10 @@ const workspaceMembershipsResource = defineCrudResource({
|
|
|
5
5
|
namespace: "workspaceMemberships",
|
|
6
6
|
tableName: "workspace_memberships",
|
|
7
7
|
searchSchema: {
|
|
8
|
-
id: { type: "id", actualField: "id" }
|
|
8
|
+
id: { type: "id", actualField: "id" },
|
|
9
|
+
workspace: { type: "id", actualField: "workspace_id", filterOperator: "=" },
|
|
10
|
+
user: { type: "id", actualField: "user_id", filterOperator: "=" },
|
|
11
|
+
status: { type: "string", actualField: "status", filterOperator: "=" }
|
|
9
12
|
},
|
|
10
13
|
schema: {
|
|
11
14
|
workspaceId: {
|
|
@@ -61,7 +61,10 @@ const resource = defineCrudResource({
|
|
|
61
61
|
namespace: "workspace",
|
|
62
62
|
tableName: "workspaces",
|
|
63
63
|
searchSchema: {
|
|
64
|
-
id: { type: "id", actualField: "id" }
|
|
64
|
+
id: { type: "id", actualField: "id" },
|
|
65
|
+
slug: { type: "string", actualField: "slug", filterOperator: "=" },
|
|
66
|
+
owner: { type: "id", actualField: "owner_user_id", filterOperator: "=" },
|
|
67
|
+
isPersonal: { type: "boolean", actualField: "is_personal", filterOperator: "=" }
|
|
65
68
|
},
|
|
66
69
|
schema: {
|
|
67
70
|
slug: {
|
|
@@ -55,6 +55,20 @@ test("workspaces-core resources expose messages for all operations", () => {
|
|
|
55
55
|
}
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
+
test("workspaces-core repository filters are declared on canonical resources", () => {
|
|
59
|
+
assert.deepEqual(Object.keys(workspaceResource.searchSchema), ["id", "slug", "owner", "isPersonal"]);
|
|
60
|
+
assert.equal(workspaceResource.searchSchema.slug.actualField, "slug");
|
|
61
|
+
assert.equal(workspaceResource.searchSchema.owner.actualField, "owner_user_id");
|
|
62
|
+
|
|
63
|
+
assert.deepEqual(Object.keys(workspaceMembershipsResource.searchSchema), ["id", "workspace", "user", "status"]);
|
|
64
|
+
assert.equal(workspaceMembershipsResource.searchSchema.workspace.actualField, "workspace_id");
|
|
65
|
+
assert.equal(workspaceMembershipsResource.searchSchema.user.actualField, "user_id");
|
|
66
|
+
|
|
67
|
+
assert.deepEqual(Object.keys(workspaceInvitesResource.searchSchema), ["id", "workspace", "email", "status", "tokenHash"]);
|
|
68
|
+
assert.equal(workspaceInvitesResource.searchSchema.workspace.actualField, "workspace_id");
|
|
69
|
+
assert.equal(workspaceInvitesResource.searchSchema.tokenHash.actualField, "token_hash");
|
|
70
|
+
});
|
|
71
|
+
|
|
58
72
|
test("workspaces-core specialized resource operations expose messages and validators", () => {
|
|
59
73
|
const operationSpecs = [
|
|
60
74
|
{ label: "workspaceMembers.rolesList", operation: workspaceMembersResource.operations.rolesList },
|
|
@@ -24,12 +24,10 @@ function asCollectionDocument(rows = []) {
|
|
|
24
24
|
function toWorkspaceMembershipRow(row = {}) {
|
|
25
25
|
return {
|
|
26
26
|
id: String(row.id || ""),
|
|
27
|
-
workspaceId: row?.workspace?.id == null ? null : String(row.workspace.id),
|
|
28
27
|
workspace: row?.workspace?.id == null ? null : {
|
|
29
28
|
...row.workspace,
|
|
30
29
|
id: String(row.workspace.id)
|
|
31
30
|
},
|
|
32
|
-
userId: row?.user?.id == null ? null : String(row.user.id),
|
|
33
31
|
user: row?.user?.id == null
|
|
34
32
|
? null
|
|
35
33
|
: {
|
|
@@ -63,8 +61,16 @@ function createWorkspaceMembershipsApiStub({
|
|
|
63
61
|
const includeUser = Array.isArray(queryParams?.include) && queryParams.include.includes("user");
|
|
64
62
|
|
|
65
63
|
if (Object.hasOwn(filters, "workspace") && Object.hasOwn(filters, "user")) {
|
|
64
|
+
const includeWorkspace = Array.isArray(queryParams?.include) && queryParams.include.includes("workspace");
|
|
65
|
+
const includeUser = Array.isArray(queryParams?.include) && queryParams.include.includes("user");
|
|
66
66
|
const row = rowByComposite.get(`${filters.workspace}:${filters.user}`) || null;
|
|
67
|
-
return asCollectionDocument(row
|
|
67
|
+
return asCollectionDocument(row
|
|
68
|
+
? [toWorkspaceMembershipRow({
|
|
69
|
+
...row,
|
|
70
|
+
workspace: includeWorkspace ? row.workspace : null,
|
|
71
|
+
user: includeUser ? row.user : null
|
|
72
|
+
})]
|
|
73
|
+
: []);
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
if (Object.hasOwn(filters, "workspace") && Object.hasOwn(filters, "status") && includeUser) {
|
|
@@ -86,8 +92,7 @@ function createWorkspaceMembershipsApiStub({
|
|
|
86
92
|
...toWorkspaceMembershipRow({
|
|
87
93
|
...row,
|
|
88
94
|
workspace: null
|
|
89
|
-
})
|
|
90
|
-
workspaceId: row?.workspace?.id == null ? null : String(row.workspace.id)
|
|
95
|
+
})
|
|
91
96
|
};
|
|
92
97
|
}));
|
|
93
98
|
}
|
|
@@ -277,7 +282,8 @@ test("workspaceMembershipsRepository.listActiveWorkspaceIdsByUserId returns norm
|
|
|
277
282
|
filters: {
|
|
278
283
|
user: "9",
|
|
279
284
|
status: "active"
|
|
280
|
-
}
|
|
285
|
+
},
|
|
286
|
+
include: ["workspace"]
|
|
281
287
|
}
|
|
282
288
|
]);
|
|
283
289
|
});
|