@jskit-ai/users-core 0.1.32 → 0.1.35

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.
Files changed (48) hide show
  1. package/package.descriptor.mjs +16 -245
  2. package/package.json +7 -7
  3. package/src/server/UsersCoreServiceProvider.js +4 -28
  4. package/src/server/UsersWorkspacesServiceProvider.js +44 -0
  5. package/src/server/accountNotifications/accountNotificationsService.js +3 -3
  6. package/src/server/accountNotifications/registerAccountNotifications.js +1 -1
  7. package/src/server/accountPreferences/accountPreferencesService.js +3 -3
  8. package/src/server/accountPreferences/registerAccountPreferences.js +1 -1
  9. package/src/server/accountProfile/accountProfileActions.js +8 -2
  10. package/src/server/accountProfile/accountProfileService.js +10 -10
  11. package/src/server/accountProfile/avatarService.js +9 -9
  12. package/src/server/accountProfile/bootAccountProfileRoutes.js +5 -3
  13. package/src/server/accountProfile/registerAccountProfile.js +2 -2
  14. package/src/server/accountSecurity/accountSecurityService.js +3 -3
  15. package/src/server/accountSecurity/registerAccountSecurity.js +1 -1
  16. package/src/server/common/contributors/workspaceActionContextContributor.js +24 -17
  17. package/src/server/common/registerCommonRepositories.js +3 -22
  18. package/src/server/common/repositories/userSettingsRepository.js +1 -12
  19. package/src/server/common/repositories/{userProfilesRepository.js → usersRepository.js} +1 -1
  20. package/src/server/common/services/accountContextService.js +4 -4
  21. package/src/server/common/services/authProfileSyncService.js +10 -10
  22. package/src/server/registerUsersBootstrap.js +22 -0
  23. package/src/server/registerUsersCore.js +30 -0
  24. package/src/server/registerWorkspaceBootstrap.js +3 -6
  25. package/src/server/registerWorkspaceCore.js +5 -17
  26. package/src/server/registerWorkspaceRepositories.js +26 -0
  27. package/src/server/usersBootstrapContributor.js +248 -0
  28. package/src/server/workspaceBootstrapContributor.js +65 -259
  29. package/src/shared/roles.js +31 -6
  30. package/src/shared/settings.js +1 -2
  31. package/templates/migrations/users_core_generic_initial.cjs +69 -0
  32. package/test/authProfileSyncService.test.js +3 -3
  33. package/test/avatarService.test.js +2 -2
  34. package/test/registerUsersCore.test.js +42 -0
  35. package/test/roles.test.js +90 -5
  36. package/test/usersBootstrapContributor.test.js +172 -0
  37. package/test/usersRouteRequestInputValidator.test.js +7 -390
  38. package/test/workspaceActionContextContributor.test.js +98 -5
  39. package/test/workspaceBootstrapContributor.test.js +34 -346
  40. package/test/workspaceMembersService.test.js +4 -2
  41. package/test/workspaceService.test.js +12 -8
  42. package/test/workspaceSettingsResource.test.js +4 -2
  43. package/test-support/registerDefaultSettingsFields.js +1 -1
  44. package/templates/config/workspaceRoles.js +0 -30
  45. package/templates/migrations/users_core_initial.cjs +0 -123
  46. package/templates/migrations/users_core_workspace_settings_single_name_source.cjs +0 -71
  47. package/templates/migrations/users_core_workspaces_drop_color.cjs +0 -85
  48. package/templates/packages/main/src/shared/resources/workspaceSettingsFields.js +0 -197
