@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.
@@ -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.42",
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.11",
146
- "@jskit-ai/resource-core": "0.1.11",
147
- "@jskit-ai/resource-crud-core": "0.1.11",
148
- "@jskit-ai/users-core": "0.1.76"
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.42",
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.65",
21
- "@jskit-ai/database-runtime": "0.1.66",
22
- "@jskit-ai/http-runtime": "0.1.65",
23
- "@jskit-ai/json-rest-api-core": "0.1.11",
24
- "@jskit-ai/kernel": "0.1.66",
25
- "@jskit-ai/resource-crud-core": "0.1.11",
26
- "@jskit-ai/resource-core": "0.1.11",
27
- "@jskit-ai/users-core": "0.1.76",
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
- user: normalizedUserId,
294
- status: "active"
295
- }, options);
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 ? [toWorkspaceMembershipRow(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
  });