@jskit-ai/workspaces-core 0.1.113 → 0.1.115

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.113",
4
+ version: "0.1.115",
5
5
  kind: "runtime",
6
6
  description: "Workspace tenancy runtime plus HTTP routes, role catalog, and workspace config scaffolding.",
7
7
  dependsOn: [
@@ -147,10 +147,10 @@ export default Object.freeze({
147
147
  mutations: {
148
148
  dependencies: {
149
149
  runtime: {
150
- "@jskit-ai/json-rest-api-core": "0.1.79",
151
- "@jskit-ai/resource-core": "0.1.78",
152
- "@jskit-ai/resource-crud-core": "0.1.78",
153
- "@jskit-ai/users-core": "0.1.146"
150
+ "@jskit-ai/json-rest-api-core": "0.1.80",
151
+ "@jskit-ai/resource-core": "0.1.79",
152
+ "@jskit-ai/resource-crud-core": "0.1.79",
153
+ "@jskit-ai/users-core": "0.1.148"
154
154
  },
155
155
  dev: {}
156
156
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/workspaces-core",
3
- "version": "0.1.113",
3
+ "version": "0.1.115",
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.133",
21
- "@jskit-ai/database-runtime": "0.1.134",
22
- "@jskit-ai/http-runtime": "0.1.133",
23
- "@jskit-ai/json-rest-api-core": "0.1.79",
24
- "@jskit-ai/kernel": "0.1.135",
25
- "@jskit-ai/resource-crud-core": "0.1.78",
26
- "@jskit-ai/resource-core": "0.1.78",
27
- "@jskit-ai/users-core": "0.1.146",
20
+ "@jskit-ai/auth-core": "0.1.134",
21
+ "@jskit-ai/database-runtime": "0.1.135",
22
+ "@jskit-ai/http-runtime": "0.1.134",
23
+ "@jskit-ai/json-rest-api-core": "0.1.80",
24
+ "@jskit-ai/kernel": "0.1.136",
25
+ "@jskit-ai/resource-crud-core": "0.1.79",
26
+ "@jskit-ai/resource-core": "0.1.79",
27
+ "@jskit-ai/users-core": "0.1.148",
28
28
  "json-rest-schema": "1.x.x"
29
29
  }
30
30
  }
@@ -61,7 +61,7 @@ function bootWorkspaceDirectoryRoutes(app) {
61
61
  actionId: "workspace.workspaces.create",
62
62
  input: {
63
63
  name: body.name,
64
- slug: body.slug
64
+ ...(Object.hasOwn(body, "slug") ? { slug: body.slug } : {})
65
65
  }
66
66
  });
67
67
  reply.code(200).send(response);
@@ -338,6 +338,37 @@ test("workspaceService.createWorkspaceForAuthenticatedUser creates non-personal
338
338
  assert.equal(workspace.slug, "ops-team");
339
339
  assert.equal(calls.insert, 1);
340
340
  assert.equal(calls.ensureOwnerMembership, 1);
341
+ assert.equal(calls.ensureWorkspaceSettings, 1);
342
+ assert.equal(insertedPayloads[0].isPersonal, false);
343
+ assert.equal(insertedPayloads[0].ownerUserId, "7");
344
+ });
345
+
346
+ test("workspaceService.createWorkspaceForAuthenticatedUser generates an omitted slug and provisions ownership", async () => {
347
+ const { service, calls, insertedPayloads } = createWorkspaceServiceFixture({
348
+ tenancyMode: "workspaces",
349
+ tenancyPolicy: {
350
+ workspace: {
351
+ allowSelfCreate: true
352
+ }
353
+ }
354
+ });
355
+
356
+ const workspace = await service.createWorkspaceForAuthenticatedUser(
357
+ {
358
+ id: "7",
359
+ email: "chiaramobily@gmail.com",
360
+ displayName: "Chiara"
361
+ },
362
+ {
363
+ name: "Operations Team"
364
+ }
365
+ );
366
+
367
+ assert.equal(workspace.slug, "operations-team");
368
+ assert.equal(calls.insert, 1);
369
+ assert.equal(calls.ensureOwnerMembership, 1);
370
+ assert.equal(calls.ensureWorkspaceSettings, 1);
371
+ assert.equal(insertedPayloads[0].slug, "operations-team");
341
372
  assert.equal(insertedPayloads[0].isPersonal, false);
342
373
  assert.equal(insertedPayloads[0].ownerUserId, "7");
343
374
  });
@@ -340,6 +340,34 @@ test("workspaces-core boot skips invitation redeem/list routes when workspace in
340
340
  assert.equal(findRoute(routes, { method: "DELETE", path: "/api/w/:workspaceSlug/invites/:inviteId" }), null);
341
341
  });
342
342
 
343
+ test("workspace create handler preserves an omitted optional slug", async () => {
344
+ const routes = await registerRoutes();
345
+ const workspaceCreate = findRoute(routes, {
346
+ method: "POST",
347
+ path: "/api/workspaces"
348
+ });
349
+ const calls = [];
350
+
351
+ await workspaceCreate.handler(
352
+ createActionRequest({
353
+ input: {
354
+ body: { name: "Operations Team" }
355
+ },
356
+ executeAction: async (payload) => {
357
+ calls.push(payload);
358
+ return {};
359
+ }
360
+ }),
361
+ createReplyDouble()
362
+ );
363
+
364
+ assert.deepEqual(calls, [{
365
+ actionId: "workspace.workspaces.create",
366
+ input: { name: "Operations Team" }
367
+ }]);
368
+ assert.equal(Object.hasOwn(calls[0].input, "slug"), false);
369
+ });
370
+
343
371
  test("workspace invite and member handlers build action input from request.input", async () => {
344
372
  const routes = await registerRoutes();
345
373
  const workspaceCreate = findRoute(routes, {