@jskit-ai/users-core 0.1.47 → 0.1.49

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 (104) hide show
  1. package/package.descriptor.mjs +9 -46
  2. package/package.json +8 -19
  3. package/src/server/UsersCoreServiceProvider.js +0 -4
  4. package/src/server/common/registerCommonRepositories.js +0 -5
  5. package/src/server/common/services/authProfileSyncService.js +28 -7
  6. package/src/server/common/support/realtimeServiceEvents.js +1 -59
  7. package/src/server/profileSyncLifecycleContributorRegistry.js +56 -0
  8. package/src/server/registerUsersBootstrap.js +1 -3
  9. package/src/server/registerUsersCore.js +2 -14
  10. package/src/server/usersBootstrapContributor.js +10 -85
  11. package/src/shared/index.js +2 -99
  12. package/src/shared/settings.js +1 -119
  13. package/templates/migrations/users_core_generic_initial.cjs +0 -16
  14. package/test/authProfileSyncService.test.js +19 -10
  15. package/test/registerServiceRealtimeEvents.test.js +0 -94
  16. package/test/registerUsersCore.test.js +6 -19
  17. package/test/repositoryContracts.test.js +1 -11
  18. package/test/resourcesCanonical.test.js +1 -19
  19. package/test/settingsFieldRegistriesSingleton.test.js +0 -10
  20. package/test/usersBootstrapContributor.test.js +20 -38
  21. package/test/usersRouteRequestInputValidator.test.js +2 -43
  22. package/test/usersRouteResources.test.js +2 -20
  23. package/test-support/registerDefaultSettingsFields.js +0 -1
  24. package/src/server/UsersWorkspacesServiceProvider.js +0 -44
  25. package/src/server/common/contributors/workspaceActionContextContributor.js +0 -88
  26. package/src/server/common/contributors/workspaceAuthPolicyContextResolver.js +0 -34
  27. package/src/server/common/contributors/workspaceRouteVisibilityResolver.js +0 -78
  28. package/src/server/common/formatters/workspaceFormatter.js +0 -53
  29. package/src/server/common/repositories/workspaceInvitesRepository.js +0 -208
  30. package/src/server/common/repositories/workspaceMembershipsRepository.js +0 -190
  31. package/src/server/common/repositories/workspacesRepository.js +0 -202
  32. package/src/server/common/services/workspaceContextService.js +0 -281
  33. package/src/server/common/support/workspaceRoutePaths.js +0 -17
  34. package/src/server/common/validators/routeParamsValidator.js +0 -62
  35. package/src/server/consoleSettings/bootConsoleSettingsRoutes.js +0 -63
  36. package/src/server/consoleSettings/consoleService.js +0 -36
  37. package/src/server/consoleSettings/consoleSettingsActions.js +0 -55
  38. package/src/server/consoleSettings/consoleSettingsRepository.js +0 -115
  39. package/src/server/consoleSettings/consoleSettingsService.js +0 -40
  40. package/src/server/consoleSettings/registerConsoleSettings.js +0 -56
  41. package/src/server/registerWorkspaceBootstrap.js +0 -27
  42. package/src/server/registerWorkspaceCore.js +0 -73
  43. package/src/server/registerWorkspaceRepositories.js +0 -26
  44. package/src/server/support/resolveWorkspace.js +0 -16
  45. package/src/server/support/workspaceActionSurfaces.js +0 -135
  46. package/src/server/support/workspaceInvitationsPolicy.js +0 -45
  47. package/src/server/support/workspaceRouteInput.js +0 -22
  48. package/src/server/workspaceBootstrapContributor.js +0 -211
  49. package/src/server/workspaceDirectory/bootWorkspaceDirectoryRoutes.js +0 -133
  50. package/src/server/workspaceDirectory/registerWorkspaceDirectory.js +0 -19
  51. package/src/server/workspaceDirectory/workspaceDirectoryActions.js +0 -133
  52. package/src/server/workspaceMembers/bootWorkspaceMembers.js +0 -236
  53. package/src/server/workspaceMembers/registerWorkspaceMembers.js +0 -108
  54. package/src/server/workspaceMembers/workspaceMembersActions.js +0 -186
  55. package/src/server/workspaceMembers/workspaceMembersService.js +0 -222
  56. package/src/server/workspacePendingInvitations/bootWorkspacePendingInvitations.js +0 -62
  57. package/src/server/workspacePendingInvitations/registerWorkspacePendingInvitations.js +0 -119
  58. package/src/server/workspacePendingInvitations/workspacePendingInvitationsActions.js +0 -74
  59. package/src/server/workspacePendingInvitations/workspacePendingInvitationsService.js +0 -138
  60. package/src/server/workspaceSettings/bootWorkspaceSettings.js +0 -76
  61. package/src/server/workspaceSettings/registerWorkspaceSettings.js +0 -62
  62. package/src/server/workspaceSettings/workspaceSettingsActions.js +0 -72
  63. package/src/server/workspaceSettings/workspaceSettingsRepository.js +0 -154
  64. package/src/server/workspaceSettings/workspaceSettingsService.js +0 -66
  65. package/src/shared/resources/consoleSettingsFields.js +0 -54
  66. package/src/shared/resources/consoleSettingsResource.js +0 -119
  67. package/src/shared/resources/workspaceMembersResource.js +0 -354
  68. package/src/shared/resources/workspacePendingInvitationsResource.js +0 -82
  69. package/src/shared/resources/workspaceResource.js +0 -176
  70. package/src/shared/resources/workspaceSettingsFields.js +0 -59
  71. package/src/shared/resources/workspaceSettingsResource.js +0 -169
  72. package/src/shared/roles.js +0 -161
  73. package/src/shared/support/usersApiPaths.js +0 -43
  74. package/src/shared/support/usersVisibility.js +0 -42
  75. package/src/shared/support/workspacePathModel.js +0 -145
  76. package/src/shared/tenancyMode.js +0 -35
  77. package/src/shared/tenancyProfile.js +0 -73
  78. package/templates/migrations/users_core_console_owner.cjs +0 -37
  79. package/templates/packages/main/src/shared/resources/consoleSettingsFields.js +0 -11
  80. package/test/consoleService.test.js +0 -57
  81. package/test/consoleSettingsService.test.js +0 -86
  82. package/test/registerWorkspaceDirectory.test.js +0 -31
  83. package/test/registerWorkspaceSettings.test.js +0 -40
  84. package/test/roles.test.js +0 -159
  85. package/test/tenancyProfile.test.js +0 -67
  86. package/test/usersApiPaths.test.js +0 -49
  87. package/test/usersRouteValidators.test.js +0 -49
  88. package/test/usersVisibility.test.js +0 -27
  89. package/test/workspaceActionContextContributor.test.js +0 -344
  90. package/test/workspaceActionSurfaces.test.js +0 -105
  91. package/test/workspaceAuthPolicyContextResolver.test.js +0 -119
  92. package/test/workspaceBootstrapContributor.test.js +0 -154
  93. package/test/workspaceInvitationsPolicy.test.js +0 -71
  94. package/test/workspaceInvitesRepository.test.js +0 -111
  95. package/test/workspaceMembersService.test.js +0 -398
  96. package/test/workspacePathModel.test.js +0 -93
  97. package/test/workspacePendingInvitationsResource.test.js +0 -38
  98. package/test/workspacePendingInvitationsService.test.js +0 -151
  99. package/test/workspaceRouteVisibilityResolver.test.js +0 -83
  100. package/test/workspaceService.test.js +0 -546
  101. package/test/workspaceSettingsActions.test.js +0 -52
  102. package/test/workspaceSettingsRepository.test.js +0 -202
  103. package/test/workspaceSettingsResource.test.js +0 -169
  104. package/test/workspaceSettingsService.test.js +0 -140