@@ -1,9 +1,9 @@
1
1
  export default Object.freeze({
2
2
  packageVersion: 1,
3
3
  packageId: "@jskit-ai/users-core",
4
- version: "0.1.32",
4
+ version: "0.1.35",
5
5
  kind: "runtime",
6
- description: "Users/workspace domain runtime plus HTTP routes for workspace, account, and console features.",
6
+ description: "Users/account runtime plus HTTP routes for account and console features.",
7
7
  dependsOn: [
8
8
  "@jskit-ai/auth-core",
9
9
  "@jskit-ai/database-runtime",
@@ -44,11 +44,11 @@ export default Object.freeze({
44
44
  {
45
45
  subpath: "./server",
46
46
  summary:
47
- "Exports UsersCoreServiceProvider, users/workspace/console repositories/services, feature route registration modules, and action definitions."
47
+ "Exports UsersCoreServiceProvider, users/console repositories and services, account feature route registration modules, and action definitions."
48
48
  },
49
49
  {
50
50
  subpath: "./shared",
51
- summary: "Exports shared users/workspace role and settings utilities."
51
+ summary: "Exports shared users settings and tenancy utilities."
52
52
  },
53
53
  {
54
54
  subpath: "./client",
@@ -62,66 +62,6 @@ export default Object.freeze({
62
62
  },
63
63
  server: {
64
64
  routes: [
65
- {
66
- method: "POST",
67
- path: "/api/workspaces",
68
- summary: "Create a workspace for the authenticated user."
69
- },
70
- {
71
- method: "GET",
72
- path: "/api/workspaces",
73
- summary: "List workspaces visible to authenticated user."
74
- },
75
- {
76
- method: "GET",
77
- path: "/api/workspace/invitations/pending",
78
- summary: "List pending workspace invitations for authenticated user."
79
- },
80
- {
81
- method: "POST",
82
- path: "/api/workspace/invitations/redeem",
83
- summary: "Accept or refuse a workspace invitation using an invite token."
84
- },
85
- {
86
- method: "GET",
87
- path: "/api/w/:workspaceSlug/settings",
88
- summary: "Get workspace settings and role catalog by workspace slug."
89
- },
90
- {
91
- method: "PATCH",
92
- path: "/api/w/:workspaceSlug/settings",
93
- summary: "Update workspace settings by workspace slug."
94
- },
95
- {
96
- method: "GET",
97
- path: "/api/w/:workspaceSlug/roles",
98
- summary: "Get workspace role catalog by workspace slug."
99
- },
100
- {
101
- method: "GET",
102
- path: "/api/w/:workspaceSlug/members",
103
- summary: "List members by workspace slug."
104
- },
105
- {
106
- method: "PATCH",
107
- path: "/api/w/:workspaceSlug/members/:memberUserId/role",
108
- summary: "Update workspace member role by workspace slug."
109
- },
110
- {
111
- method: "GET",
112
- path: "/api/w/:workspaceSlug/invites",
113
- summary: "List workspace invites by workspace slug."
114
- },
115
- {
116
- method: "POST",
117
- path: "/api/w/:workspaceSlug/invites",
118
- summary: "Create workspace invite by workspace slug."
119
- },
120
- {
121
- method: "DELETE",
122
- path: "/api/w/:workspaceSlug/invites/:inviteId",
123
- summary: "Revoke workspace invite by workspace slug."
124
- },
125
65
  {
126
66
  method: "GET",
127
67
  path: "/api/settings",
@@ -198,36 +138,29 @@ export default Object.freeze({
198
138
  mutations: {
199
139
  dependencies: {
200
140
  runtime: {
201
- "@jskit-ai/auth-core": "0.1.22",
202
- "@jskit-ai/database-runtime": "0.1.23",
203
- "@jskit-ai/http-runtime": "0.1.22",
204
- "@jskit-ai/kernel": "0.1.23",
205
- "@jskit-ai/uploads-runtime": "0.1.1",
141
+ "@jskit-ai/auth-core": "0.1.24",
142
+ "@jskit-ai/database-runtime": "0.1.25",
143
+ "@jskit-ai/http-runtime": "0.1.24",
144
+ "@jskit-ai/kernel": "0.1.25",
145
+ "@jskit-ai/uploads-runtime": "0.1.3",
206
146
  "@fastify/type-provider-typebox": "^6.1.0",
207
- "typebox": "^1.0.81"
147
+ typebox: "^1.0.81"
208
148
  },
209
149
  dev: {}
210
150
  },
211
151
  packageJson: {
212
- scripts: {
213
- "server:app": "SERVER_SURFACE=app node ./bin/server.js",
214
- "server:admin": "SERVER_SURFACE=admin node ./bin/server.js",
215
- "dev:app": "VITE_SURFACE=app vite",
216
- "dev:admin": "VITE_SURFACE=admin vite",
217
- "build:app": "VITE_SURFACE=app vite build",
218
- "build:admin": "VITE_SURFACE=admin vite build"
219
- }
152
+ scripts: {}
220
153
  },
221
154
  procfile: {},
222
155
  files: [
223
156
  {
224
157
  op: "install-migration",
225
- from: "templates/migrations/users_core_initial.cjs",
158
+ from: "templates/migrations/users_core_generic_initial.cjs",
226
159
  toDir: "migrations",
227
160
  extension: ".cjs",
228
- reason: "Install users/workspace core schema migration.",
161
+ reason: "Install users/account core schema migration.",
229
162
  category: "migration",
230
- id: "users-core-initial-schema"
163
+ id: "users-core-generic-initial-schema"
231
164
  },
232
165
  {
233
166
  op: "install-migration",
@@ -243,36 +176,10 @@ export default Object.freeze({
243
176
  from: "templates/migrations/users_core_console_owner.cjs",
244
177
  toDir: "migrations",
245
178
  extension: ".cjs",
246
- reason: "Install users/workspace console owner migration.",
179
+ reason: "Install console owner migration.",
247
180
  category: "migration",
248
181
  id: "users-core-console-owner-schema"
249
182
  },
250
- {
251
- op: "install-migration",
252
- from: "templates/migrations/users_core_workspace_settings_single_name_source.cjs",
253
- toDir: "migrations",
254
- extension: ".cjs",
255
- reason: "Remove workspace_settings name/avatar fields so workspace identity data comes from workspaces only.",
256
- category: "migration",
257
- id: "users-core-workspace-settings-single-name-source"
258
- },
259
- {
260
- op: "install-migration",
261
- from: "templates/migrations/users_core_workspaces_drop_color.cjs",
262
- toDir: "migrations",
263
- extension: ".cjs",
264
- reason: "Drop legacy workspaces.color now that workspace theme colors live in workspace_settings.",
265
- category: "migration",
266
- id: "users-core-workspaces-drop-color"
267
- },
268
- {
269
- from: "templates/packages/main/src/shared/resources/workspaceSettingsFields.js",
270
- to: "packages/main/src/shared/resources/workspaceSettingsFields.js",
271
- preserveOnRemove: true,
272
- reason: "Install app-owned workspace settings field definitions.",
273
- category: "users-core",
274
- id: "users-core-app-owned-workspace-settings-fields"
275
- },
276
183
  {
277
184
  from: "templates/packages/main/src/shared/resources/consoleSettingsFields.js",
278
185
  to: "packages/main/src/shared/resources/consoleSettingsFields.js",
@@ -288,14 +195,6 @@ export default Object.freeze({
288
195
  reason: "Install app-owned user settings field definitions.",
289
196
  category: "users-core",
290
197
  id: "users-core-app-owned-user-settings-fields"
291
- },
292
- {
293
- from: "templates/config/workspaceRoles.js",
294
- to: "config/workspaceRoles.js",
295
- preserveOnRemove: true,
296
- reason: "Install app-owned workspace role catalog in a dedicated config file.",
297
- category: "users-core",
298
- id: "users-core-app-owned-workspace-roles-config"
299
198
  }
300
199
  ],
301
200
  text: [
@@ -308,16 +207,6 @@ export default Object.freeze({
308
207
  category: "runtime-config",
309
208
  id: "users-core-auth-profile-mode"
310
209
  },
311
- {
312
- op: "append-text",
313
- file: "packages/main/src/shared/index.js",
314
- position: "top",
315
- skipIfContains: "import \"./resources/workspaceSettingsFields.js\";",
316
- value: "import \"./resources/workspaceSettingsFields.js\";\n",
317
- reason: "Load app-owned workspace settings field definitions inside the main shared module.",
318
- category: "users-core",
319
- id: "users-core-main-shared-workspace-settings-field-import"
320
- },
321
210
  {
322
211
  op: "append-text",
323
212
  file: "packages/main/src/shared/index.js",
@@ -357,125 +246,7 @@ export default Object.freeze({
357
246
  reason: "Ensure server runtime loads app-owned shared settings field registration.",
358
247
  category: "users-core",
359
248
  id: "users-core-server-import-main-shared"
360
- },
361
- {
362
- op: "append-text",
363
- file: "config/public.js",
364
- position: "top",
365
- skipIfContains: "import { workspaceRoles } from \"./workspaceRoles.js\";",
366
- value: "import { workspaceRoles } from \"./workspaceRoles.js\";\n",
367
- reason: "Load app-owned workspace role catalog from dedicated config file.",
368
- category: "users-core",
369
- id: "users-core-workspace-roles-public-import"
370
- },
371
- {
372
- op: "append-text",
373
- file: "config/public.js",
374
- position: "top",
375
- skipIfContains: "import { surfaceAccessPolicies } from \"./surfaceAccessPolicies.js\";",
376
- value: "import { surfaceAccessPolicies } from \"./surfaceAccessPolicies.js\";\n",
377
- reason: "Load app-owned surface access policy catalog from dedicated config file.",
378
- category: "users-core",
379
- id: "users-core-surface-access-policies-public-import"
380
- },
381
- {
382
- op: "append-text",
383
- file: "config/surfaceAccessPolicies.js",
384
- position: "top",
385
- skipIfContains: "export const surfaceAccessPolicies = {};",
386
- value: "export const surfaceAccessPolicies = {};\n\n",
387
- reason: "Initialize app-owned surface access policy config if missing.",
388
- category: "users-core",
389
- id: "users-core-surface-access-policies-config-init"
390
- },
391
- {
392
- op: "append-text",
393
- file: "config/surfaceAccessPolicies.js",
394
- position: "bottom",
395
- skipIfContains: "surfaceAccessPolicies.workspace_member = {",
396
- value: "\nsurfaceAccessPolicies.workspace_member = {\n requireAuth: true,\n requireWorkspaceMembership: true\n};\n",
397
- reason: "Register workspace-member surface access policy for workspace surfaces.",
398
- category: "users-core",
399
- id: "users-core-surface-access-policies-workspace-member"
400
- },
401
- {
402
- op: "append-text",
403
- file: "config/public.js",
404
- position: "bottom",
405
- skipIfContains: "config.surfaceDefinitions.app = {",
406
- value:
407
- "\nconfig.surfaceDefinitions.app = {\n id: \"app\",\n label: \"App\",\n pagesRoot: \"w/[workspaceSlug]\",\n enabled: true,\n requiresAuth: true,\n requiresWorkspace: true,\n accessPolicyId: \"workspace_member\",\n origin: \"\"\n};\n\nconfig.surfaceDefinitions.admin = {\n id: \"admin\",\n label: \"Admin\",\n pagesRoot: \"w/[workspaceSlug]/admin\",\n enabled: true,\n requiresAuth: true,\n requiresWorkspace: true,\n accessPolicyId: \"workspace_member\",\n origin: \"\"\n};\n",
408
- reason: "Append workspace surface topology when tenancy enables workspace routing.",
409
- category: "users-core",
410
- id: "users-core-surface-config-workspace",
411
- when: {
412
- config: "tenancyMode",
413
- in: ["personal", "workspaces"]
414
- }
415
- },
416
- {
417
- op: "append-text",
418
- file: "config/public.js",
419
- position: "bottom",
420
- skipIfContains: "config.workspaceSwitching =",
421
- value:
422
- "\nconfig.workspaceSwitching = true;\nconfig.workspaceInvitations = {\n enabled: true,\n allowInPersonalMode: true\n};\nconfig.assistantEnabled = false;\nconfig.assistantRequiredPermission = \"\";\nconfig.socialEnabled = false;\nconfig.socialFederationEnabled = false;\n",
423
- reason: "Append default public users/workspace feature toggles into app-owned config.",
424
- category: "users-core",
425
- id: "users-core-public-config"
426
- },
427
- {
428
- op: "append-text",
429
- file: "config/public.js",
430
- position: "bottom",
431
- skipIfContains: "config.workspaceRoles = workspaceRoles;",
432
- value: "\nconfig.workspaceRoles = workspaceRoles;\n",
433
- reason: "Bind app-owned workspace role catalog onto public config.",
434
- category: "users-core",
435
- id: "users-core-workspace-roles-public-config"
436
- },
437
- {
438
- op: "append-text",
439
- file: "config/public.js",
440
- position: "bottom",
441
- skipIfContains: "config.surfaceAccessPolicies = surfaceAccessPolicies;",
442
- value: "\nconfig.surfaceAccessPolicies = surfaceAccessPolicies;\n",
443
- reason: "Bind app-owned surface access policies onto public config.",
444
- category: "users-core",
445
- id: "users-core-surface-access-policies-public-config"
446
- },
447
- {
448
- op: "append-text",
449
- file: "config/server.js",
450
- position: "bottom",
451
- skipIfContains: "config.workspaceColor =",
452
- value: "\nconfig.workspaceColor = \"#1867C0\";\n",
453
- reason: "Append default server-only users/workspace settings into app-owned config.",
454
- category: "users-core",
455
- id: "users-core-server-config"
456
- },
457
- {
458
- op: "append-text",
459
- file: "config/server.js",
460
- position: "bottom",
461
- skipIfContains: "config.workspaceSettings =",
462
- value:
463
- "\nconfig.workspaceSettings = {\n defaults: {\n invitesEnabled: true\n }\n};\n",
464
- reason: "Append app-owned workspace settings defaults into the server config.",
465
- category: "users-core",
466
- id: "users-core-workspace-settings-server-config"
467
- },
468
- {
469
- op: "append-text",
470
- file: "config/server.js",
471
- position: "bottom",
472
- skipIfContains: "config.workspaceMembers =",
473
- value:
474
- "\nconfig.workspaceMembers = {\n defaults: {\n inviteExpiresInMs: 604800000\n }\n};\n",
475
- reason: "Append app-owned workspace member invite policy defaults into the server config.",
476
- category: "users-core",
477
- id: "users-core-workspace-members-server-config"
478
- },
249
+ }
479
250
  ]
480
251
  }
481
252
  });
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@jskit-ai/users-core",
3
- "version": "0.1.32",
3
+ "version": "0.1.35",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "test": "node --test"
7
7
  },
8
8
  "exports": {
9
- "./server/support/workspaceActionSurfaces": "./src/server/support/workspaceActionSurfaces.js",
9
+ "./server/UsersWorkspacesServiceProvider": "./src/server/UsersWorkspacesServiceProvider.js",
10
10
  "./server/support/workspaceRouteInput": "./src/server/support/workspaceRouteInput.js",
11
11
  "./server/support/resolveWorkspace": "./src/server/support/resolveWorkspace.js",
12
12
  "./server/validators/routeParamsValidator": "./src/server/common/validators/routeParamsValidator.js",
@@ -24,11 +24,11 @@
24
24
  "./shared/resources/consoleSettingsFields": "./src/shared/resources/consoleSettingsFields.js"
25
25
  },
26
26
  "dependencies": {
27
- "@jskit-ai/auth-core": "0.1.22",
28
- "@jskit-ai/database-runtime": "0.1.23",
29
- "@jskit-ai/http-runtime": "0.1.22",
30
- "@jskit-ai/kernel": "0.1.23",
31
- "@jskit-ai/uploads-runtime": "0.1.1",
27
+ "@jskit-ai/auth-core": "0.1.24",
28
+ "@jskit-ai/database-runtime": "0.1.25",
29
+ "@jskit-ai/http-runtime": "0.1.24",
30
+ "@jskit-ai/kernel": "0.1.25",
31
+ "@jskit-ai/uploads-runtime": "0.1.3",
32
32
  "@fastify/type-provider-typebox": "^6.1.0",
33
33
  "typebox": "^1.0.81"
34
34
  }
@@ -1,14 +1,4 @@
1
1
  import { USERS_SHARED_API } from "../shared/index.js";
2
- import { bootWorkspaceDirectoryRoutes } from "./workspaceDirectory/bootWorkspaceDirectoryRoutes.js";
3
- import { registerWorkspaceDirectory } from "./workspaceDirectory/registerWorkspaceDirectory.js";
4
- import {
5
- registerWorkspacePendingInvitations
6
- } from "./workspacePendingInvitations/registerWorkspacePendingInvitations.js";
7
- import { bootWorkspacePendingInvitations } from "./workspacePendingInvitations/bootWorkspacePendingInvitations.js";
8
- import { registerWorkspaceMembers } from "./workspaceMembers/registerWorkspaceMembers.js";
9
- import { bootWorkspaceMembers } from "./workspaceMembers/bootWorkspaceMembers.js";
10
- import { registerWorkspaceSettings } from "./workspaceSettings/registerWorkspaceSettings.js";
11
- import { bootWorkspaceSettings } from "./workspaceSettings/bootWorkspaceSettings.js";
12
2
  import { bootAccountProfileRoutes } from "./accountProfile/bootAccountProfileRoutes.js";
13
3
  import { bootAccountPreferencesRoutes } from "./accountPreferences/bootAccountPreferencesRoutes.js";
14
4
  import { bootAccountNotificationsRoutes } from "./accountNotifications/bootAccountNotificationsRoutes.js";
@@ -16,14 +6,13 @@ import { bootAccountSecurityRoutes } from "./accountSecurity/bootAccountSecurity
16
6
  import { bootConsoleSettingsRoutes } from "./consoleSettings/bootConsoleSettingsRoutes.js";
17
7
  import { registerSharedApi } from "./common/registerSharedApi.js";
18
8
  import { registerCommonRepositories } from "./common/registerCommonRepositories.js";
19
- import { registerWorkspaceCore } from "./registerWorkspaceCore.js";
20
- import { registerWorkspaceBootstrap } from "./registerWorkspaceBootstrap.js";
9
+ import { registerUsersCore } from "./registerUsersCore.js";
10
+ import { registerUsersBootstrap } from "./registerUsersBootstrap.js";
21
11
  import { registerAccountPreferences } from "./accountPreferences/registerAccountPreferences.js";
22
12
  import { registerAccountNotifications } from "./accountNotifications/registerAccountNotifications.js";
23
13
  import { registerAccountProfile } from "./accountProfile/registerAccountProfile.js";
24
14
  import { registerAccountSecurity } from "./accountSecurity/registerAccountSecurity.js";
25
15
  import { registerConsoleSettings } from "./consoleSettings/registerConsoleSettings.js";
26
- import { registerUsersCoreActionSurfaceSources } from "./support/workspaceActionSurfaces.js";
27
16
 
28
17
  class UsersCoreServiceProvider {
29
18
  static id = "users.core";
@@ -31,15 +20,10 @@ class UsersCoreServiceProvider {
31
20
  static dependsOn = ["runtime.server", "runtime.actions", "runtime.database", "runtime.storage", "auth.provider", "runtime.uploads"];
32
21
 
33
22
  register(app) {
34
- registerUsersCoreActionSurfaceSources(app);
35
23
  registerSharedApi(app, USERS_SHARED_API);
36
24
  registerCommonRepositories(app);
37
- registerWorkspaceCore(app);
38
- registerWorkspaceBootstrap(app);
39
- registerWorkspaceDirectory(app);
40
- registerWorkspaceMembers(app);
41
- registerWorkspaceSettings(app);
42
- registerWorkspacePendingInvitations(app);
25
+ registerUsersCore(app);
26
+ registerUsersBootstrap(app);
43
27
 
44
28
  registerAccountProfile(app);
45
29
  registerAccountPreferences(app);
@@ -49,14 +33,6 @@ class UsersCoreServiceProvider {
49
33
  }
50
34
 
51
35
  async boot(app) {
52
- if (app.make("users.workspace.enabled") === true) {
53
- bootWorkspaceDirectoryRoutes(app);
54
- if (app.make("users.workspace.invitations.enabled") === true) {
55
- bootWorkspacePendingInvitations(app);
56
- }
57
- bootWorkspaceSettings(app);
58
- bootWorkspaceMembers(app);
59
- }
60
36
  bootAccountProfileRoutes(app);
61
37
  bootAccountPreferencesRoutes(app);
62
38
  bootAccountNotificationsRoutes(app);
@@ -0,0 +1,44 @@
1
+ import { bootWorkspaceDirectoryRoutes } from "./workspaceDirectory/bootWorkspaceDirectoryRoutes.js";
2
+ import { registerWorkspaceDirectory } from "./workspaceDirectory/registerWorkspaceDirectory.js";
3
+ import {
4
+ registerWorkspacePendingInvitations
5
+ } from "./workspacePendingInvitations/registerWorkspacePendingInvitations.js";
6
+ import { bootWorkspacePendingInvitations } from "./workspacePendingInvitations/bootWorkspacePendingInvitations.js";
7
+ import { registerWorkspaceMembers } from "./workspaceMembers/registerWorkspaceMembers.js";
8
+ import { bootWorkspaceMembers } from "./workspaceMembers/bootWorkspaceMembers.js";
9
+ import { registerWorkspaceSettings } from "./workspaceSettings/registerWorkspaceSettings.js";
10
+ import { bootWorkspaceSettings } from "./workspaceSettings/bootWorkspaceSettings.js";
11
+ import { registerWorkspaceRepositories } from "./registerWorkspaceRepositories.js";
12
+ import { registerWorkspaceCore } from "./registerWorkspaceCore.js";
13
+ import { registerWorkspaceBootstrap } from "./registerWorkspaceBootstrap.js";
14
+
15
+ class UsersWorkspacesServiceProvider {
16
+ static id = "workspaces.core";
17
+
18
+ static dependsOn = ["users.core"];
19
+
20
+ register(app) {
21
+ registerWorkspaceRepositories(app);
22
+ registerWorkspaceCore(app);
23
+ registerWorkspaceBootstrap(app);
24
+ registerWorkspaceDirectory(app);
25
+ registerWorkspaceMembers(app);
26
+ registerWorkspaceSettings(app);
27
+ registerWorkspacePendingInvitations(app);
28
+ }
29
+
30
+ async boot(app) {
31
+ if (app.make("users.workspace.enabled") !== true) {
32
+ return;
33
+ }
34
+
35
+ bootWorkspaceDirectoryRoutes(app);
36
+ if (app.make("users.workspace.invitations.enabled") === true) {
37
+ bootWorkspacePendingInvitations(app);
38
+ }
39
+ bootWorkspaceSettings(app);
40
+ bootWorkspaceMembers(app);
41
+ }
42
+ }
43
+
44
+ export { UsersWorkspacesServiceProvider };
@@ -9,15 +9,15 @@ import {
9
9
 
10
10
  function createService({
11
11
  userSettingsRepository,
12
- userProfilesRepository,
12
+ usersRepository,
13
13
  authService
14
14
  } = {}) {
15
- if (!userSettingsRepository || !userProfilesRepository) {
15
+ if (!userSettingsRepository || !usersRepository) {
16
16
  throw new Error("accountNotificationsService requires repositories.");
17
17
  }
18
18
 
19
19
  async function updateNotifications(request, user, payload = {}, options = {}) {
20
- const profile = await resolveUserProfile(userProfilesRepository, user);
20
+ const profile = await resolveUserProfile(usersRepository, user);
21
21
  if (!profile) {
22
22
  throw new AppError(404, "User profile was not found.");
23
23
  }
@@ -14,7 +14,7 @@ function registerAccountNotifications(app) {
14
14
  (scope) =>
15
15
  createAccountNotificationsService({
16
16
  userSettingsRepository: scope.make("userSettingsRepository"),
17
- userProfilesRepository: scope.make("userProfilesRepository"),
17
+ usersRepository: scope.make("usersRepository"),
18
18
  authService: scope.make("authService")
19
19
  }),
20
20
  {
@@ -9,15 +9,15 @@ import {
9
9
 
10
10
  function createService({
11
11
  userSettingsRepository,
12
- userProfilesRepository,
12
+ usersRepository,
13
13
  authService
14
14
  } = {}) {
15
- if (!userSettingsRepository || !userProfilesRepository) {
15
+ if (!userSettingsRepository || !usersRepository) {
16
16
  throw new Error("accountPreferencesService requires repositories.");
17
17
  }
18
18
 
19
19
  async function updatePreferences(request, user, payload = {}, options = {}) {
20
- const profile = await resolveUserProfile(userProfilesRepository, user);
20
+ const profile = await resolveUserProfile(usersRepository, user);
21
21
  if (!profile) {
22
22
  throw new AppError(404, "User profile was not found.");
23
23
  }
@@ -14,7 +14,7 @@ function registerAccountPreferences(app) {
14
14
  (scope) =>
15
15
  createAccountPreferencesService({
16
16
  userSettingsRepository: scope.make("userSettingsRepository"),
17
- userProfilesRepository: scope.make("userProfilesRepository"),
17
+ usersRepository: scope.make("usersRepository"),
18
18
  authService: scope.make("authService")
19
19
  }),
20
20
  {
@@ -95,10 +95,17 @@ const accountProfileActions = Object.freeze([
95
95
  },
96
96
  observability: {},
97
97
  async execute(input, context, deps) {
98
+ const avatarUpload = {
99
+ stream: input.stream,
100
+ mimeType: input.mimeType,
101
+ fileName: input.fileName,
102
+ uploadDimension: input.uploadDimension
103
+ };
104
+
98
105
  return deps.accountProfileService.uploadAvatar(
99
106
  resolveRequest(context),
100
107
  resolveActionUser(context, input),
101
- input,
108
+ avatarUpload,
102
109
  {
103
110
  context
104
111
  }
@@ -125,7 +132,6 @@ const accountProfileActions = Object.freeze([
125
132
  return deps.accountProfileService.deleteAvatar(
126
133
  resolveRequest(context),
127
134
  resolveActionUser(context, input),
128
- input,
129
135
  {
130
136
  context
131
137
  }
@@ -9,16 +9,16 @@ import {
9
9
 
10
10
  function createService({
11
11
  userSettingsRepository,
12
- userProfilesRepository,
12
+ usersRepository,
13
13
  authService,
14
14
  avatarService
15
15
  } = {}) {
16
- if (!userSettingsRepository || !userProfilesRepository || !avatarService) {
16
+ if (!userSettingsRepository || !usersRepository || !avatarService) {
17
17
  throw new Error("accountProfileService requires repositories and avatarService.");
18
18
  }
19
19
 
20
20
  async function getForUser(request, user, options = {}) {
21
- const profile = await resolveUserProfile(userProfilesRepository, user);
21
+ const profile = await resolveUserProfile(usersRepository, user);
22
22
  if (!profile) {
23
23
  throw new AppError(404, "User profile was not found.");
24
24
  }
@@ -35,7 +35,7 @@ function createService({
35
35
  }
36
36
 
37
37
  async function updateProfile(request, user, payload = {}, options = {}) {
38
- const profile = await resolveUserProfile(userProfilesRepository, user);
38
+ const profile = await resolveUserProfile(usersRepository, user);
39
39
  if (!profile) {
40
40
  throw new AppError(404, "User profile was not found.");
41
41
  }
@@ -49,7 +49,7 @@ function createService({
49
49
  }
50
50
 
51
51
  if (!updatedProfile) {
52
- updatedProfile = await userProfilesRepository.updateDisplayNameById(profile.id, payload.displayName);
52
+ updatedProfile = await usersRepository.updateDisplayNameById(profile.id, payload.displayName);
53
53
  }
54
54
 
55
55
  const settings = await userSettingsRepository.ensureForUserId(updatedProfile.id);
@@ -66,11 +66,11 @@ function createService({
66
66
  };
67
67
  }
68
68
 
69
- async function uploadAvatar(request, user, payload = {}, options = {}) {
69
+ async function uploadAvatar(request, user, avatarUpload = {}, options = {}) {
70
70
  void options;
71
71
 
72
- const avatarUpload = await avatarService.uploadForUser(user, payload);
73
- const profile = avatarUpload?.profile || null;
72
+ const result = await avatarService.uploadForUser(user, avatarUpload);
73
+ const profile = result?.profile || null;
74
74
  if (!profile) {
75
75
  throw new AppError(500, "Avatar upload completed without a profile result.");
76
76
  }
@@ -86,7 +86,7 @@ function createService({
86
86
  });
87
87
  }
88
88
 
89
- async function deleteAvatar(request, user, _payload = {}, options = {}) {
89
+ async function deleteAvatar(request, user, options = {}) {
90
90
  void options;
91
91
 
92
92
  const profile = await avatarService.clearForUser(user);
@@ -101,7 +101,7 @@ function createService({
101
101
  });
102
102
  }
103
103
 
104
- async function readAvatar(_request, user, _payload = {}, options = {}) {
104
+ async function readAvatar(_request, user, options = {}) {
105
105
  void options;
106
106
 
107
107
  const avatar = await avatarService.readForUser(user);