@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.
- package/package.descriptor.mjs +16 -245
- package/package.json +7 -7
- package/src/server/UsersCoreServiceProvider.js +4 -28
- package/src/server/UsersWorkspacesServiceProvider.js +44 -0
- package/src/server/accountNotifications/accountNotificationsService.js +3 -3
- package/src/server/accountNotifications/registerAccountNotifications.js +1 -1
- package/src/server/accountPreferences/accountPreferencesService.js +3 -3
- package/src/server/accountPreferences/registerAccountPreferences.js +1 -1
- package/src/server/accountProfile/accountProfileActions.js +8 -2
- package/src/server/accountProfile/accountProfileService.js +10 -10
- package/src/server/accountProfile/avatarService.js +9 -9
- package/src/server/accountProfile/bootAccountProfileRoutes.js +5 -3
- package/src/server/accountProfile/registerAccountProfile.js +2 -2
- package/src/server/accountSecurity/accountSecurityService.js +3 -3
- package/src/server/accountSecurity/registerAccountSecurity.js +1 -1
- package/src/server/common/contributors/workspaceActionContextContributor.js +24 -17
- package/src/server/common/registerCommonRepositories.js +3 -22
- package/src/server/common/repositories/userSettingsRepository.js +1 -12
- package/src/server/common/repositories/{userProfilesRepository.js → usersRepository.js} +1 -1
- package/src/server/common/services/accountContextService.js +4 -4
- package/src/server/common/services/authProfileSyncService.js +10 -10
- package/src/server/registerUsersBootstrap.js +22 -0
- package/src/server/registerUsersCore.js +30 -0
- package/src/server/registerWorkspaceBootstrap.js +3 -6
- package/src/server/registerWorkspaceCore.js +5 -17
- package/src/server/registerWorkspaceRepositories.js +26 -0
- package/src/server/usersBootstrapContributor.js +248 -0
- package/src/server/workspaceBootstrapContributor.js +65 -259
- package/src/shared/roles.js +31 -6
- package/src/shared/settings.js +1 -2
- package/templates/migrations/users_core_generic_initial.cjs +69 -0
- package/test/authProfileSyncService.test.js +3 -3
- package/test/avatarService.test.js +2 -2
- package/test/registerUsersCore.test.js +42 -0
- package/test/roles.test.js +90 -5
- package/test/usersBootstrapContributor.test.js +172 -0
- package/test/usersRouteRequestInputValidator.test.js +7 -390
- package/test/workspaceActionContextContributor.test.js +98 -5
- package/test/workspaceBootstrapContributor.test.js +34 -346
- package/test/workspaceMembersService.test.js +4 -2
- package/test/workspaceService.test.js +12 -8
- package/test/workspaceSettingsResource.test.js +4 -2
- package/test-support/registerDefaultSettingsFields.js +1 -1
- package/templates/config/workspaceRoles.js +0 -30
- package/templates/migrations/users_core_initial.cjs +0 -123
- package/templates/migrations/users_core_workspace_settings_single_name_source.cjs +0 -71
- package/templates/migrations/users_core_workspaces_drop_color.cjs +0 -85
- package/templates/packages/main/src/shared/resources/workspaceSettingsFields.js +0 -197
package/package.descriptor.mjs
CHANGED
|
@@ -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.
|
|
4
|
+
version: "0.1.35",
|
|
5
5
|
kind: "runtime",
|
|
6
|
-
description: "Users/
|
|
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/
|
|
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
|
|
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.
|
|
202
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
203
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
204
|
-
"@jskit-ai/kernel": "0.1.
|
|
205
|
-
"@jskit-ai/uploads-runtime": "0.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
|
-
|
|
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/
|
|
158
|
+
from: "templates/migrations/users_core_generic_initial.cjs",
|
|
226
159
|
toDir: "migrations",
|
|
227
160
|
extension: ".cjs",
|
|
228
|
-
reason: "Install users/
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.1.35",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node --test"
|
|
7
7
|
},
|
|
8
8
|
"exports": {
|
|
9
|
-
"./server/
|
|
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.
|
|
28
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
29
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
30
|
-
"@jskit-ai/kernel": "0.1.
|
|
31
|
-
"@jskit-ai/uploads-runtime": "0.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 {
|
|
20
|
-
import {
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
12
|
+
usersRepository,
|
|
13
13
|
authService
|
|
14
14
|
} = {}) {
|
|
15
|
-
if (!userSettingsRepository || !
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
usersRepository,
|
|
13
13
|
authService
|
|
14
14
|
} = {}) {
|
|
15
|
-
if (!userSettingsRepository || !
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
usersRepository,
|
|
13
13
|
authService,
|
|
14
14
|
avatarService
|
|
15
15
|
} = {}) {
|
|
16
|
-
if (!userSettingsRepository || !
|
|
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(
|
|
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(
|
|
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
|
|
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,
|
|
69
|
+
async function uploadAvatar(request, user, avatarUpload = {}, options = {}) {
|
|
70
70
|
void options;
|
|
71
71
|
|
|
72
|
-
const
|
|
73
|
-
const profile =
|
|
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,
|
|
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,
|
|
104
|
+
async function readAvatar(_request, user, options = {}) {
|
|
105
105
|
void options;
|
|
106
106
|
|
|
107
107
|
const avatar = await avatarService.readForUser(user);
|