@@ -1,133 +0,0 @@
1
- import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
2
- import { workspaceResource } from "../../shared/resources/workspaceResource.js";
3
- import { resolveWorkspaceRoutePath } from "../common/support/workspaceRoutePaths.js";
4
- import { workspaceSlugParamsValidator } from "../common/validators/routeParamsValidator.js";
5
- import { resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig } from "../support/workspaceActionSurfaces.js";
6
-
7
- function bootWorkspaceDirectoryRoutes(app) {
8
- if (!app || typeof app.make !== "function" || typeof app.has !== "function") {
9
- throw new Error("bootWorkspaceDirectoryRoutes requires application make()/has().");
10
- }
11
-
12
- const router = app.make("jskit.http.router");
13
- const appConfig = app.has("appConfig") ? app.make("appConfig") : {};
14
- const workspaceRouteSurfaceId = resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig(appConfig);
15
- const workspaceSelfCreateEnabled = app.has("users.workspace.self-create.enabled")
16
- ? app.make("users.workspace.self-create.enabled") === true
17
- : false;
18
-
19
- if (workspaceSelfCreateEnabled) {
20
- router.register(
21
- "POST",
22
- "/api/workspaces",
23
- {
24
- auth: "required",
25
- meta: {
26
- tags: ["workspace"],
27
- summary: "Create a workspace for the authenticated user"
28
- },
29
- bodyValidator: workspaceResource.operations.create.bodyValidator,
30
- responseValidators: withStandardErrorResponses(
31
- {
32
- 200: workspaceResource.operations.create.outputValidator
33
- },
34
- { includeValidation400: true }
35
- )
36
- },
37
- async function (request, reply) {
38
- const body = request.input.body || {};
39
- const response = await request.executeAction({
40
- actionId: "workspace.workspaces.create",
41
- input: {
42
- name: body.name,
43
- slug: body.slug
44
- }
45
- });
46
- reply.code(200).send(response);
47
- }
48
- );
49
- }
50
-
51
- router.register(
52
- "GET",
53
- "/api/workspaces",
54
- {
55
- auth: "required",
56
- meta: {
57
- tags: ["workspace"],
58
- summary: "List workspaces visible to authenticated user"
59
- },
60
- responseValidators: withStandardErrorResponses({
61
- 200: workspaceResource.operations.list.outputValidator
62
- })
63
- },
64
- async function (request, reply) {
65
- const response = await request.executeAction({
66
- actionId: "workspace.workspaces.list",
67
- input: {}
68
- });
69
- reply.code(200).send(response);
70
- }
71
- );
72
-
73
- router.register(
74
- "GET",
75
- resolveWorkspaceRoutePath("/"),
76
- {
77
- auth: "required",
78
- surface: workspaceRouteSurfaceId,
79
- visibility: "workspace",
80
- meta: {
81
- tags: ["workspace"],
82
- summary: "Get workspace profile by workspace slug"
83
- },
84
- paramsValidator: workspaceSlugParamsValidator,
85
- responseValidators: withStandardErrorResponses({
86
- 200: workspaceResource.operations.view.outputValidator
87
- })
88
- },
89
- async function (request, reply) {
90
- const response = await request.executeAction({
91
- actionId: "workspace.workspaces.read",
92
- input: {
93
- workspaceSlug: request.input.params.workspaceSlug
94
- }
95
- });
96
- reply.code(200).send(response);
97
- }
98
- );
99
-
100
- router.register(
101
- "PATCH",
102
- resolveWorkspaceRoutePath("/"),
103
- {
104
- auth: "required",
105
- surface: workspaceRouteSurfaceId,
106
- visibility: "workspace",
107
- meta: {
108
- tags: ["workspace"],
109
- summary: "Update workspace profile by workspace slug"
110
- },
111
- paramsValidator: workspaceSlugParamsValidator,
112
- bodyValidator: workspaceResource.operations.patch.bodyValidator,
113
- responseValidators: withStandardErrorResponses(
114
- {
115
- 200: workspaceResource.operations.patch.outputValidator
116
- },
117
- { includeValidation400: true }
118
- )
119
- },
120
- async function (request, reply) {
121
- const response = await request.executeAction({
122
- actionId: "workspace.workspaces.update",
123
- input: {
124
- workspaceSlug: request.input.params.workspaceSlug,
125
- patch: request.input.body
126
- }
127
- });
128
- reply.code(200).send(response);
129
- }
130
- );
131
- }
132
-
133
- export { bootWorkspaceDirectoryRoutes };
@@ -1,19 +0,0 @@
1
- import { withActionDefaults } from "@jskit-ai/kernel/shared/actions";
2
- import { workspaceDirectoryActions } from "./workspaceDirectoryActions.js";
3
-
4
- function registerWorkspaceDirectory(app) {
5
- if (!app || typeof app.singleton !== "function" || typeof app.actions !== "function") {
6
- throw new Error("registerWorkspaceDirectory requires application singleton()/actions().");
7
- }
8
-
9
- app.actions(
10
- withActionDefaults(workspaceDirectoryActions, {
11
- domain: "workspace",
12
- dependencies: {
13
- workspaceService: "users.workspace.service"
14
- }
15
- })
16
- );
17
- }
18
-
19
- export { registerWorkspaceDirectory };
@@ -1,133 +0,0 @@
1
- import {
2
- EMPTY_INPUT_VALIDATOR,
3
- resolveRequest
4
- } from "@jskit-ai/kernel/shared/actions/actionContributorHelpers";
5
- import { workspaceResource } from "../../shared/resources/workspaceResource.js";
6
- import { workspaceSlugParamsValidator } from "../common/validators/routeParamsValidator.js";
7
- import { resolveActionUser } from "../common/support/resolveActionUser.js";
8
-
9
- const workspaceDirectoryActions = Object.freeze([
10
- {
11
- id: "workspace.workspaces.create",
12
- version: 1,
13
- kind: "command",
14
- channels: ["api", "assistant_tool", "automation", "internal"],
15
- surfacesFrom: "enabled",
16
- permission: {
17
- require: "authenticated"
18
- },
19
- inputValidator: workspaceResource.operations.create.bodyValidator,
20
- outputValidator: workspaceResource.operations.create.outputValidator,
21
- idempotency: "none",
22
- audit: {
23
- actionName: "workspace.workspaces.create"
24
- },
25
- observability: {},
26
- extensions: {
27
- assistant: {
28
- description: "Create a workspace for the authenticated user."
29
- }
30
- },
31
- async execute(input, context, deps) {
32
- return deps.workspaceService.createWorkspaceForAuthenticatedUser(resolveActionUser(context, input), input, {
33
- request: resolveRequest(context),
34
- context
35
- });
36
- }
37
- },
38
- {
39
- id: "workspace.workspaces.list",
40
- version: 1,
41
- kind: "query",
42
- channels: ["api", "automation", "internal"],
43
- surfacesFrom: "enabled",
44
- permission: {
45
- require: "authenticated"
46
- },
47
- inputValidator: EMPTY_INPUT_VALIDATOR,
48
- outputValidator: workspaceResource.operations.list.outputValidator,
49
- idempotency: "none",
50
- audit: {
51
- actionName: "workspace.workspaces.list"
52
- },
53
- observability: {},
54
- async execute(input, context, deps) {
55
- return {
56
- items: await deps.workspaceService.listWorkspacesForAuthenticatedUser(resolveActionUser(context, input), {
57
- request: resolveRequest(context),
58
- context
59
- }),
60
- nextCursor: null
61
- };
62
- }
63
- },
64
- {
65
- id: "workspace.workspaces.read",
66
- version: 1,
67
- kind: "query",
68
- channels: ["api", "automation", "internal"],
69
- surfacesFrom: "workspace",
70
- permission: {
71
- require: "any",
72
- permissions: ["workspace.settings.view", "workspace.settings.update"]
73
- },
74
- inputValidator: workspaceSlugParamsValidator,
75
- outputValidator: workspaceResource.operations.view.outputValidator,
76
- idempotency: "none",
77
- audit: {
78
- actionName: "workspace.workspaces.read"
79
- },
80
- observability: {},
81
- async execute(input, context, deps) {
82
- return deps.workspaceService.getWorkspaceForAuthenticatedUser(
83
- resolveActionUser(context, input),
84
- input.workspaceSlug,
85
- {
86
- request: resolveRequest(context),
87
- context
88
- }
89
- );
90
- }
91
- },
92
- {
93
- id: "workspace.workspaces.update",
94
- version: 1,
95
- kind: "command",
96
- channels: ["api", "assistant_tool", "automation", "internal"],
97
- surfacesFrom: "workspace",
98
- permission: {
99
- require: "all",
100
- permissions: ["workspace.settings.update"]
101
- },
102
- inputValidator: [
103
- workspaceSlugParamsValidator,
104
- {
105
- patch: workspaceResource.operations.patch.bodyValidator
106
- }
107
- ],
108
- outputValidator: workspaceResource.operations.patch.outputValidator,
109
- idempotency: "optional",
110
- audit: {
111
- actionName: "workspace.workspaces.update"
112
- },
113
- observability: {},
114
- extensions: {
115
- assistant: {
116
- description: "Update workspace profile fields."
117
- }
118
- },
119
- async execute(input, context, deps) {
120
- return deps.workspaceService.updateWorkspaceForAuthenticatedUser(
121
- resolveActionUser(context, input),
122
- input.workspaceSlug,
123
- input.patch,
124
- {
125
- request: resolveRequest(context),
126
- context
127
- }
128
- );
129
- }
130
- }
131
- ]);
132
-
133
- export { workspaceDirectoryActions };
@@ -1,236 +0,0 @@
1
- import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
2
- import { workspaceMembersResource } from "../../shared/resources/workspaceMembersResource.js";
3
- import { resolveWorkspaceRoutePath } from "../common/support/workspaceRoutePaths.js";
4
- import {
5
- routeParamsValidator,
6
- workspaceSlugParamsValidator
7
- } from "../common/validators/routeParamsValidator.js";
8
- import { resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig } from "../support/workspaceActionSurfaces.js";
9
-
10
- function bootWorkspaceMembers(app) {
11
- if (!app || typeof app.make !== "function") {
12
- throw new Error("bootWorkspaceMembers requires application make().");
13
- }
14
-
15
- const router = app.make("jskit.http.router");
16
- const appConfig = typeof app.has === "function" && app.has("appConfig") ? app.make("appConfig") : {};
17
- const workspaceInvitationsEnabled =
18
- typeof app.has === "function" && app.has("users.workspace.invitations.enabled")
19
- ? app.make("users.workspace.invitations.enabled") === true
20
- : false;
21
- const workspaceRouteSurfaceId = resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig(appConfig);
22
-
23
- router.register(
24
- "GET",
25
- resolveWorkspaceRoutePath("/roles"),
26
- {
27
- auth: "required",
28
- surface: workspaceRouteSurfaceId,
29
- visibility: "workspace",
30
- contextPolicy: "required",
31
- meta: {
32
- tags: ["workspace"],
33
- summary: "Get workspace role catalog by workspace slug"
34
- },
35
- paramsValidator: workspaceSlugParamsValidator,
36
- responseValidators: withStandardErrorResponses({
37
- 200: workspaceMembersResource.operations.rolesList.outputValidator
38
- })
39
- },
40
- async function (request, reply) {
41
- const response = await request.executeAction({
42
- actionId: "workspace.roles.list",
43
- input: {
44
- workspaceSlug: request.input.params.workspaceSlug
45
- }
46
- });
47
- reply.code(200).send(response);
48
- }
49
- );
50
-
51
- router.register(
52
- "GET",
53
- resolveWorkspaceRoutePath("/members"),
54
- {
55
- auth: "required",
56
- surface: workspaceRouteSurfaceId,
57
- visibility: "workspace",
58
- contextPolicy: "required",
59
- meta: {
60
- tags: ["workspace"],
61
- summary: "List members by workspace slug"
62
- },
63
- paramsValidator: workspaceSlugParamsValidator,
64
- responseValidators: withStandardErrorResponses({
65
- 200: workspaceMembersResource.operations.membersList.outputValidator
66
- })
67
- },
68
- async function (request, reply) {
69
- const response = await request.executeAction({
70
- actionId: "workspace.members.list",
71
- input: {
72
- workspaceSlug: request.input.params.workspaceSlug
73
- }
74
- });
75
- reply.code(200).send(response);
76
- }
77
- );
78
-
79
- router.register(
80
- "PATCH",
81
- resolveWorkspaceRoutePath("/members/:memberUserId/role"),
82
- {
83
- auth: "required",
84
- surface: workspaceRouteSurfaceId,
85
- visibility: "workspace",
86
- contextPolicy: "required",
87
- meta: {
88
- tags: ["workspace"],
89
- summary: "Update workspace member role by workspace slug"
90
- },
91
- paramsValidator: routeParamsValidator,
92
- bodyValidator: workspaceMembersResource.operations.updateMemberRole.bodyValidator,
93
- responseValidators: withStandardErrorResponses(
94
- {
95
- 200: workspaceMembersResource.operations.updateMemberRole.outputValidator
96
- },
97
- { includeValidation400: true }
98
- )
99
- },
100
- async function (request, reply) {
101
- const response = await request.executeAction({
102
- actionId: "workspace.member.role.update",
103
- input: {
104
- workspaceSlug: request.input.params.workspaceSlug,
105
- memberUserId: request.input.params.memberUserId,
106
- roleSid: request.input.body.roleSid
107
- }
108
- });
109
- reply.code(200).send(response);
110
- }
111
- );
112
-
113
- router.register(
114
- "DELETE",
115
- resolveWorkspaceRoutePath("/members/:memberUserId"),
116
- {
117
- auth: "required",
118
- surface: workspaceRouteSurfaceId,
119
- visibility: "workspace",
120
- contextPolicy: "required",
121
- meta: {
122
- tags: ["workspace"],
123
- summary: "Remove workspace member by workspace slug"
124
- },
125
- paramsValidator: routeParamsValidator,
126
- responseValidators: withStandardErrorResponses({
127
- 200: workspaceMembersResource.operations.removeMember.outputValidator
128
- })
129
- },
130
- async function (request, reply) {
131
- const response = await request.executeAction({
132
- actionId: "workspace.member.remove",
133
- input: {
134
- workspaceSlug: request.input.params.workspaceSlug,
135
- memberUserId: request.input.params.memberUserId
136
- }
137
- });
138
- reply.code(200).send(response);
139
- }
140
- );
141
-
142
- if (workspaceInvitationsEnabled) {
143
- router.register(
144
- "GET",
145
- resolveWorkspaceRoutePath("/invites"),
146
- {
147
- auth: "required",
148
- surface: workspaceRouteSurfaceId,
149
- visibility: "workspace",
150
- contextPolicy: "required",
151
- meta: {
152
- tags: ["workspace"],
153
- summary: "List workspace invites by workspace slug"
154
- },
155
- paramsValidator: workspaceSlugParamsValidator,
156
- responseValidators: withStandardErrorResponses({
157
- 200: workspaceMembersResource.operations.invitesList.outputValidator
158
- })
159
- },
160
- async function (request, reply) {
161
- const response = await request.executeAction({
162
- actionId: "workspace.invites.list",
163
- input: {
164
- workspaceSlug: request.input.params.workspaceSlug
165
- }
166
- });
167
- reply.code(200).send(response);
168
- }
169
- );
170
-
171
- router.register(
172
- "POST",
173
- resolveWorkspaceRoutePath("/invites"),
174
- {
175
- auth: "required",
176
- surface: workspaceRouteSurfaceId,
177
- visibility: "workspace",
178
- contextPolicy: "required",
179
- meta: {
180
- tags: ["workspace"],
181
- summary: "Create workspace invite by workspace slug"
182
- },
183
- paramsValidator: workspaceSlugParamsValidator,
184
- bodyValidator: workspaceMembersResource.operations.createInvite.bodyValidator,
185
- responseValidators: withStandardErrorResponses(
186
- {
187
- 200: workspaceMembersResource.operations.createInvite.outputValidator
188
- },
189
- { includeValidation400: true }
190
- )
191
- },
192
- async function (request, reply) {
193
- const response = await request.executeAction({
194
- actionId: "workspace.invite.create",
195
- input: {
196
- workspaceSlug: request.input.params.workspaceSlug,
197
- email: request.input.body.email,
198
- roleSid: request.input.body.roleSid
199
- }
200
- });
201
- reply.code(200).send(response);
202
- }
203
- );
204
-
205
- router.register(
206
- "DELETE",
207
- resolveWorkspaceRoutePath("/invites/:inviteId"),
208
- {
209
- auth: "required",
210
- surface: workspaceRouteSurfaceId,
211
- visibility: "workspace",
212
- contextPolicy: "required",
213
- meta: {
214
- tags: ["workspace"],
215
- summary: "Revoke workspace invite by workspace slug"
216
- },
217
- paramsValidator: routeParamsValidator,
218
- responseValidators: withStandardErrorResponses({
219
- 200: workspaceMembersResource.operations.revokeInvite.outputValidator
220
- })
221
- },
222
- async function (request, reply) {
223
- const response = await request.executeAction({
224
- actionId: "workspace.invite.revoke",
225
- input: {
226
- workspaceSlug: request.input.params.workspaceSlug,
227
- inviteId: request.input.params.inviteId
228
- }
229
- });
230
- reply.code(200).send(response);
231
- }
232
- );
233
- }
234
- }
235
-
236
- export { bootWorkspaceMembers };
@@ -1,108 +0,0 @@
1
- import { withActionDefaults } from "@jskit-ai/kernel/shared/actions";
2
- import { normalizeDbRecordId } from "@jskit-ai/database-runtime/shared";
3
- import { normalizeRecordId } from "@jskit-ai/kernel/shared/support/normalize";
4
- import { resolveAppConfig } from "@jskit-ai/kernel/server/support";
5
- import { deepFreeze } from "../common/support/deepFreeze.js";
6
- import { createService as createWorkspaceMembersService } from "./workspaceMembersService.js";
7
- import { workspaceMembersActions } from "./workspaceMembersActions.js";
8
- import { createWorkspaceRoleCatalog } from "../../shared/roles.js";
9
- import { createWorkspaceEntityAndBootstrapEvents } from "../common/support/realtimeServiceEvents.js";
10
-
11
-
12
- function resolveWorkspaceMembersInviteExpiresInMs(appConfig = {}) {
13
- const inviteExpiresInMs = Number(appConfig?.workspaceMembers?.defaults?.inviteExpiresInMs);
14
- if (!Number.isInteger(inviteExpiresInMs) || inviteExpiresInMs < 1) {
15
- throw new TypeError("users.core requires appConfig.workspaceMembers.defaults.inviteExpiresInMs.");
16
- }
17
-
18
- return inviteExpiresInMs;
19
- }
20
-
21
- const INVITE_RECIPIENT_BOOTSTRAP_AUDIENCE = Object.freeze({
22
- preset: "event_scope",
23
- async userQuery({ knex, event } = {}) {
24
- if (typeof knex !== "function") {
25
- return [];
26
- }
27
-
28
- const inviteId = normalizeRecordId(event?.entityId, { fallback: null });
29
- if (!inviteId) {
30
- return [];
31
- }
32
-
33
- const row = await knex("workspace_invites as wi")
34
- .join("users as up", "up.email", "wi.email")
35
- .where("wi.id", inviteId)
36
- .first("up.id as user_id");
37
-
38
- const userId = normalizeDbRecordId(row?.user_id, { fallback: null });
39
- if (!userId) {
40
- return [];
41
- }
42
-
43
- return [
44
- {
45
- userId
46
- }
47
- ];
48
- }
49
- });
50
-
51
- function registerWorkspaceMembers(app) {
52
- if (!app || typeof app.singleton !== "function" || typeof app.service !== "function" || typeof app.actions !== "function") {
53
- throw new Error("registerWorkspaceMembers requires application singleton()/service()/actions().");
54
- }
55
-
56
- app.service(
57
- "users.workspace.members.service",
58
- (scope) => {
59
- const appConfig = resolveAppConfig(scope);
60
- return createWorkspaceMembersService({
61
- workspaceMembershipsRepository: scope.make("workspaceMembershipsRepository"),
62
- workspaceInvitesRepository: scope.make("workspaceInvitesRepository"),
63
- inviteExpiresInMs: resolveWorkspaceMembersInviteExpiresInMs(appConfig),
64
- roleCatalog: createWorkspaceRoleCatalog(appConfig),
65
- workspaceInvitationsEnabled: scope.make("users.workspace.invitations.enabled") === true
66
- });
67
- },
68
- {
69
- events: deepFreeze({
70
- updateMemberRole: createWorkspaceEntityAndBootstrapEvents({
71
- workspaceEntity: "member",
72
- workspaceOperation: "updated",
73
- workspaceRealtimeEvent: "workspace.members.changed"
74
- }),
75
- removeMember: createWorkspaceEntityAndBootstrapEvents({
76
- workspaceEntity: "member",
77
- workspaceOperation: "updated",
78
- workspaceRealtimeEvent: "workspace.members.changed"
79
- }),
80
- createInvite: createWorkspaceEntityAndBootstrapEvents({
81
- workspaceEntity: "invite",
82
- workspaceOperation: "created",
83
- workspaceRealtimeEvent: "workspace.invites.changed",
84
- bootstrapEntityId: ({ result }) => result?.createdInviteId,
85
- bootstrapAudience: INVITE_RECIPIENT_BOOTSTRAP_AUDIENCE
86
- }),
87
- revokeInvite: createWorkspaceEntityAndBootstrapEvents({
88
- workspaceEntity: "invite",
89
- workspaceOperation: "updated",
90
- workspaceRealtimeEvent: "workspace.invites.changed",
91
- bootstrapEntityId: ({ result }) => result?.revokedInviteId,
92
- bootstrapAudience: INVITE_RECIPIENT_BOOTSTRAP_AUDIENCE
93
- })
94
- })
95
- }
96
- );
97
-
98
- app.actions(
99
- withActionDefaults(workspaceMembersActions, {
100
- domain: "workspace",
101
- dependencies: {
102
- workspaceMembersService: "users.workspace.members.service"
103
- }
104
- })
105
- );
106
- }
107
-
108
- export { registerWorkspaceMembers };