@jskit-ai/users-core 0.1.25 → 0.1.27

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 (39) hide show
  1. package/package.descriptor.mjs +15 -22
  2. package/package.json +5 -6
  3. package/src/server/UsersCoreServiceProvider.js +2 -6
  4. package/src/server/accountNotifications/bootAccountNotificationsRoutes.js +1 -2
  5. package/src/server/accountNotifications/registerAccountNotifications.js +2 -4
  6. package/src/server/accountPreferences/bootAccountPreferencesRoutes.js +1 -2
  7. package/src/server/accountPreferences/registerAccountPreferences.js +2 -4
  8. package/src/server/accountProfile/bootAccountProfileRoutes.js +2 -4
  9. package/src/server/accountProfile/registerAccountProfile.js +8 -14
  10. package/src/server/accountProfile/registerAvatarMultipartSupport.js +5 -8
  11. package/src/server/accountSecurity/bootAccountSecurityRoutes.js +1 -2
  12. package/src/server/accountSecurity/registerAccountSecurity.js +2 -4
  13. package/src/server/common/README.md +0 -1
  14. package/src/server/common/registerCommonRepositories.js +6 -7
  15. package/src/server/common/support/realtimeServiceEvents.js +3 -7
  16. package/src/server/consoleSettings/bootConsoleSettingsRoutes.js +1 -2
  17. package/src/server/consoleSettings/registerConsoleSettings.js +1 -2
  18. package/src/server/registerWorkspaceBootstrap.js +4 -10
  19. package/src/server/registerWorkspaceCore.js +14 -25
  20. package/src/server/workspaceDirectory/bootWorkspaceDirectoryRoutes.js +3 -7
  21. package/src/server/workspaceMembers/bootWorkspaceMembers.js +3 -5
  22. package/src/server/workspaceMembers/registerWorkspaceMembers.js +7 -13
  23. package/src/server/workspacePendingInvitations/bootWorkspacePendingInvitations.js +1 -2
  24. package/src/server/workspacePendingInvitations/registerWorkspacePendingInvitations.js +7 -17
  25. package/src/server/workspaceSettings/bootWorkspaceSettings.js +1 -2
  26. package/src/server/workspaceSettings/registerWorkspaceSettings.js +3 -8
  27. package/src/shared/index.js +1 -24
  28. package/src/shared/resources/consoleSettingsFields.js +1 -2
  29. package/src/shared/resources/userSettingsFields.js +1 -2
  30. package/src/shared/resources/workspaceSettingsFields.js +1 -2
  31. package/src/shared/support/usersApiPaths.js +1 -1
  32. package/test/registerAvatarMultipartSupport.test.js +2 -3
  33. package/test/registerServiceRealtimeEvents.test.js +29 -38
  34. package/test/registerWorkspaceSettings.test.js +2 -6
  35. package/test/usersApiPaths.test.js +2 -2
  36. package/test/usersRouteRequestInputValidator.test.js +38 -39
  37. package/test/workspaceSettingsRepository.test.js +6 -4
  38. package/src/server/common/diTokens.js +0 -21
  39. package/src/shared/events/usersEvents.js +0 -19
@@ -1,4 +1,3 @@
1
- import { AUTH_POLICY_CONTEXT_RESOLVER_TOKEN } from "@jskit-ai/auth-core/server/lib/tokens";
2
1
  import {
3
2
  registerActionContextContributor
4
3
  } from "@jskit-ai/kernel/server/actions";
@@ -11,17 +10,7 @@ import { createWorkspaceActionContextContributor } from "./common/contributors/w
11
10
  import { createWorkspaceRouteVisibilityResolver } from "./common/contributors/workspaceRouteVisibilityResolver.js";
12
11
  import { createWorkspaceAuthPolicyContextResolver } from "./common/contributors/workspaceAuthPolicyContextResolver.js";
13
12
  import { resolveWorkspaceInvitationsPolicy } from "./support/workspaceInvitationsPolicy.js";
14
- import {
15
- USERS_PROFILE_SYNC_SERVICE_TOKEN,
16
- USERS_TENANCY_PROFILE_TOKEN,
17
- USERS_WORKSPACE_ENABLED_TOKEN,
18
- USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN,
19
- USERS_WORKSPACE_SELF_CREATE_ENABLED_TOKEN,
20
- USERS_WORKSPACE_TENANCY_ENABLED_TOKEN
21
- } from "./common/diTokens.js";
22
13
 
23
- const USERS_WORKSPACE_CONTEXT_CONTRIBUTOR_TOKEN = "users.core.workspace.actionContextContributor";
24
- const USERS_WORKSPACE_VISIBILITY_RESOLVER_TOKEN = "users.core.workspace.routeVisibilityResolver";
25
14
 
26
15
  function registerWorkspaceCore(app) {
27
16
  if (!app || typeof app.singleton !== "function") {
@@ -38,54 +27,54 @@ function registerWorkspaceCore(app) {
38
27
  });
39
28
  });
40
29
 
41
- app.singleton(USERS_PROFILE_SYNC_SERVICE_TOKEN, (scope) => {
30
+ app.singleton("users.profile.sync.service", (scope) => {
42
31
  return createAuthProfileSyncService({
43
32
  userProfilesRepository: scope.make("userProfilesRepository"),
44
33
  workspaceProvisioningService: scope.make("users.workspace.service")
45
34
  });
46
35
  });
47
36
 
48
- app.singleton(USERS_TENANCY_PROFILE_TOKEN, (scope) => {
37
+ app.singleton("users.tenancy.profile", (scope) => {
49
38
  const appConfig = resolveAppConfig(scope);
50
39
  return resolveTenancyProfile(appConfig);
51
40
  });
52
41
 
53
- app.singleton(USERS_WORKSPACE_ENABLED_TOKEN, (scope) => {
54
- return scope.make(USERS_TENANCY_PROFILE_TOKEN).workspace.enabled === true;
42
+ app.singleton("users.workspace.enabled", (scope) => {
43
+ return scope.make("users.tenancy.profile").workspace.enabled === true;
55
44
  });
56
45
 
57
- app.singleton(USERS_WORKSPACE_SELF_CREATE_ENABLED_TOKEN, (scope) => {
58
- return scope.make(USERS_TENANCY_PROFILE_TOKEN).workspace.allowSelfCreate === true;
46
+ app.singleton("users.workspace.self-create.enabled", (scope) => {
47
+ return scope.make("users.tenancy.profile").workspace.allowSelfCreate === true;
59
48
  });
60
49
 
61
- app.singleton(USERS_WORKSPACE_TENANCY_ENABLED_TOKEN, (scope) => {
62
- return scope.make(USERS_TENANCY_PROFILE_TOKEN).mode === TENANCY_MODE_WORKSPACES;
50
+ app.singleton("users.workspace.tenancy.enabled", (scope) => {
51
+ return scope.make("users.tenancy.profile").mode === TENANCY_MODE_WORKSPACES;
63
52
  });
64
53
 
65
- app.singleton(USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN, (scope) => {
54
+ app.singleton("users.workspace.invitations.enabled", (scope) => {
66
55
  const appConfig = resolveAppConfig(scope);
67
- const tenancyProfile = scope.make(USERS_TENANCY_PROFILE_TOKEN);
56
+ const tenancyProfile = scope.make("users.tenancy.profile");
68
57
  return resolveWorkspaceInvitationsPolicy({
69
58
  appConfig,
70
59
  tenancyProfile
71
60
  }).enabled;
72
61
  });
73
62
 
74
- registerActionContextContributor(app, USERS_WORKSPACE_CONTEXT_CONTRIBUTOR_TOKEN, (scope) => {
63
+ registerActionContextContributor(app, "users.core.workspace.actionContextContributor", (scope) => {
75
64
  return createWorkspaceActionContextContributor({
76
65
  workspaceService: scope.make("users.workspace.service")
77
66
  });
78
67
  });
79
68
 
80
- if (typeof app.has !== "function" || !app.has(AUTH_POLICY_CONTEXT_RESOLVER_TOKEN)) {
81
- app.singleton(AUTH_POLICY_CONTEXT_RESOLVER_TOKEN, (scope) =>
69
+ if (typeof app.has !== "function" || !app.has("auth.policy.contextResolver")) {
70
+ app.singleton("auth.policy.contextResolver", (scope) =>
82
71
  createWorkspaceAuthPolicyContextResolver({
83
72
  workspaceService: scope.make("users.workspace.service")
84
73
  })
85
74
  );
86
75
  }
87
76
 
88
- registerRouteVisibilityResolver(app, USERS_WORKSPACE_VISIBILITY_RESOLVER_TOKEN, (scope) =>
77
+ registerRouteVisibilityResolver(app, "users.core.workspace.routeVisibilityResolver", (scope) =>
89
78
  createWorkspaceRouteVisibilityResolver({
90
79
  workspaceService: scope.make("users.workspace.service")
91
80
  })
@@ -1,9 +1,5 @@
1
1
  import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
2
- import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
3
2
  import { workspaceResource } from "../../shared/resources/workspaceResource.js";
4
- import {
5
- USERS_WORKSPACE_SELF_CREATE_ENABLED_TOKEN
6
- } from "../common/diTokens.js";
7
3
  import { resolveWorkspaceRoutePath } from "../common/support/workspaceRoutePaths.js";
8
4
  import { workspaceSlugParamsValidator } from "../common/validators/routeParamsValidator.js";
9
5
  import { resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig } from "../support/workspaceActionSurfaces.js";
@@ -13,11 +9,11 @@ function bootWorkspaceDirectoryRoutes(app) {
13
9
  throw new Error("bootWorkspaceDirectoryRoutes requires application make()/has().");
14
10
  }
15
11
 
16
- const router = app.make(KERNEL_TOKENS.HttpRouter);
12
+ const router = app.make("jskit.http.router");
17
13
  const appConfig = app.has("appConfig") ? app.make("appConfig") : {};
18
14
  const workspaceRouteSurfaceId = resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig(appConfig);
19
- const workspaceSelfCreateEnabled = app.has(USERS_WORKSPACE_SELF_CREATE_ENABLED_TOKEN)
20
- ? app.make(USERS_WORKSPACE_SELF_CREATE_ENABLED_TOKEN) === true
15
+ const workspaceSelfCreateEnabled = app.has("users.workspace.self-create.enabled")
16
+ ? app.make("users.workspace.self-create.enabled") === true
21
17
  : false;
22
18
 
23
19
  if (workspaceSelfCreateEnabled) {
@@ -1,8 +1,6 @@
1
1
  import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
2
- import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
3
2
  import { workspaceMembersResource } from "../../shared/resources/workspaceMembersResource.js";
4
3
  import { resolveWorkspaceRoutePath } from "../common/support/workspaceRoutePaths.js";
5
- import { USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN } from "../common/diTokens.js";
6
4
  import {
7
5
  routeParamsValidator,
8
6
  workspaceSlugParamsValidator
@@ -14,11 +12,11 @@ function bootWorkspaceMembers(app) {
14
12
  throw new Error("bootWorkspaceMembers requires application make().");
15
13
  }
16
14
 
17
- const router = app.make(KERNEL_TOKENS.HttpRouter);
15
+ const router = app.make("jskit.http.router");
18
16
  const appConfig = typeof app.has === "function" && app.has("appConfig") ? app.make("appConfig") : {};
19
17
  const workspaceInvitationsEnabled =
20
- typeof app.has === "function" && app.has(USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN)
21
- ? app.make(USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN) === true
18
+ typeof app.has === "function" && app.has("users.workspace.invitations.enabled")
19
+ ? app.make("users.workspace.invitations.enabled") === true
22
20
  : false;
23
21
  const workspaceRouteSurfaceId = resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig(appConfig);
24
22
 
@@ -1,17 +1,11 @@
1
1
  import { withActionDefaults } from "@jskit-ai/kernel/shared/actions";
2
2
  import { resolveAppConfig } from "@jskit-ai/kernel/server/support";
3
- import {
4
- WORKSPACE_MEMBERS_CHANGED_EVENT,
5
- WORKSPACE_INVITES_CHANGED_EVENT
6
- } from "../../shared/events/usersEvents.js";
7
3
  import { deepFreeze } from "../common/support/deepFreeze.js";
8
4
  import { createService as createWorkspaceMembersService } from "./workspaceMembersService.js";
9
5
  import { workspaceMembersActions } from "./workspaceMembersActions.js";
10
6
  import { createWorkspaceRoleCatalog } from "../../shared/roles.js";
11
- import { USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN } from "../common/diTokens.js";
12
7
  import { createWorkspaceEntityAndBootstrapEvents } from "../common/support/realtimeServiceEvents.js";
13
8
 
14
- const USERS_WORKSPACE_MEMBERS_SERVICE_TOKEN = "users.workspace.members.service";
15
9
 
16
10
  function resolveWorkspaceMembersInviteExpiresInMs(appConfig = {}) {
17
11
  const inviteExpiresInMs = Number(appConfig?.workspaceMembers?.defaults?.inviteExpiresInMs);
@@ -58,7 +52,7 @@ function registerWorkspaceMembers(app) {
58
52
  }
59
53
 
60
54
  app.service(
61
- USERS_WORKSPACE_MEMBERS_SERVICE_TOKEN,
55
+ "users.workspace.members.service",
62
56
  (scope) => {
63
57
  const appConfig = resolveAppConfig(scope);
64
58
  return createWorkspaceMembersService({
@@ -66,7 +60,7 @@ function registerWorkspaceMembers(app) {
66
60
  workspaceInvitesRepository: scope.make("workspaceInvitesRepository"),
67
61
  inviteExpiresInMs: resolveWorkspaceMembersInviteExpiresInMs(appConfig),
68
62
  roleCatalog: createWorkspaceRoleCatalog(appConfig),
69
- workspaceInvitationsEnabled: scope.make(USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN) === true
63
+ workspaceInvitationsEnabled: scope.make("users.workspace.invitations.enabled") === true
70
64
  });
71
65
  },
72
66
  {
@@ -74,24 +68,24 @@ function registerWorkspaceMembers(app) {
74
68
  updateMemberRole: createWorkspaceEntityAndBootstrapEvents({
75
69
  workspaceEntity: "member",
76
70
  workspaceOperation: "updated",
77
- workspaceRealtimeEvent: WORKSPACE_MEMBERS_CHANGED_EVENT
71
+ workspaceRealtimeEvent: "workspace.members.changed"
78
72
  }),
79
73
  removeMember: createWorkspaceEntityAndBootstrapEvents({
80
74
  workspaceEntity: "member",
81
75
  workspaceOperation: "updated",
82
- workspaceRealtimeEvent: WORKSPACE_MEMBERS_CHANGED_EVENT
76
+ workspaceRealtimeEvent: "workspace.members.changed"
83
77
  }),
84
78
  createInvite: createWorkspaceEntityAndBootstrapEvents({
85
79
  workspaceEntity: "invite",
86
80
  workspaceOperation: "created",
87
- workspaceRealtimeEvent: WORKSPACE_INVITES_CHANGED_EVENT,
81
+ workspaceRealtimeEvent: "workspace.invites.changed",
88
82
  bootstrapEntityId: ({ result }) => result?.createdInviteId,
89
83
  bootstrapAudience: INVITE_RECIPIENT_BOOTSTRAP_AUDIENCE
90
84
  }),
91
85
  revokeInvite: createWorkspaceEntityAndBootstrapEvents({
92
86
  workspaceEntity: "invite",
93
87
  workspaceOperation: "updated",
94
- workspaceRealtimeEvent: WORKSPACE_INVITES_CHANGED_EVENT,
88
+ workspaceRealtimeEvent: "workspace.invites.changed",
95
89
  bootstrapEntityId: ({ result }) => result?.revokedInviteId,
96
90
  bootstrapAudience: INVITE_RECIPIENT_BOOTSTRAP_AUDIENCE
97
91
  })
@@ -103,7 +97,7 @@ function registerWorkspaceMembers(app) {
103
97
  withActionDefaults(workspaceMembersActions, {
104
98
  domain: "workspace",
105
99
  dependencies: {
106
- workspaceMembersService: USERS_WORKSPACE_MEMBERS_SERVICE_TOKEN
100
+ workspaceMembersService: "users.workspace.members.service"
107
101
  }
108
102
  })
109
103
  );
@@ -1,5 +1,4 @@
1
1
  import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
2
- import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
3
2
  import { workspaceMembersResource } from "../../shared/resources/workspaceMembersResource.js";
4
3
  import { workspacePendingInvitationsResource } from "../../shared/resources/workspacePendingInvitationsResource.js";
5
4
 
@@ -8,7 +7,7 @@ function bootWorkspacePendingInvitations(app) {
8
7
  throw new Error("bootWorkspacePendingInvitations requires application make().");
9
8
  }
10
9
 
11
- const router = app.make(KERNEL_TOKENS.HttpRouter);
10
+ const router = app.make("jskit.http.router");
12
11
 
13
12
  router.register(
14
13
  "GET",
@@ -1,17 +1,7 @@
1
1
  import { withActionDefaults } from "@jskit-ai/kernel/shared/actions";
2
2
  import { createService } from "./workspacePendingInvitationsService.js";
3
3
  import { workspacePendingInvitationsActions } from "./workspacePendingInvitationsActions.js";
4
- import {
5
- USERS_BOOTSTRAP_CHANGED_EVENT,
6
- WORKSPACE_INVITES_CHANGED_EVENT,
7
- WORKSPACE_MEMBERS_CHANGED_EVENT,
8
- WORKSPACES_CHANGED_EVENT,
9
- WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT
10
- } from "../../shared/events/usersEvents.js";
11
4
  import { deepFreeze } from "../common/support/deepFreeze.js";
12
- import {
13
- USERS_WORKSPACE_PENDING_INVITATIONS_SERVICE_TOKEN
14
- } from "../common/diTokens.js";
15
5
 
16
6
  function workspaceAudienceFromEntityId({ event } = {}) {
17
7
  const workspaceId = Number(event?.entityId);
@@ -60,12 +50,12 @@ function createInviteDecisionEvents({ includeDirectoryAndMembers = false } = {})
60
50
  createActorUserEvent({
61
51
  source: "workspace",
62
52
  entity: "invitation",
63
- realtimeEvent: WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT
53
+ realtimeEvent: "workspace.invitations.pending.changed"
64
54
  }),
65
55
  createActorUserEvent({
66
56
  source: "users",
67
57
  entity: "bootstrap",
68
- realtimeEvent: USERS_BOOTSTRAP_CHANGED_EVENT
58
+ realtimeEvent: "users.bootstrap.changed"
69
59
  })
70
60
  ];
71
61
 
@@ -74,11 +64,11 @@ function createInviteDecisionEvents({ includeDirectoryAndMembers = false } = {})
74
64
  createActorUserEvent({
75
65
  source: "workspace",
76
66
  entity: "directory",
77
- realtimeEvent: WORKSPACES_CHANGED_EVENT
67
+ realtimeEvent: "workspaces.changed"
78
68
  }),
79
69
  createWorkspaceAudienceEvent({
80
70
  entity: "member",
81
- realtimeEvent: WORKSPACE_MEMBERS_CHANGED_EVENT
71
+ realtimeEvent: "workspace.members.changed"
82
72
  })
83
73
  );
84
74
  }
@@ -86,7 +76,7 @@ function createInviteDecisionEvents({ includeDirectoryAndMembers = false } = {})
86
76
  events.push(
87
77
  createWorkspaceAudienceEvent({
88
78
  entity: "invite",
89
- realtimeEvent: WORKSPACE_INVITES_CHANGED_EVENT
79
+ realtimeEvent: "workspace.invites.changed"
90
80
  })
91
81
  );
92
82
 
@@ -99,7 +89,7 @@ function registerWorkspacePendingInvitations(app) {
99
89
  }
100
90
 
101
91
  app.service(
102
- USERS_WORKSPACE_PENDING_INVITATIONS_SERVICE_TOKEN,
92
+ "users.workspace.pending-invitations.service",
103
93
  (scope) =>
104
94
  createService({
105
95
  workspaceInvitesRepository: scope.make("workspaceInvitesRepository"),
@@ -119,7 +109,7 @@ function registerWorkspacePendingInvitations(app) {
119
109
  withActionDefaults(workspacePendingInvitationsActions, {
120
110
  domain: "workspace",
121
111
  dependencies: {
122
- workspacePendingInvitationsService: USERS_WORKSPACE_PENDING_INVITATIONS_SERVICE_TOKEN
112
+ workspacePendingInvitationsService: "users.workspace.pending-invitations.service"
123
113
  }
124
114
  })
125
115
  );
@@ -1,5 +1,4 @@
1
1
  import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
2
- import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
3
2
  import { workspaceSettingsResource } from "../../shared/resources/workspaceSettingsResource.js";
4
3
  import { resolveWorkspaceRoutePath } from "../common/support/workspaceRoutePaths.js";
5
4
  import { workspaceSlugParamsValidator } from "../common/validators/routeParamsValidator.js";
@@ -10,7 +9,7 @@ function bootWorkspaceSettings(app) {
10
9
  throw new Error("bootWorkspaceSettings requires application make().");
11
10
  }
12
11
 
13
- const router = app.make(KERNEL_TOKENS.HttpRouter);
12
+ const router = app.make("jskit.http.router");
14
13
  const appConfig = typeof app.has === "function" && app.has("appConfig") ? app.make("appConfig") : {};
15
14
  const workspaceRouteSurfaceId = resolveDefaultWorkspaceRouteSurfaceIdFromAppConfig(appConfig);
16
15
 
@@ -1,15 +1,10 @@
1
- import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
2
1
  import { withActionDefaults } from "@jskit-ai/kernel/shared/actions";
3
2
  import { resolveAppConfig } from "@jskit-ai/kernel/server/support";
4
- import {
5
- WORKSPACE_SETTINGS_CHANGED_EVENT
6
- } from "../../shared/events/usersEvents.js";
7
3
  import { deepFreeze } from "../common/support/deepFreeze.js";
8
4
  import { createRepository as createWorkspaceSettingsRepository } from "./workspaceSettingsRepository.js";
9
5
  import { createService as createWorkspaceSettingsService } from "./workspaceSettingsService.js";
10
6
  import { workspaceSettingsActions } from "./workspaceSettingsActions.js";
11
7
  import { createWorkspaceRoleCatalog } from "../../shared/roles.js";
12
- import { USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN } from "../common/diTokens.js";
13
8
  import { createWorkspaceEntityAndBootstrapEvents } from "../common/support/realtimeServiceEvents.js";
14
9
 
15
10
  function resolveWorkspaceSettingsDefaultInvitesEnabled(appConfig = {}) {
@@ -28,7 +23,7 @@ function registerWorkspaceSettings(app) {
28
23
  }
29
24
 
30
25
  app.singleton("workspaceSettingsRepository", (scope) => {
31
- const knex = scope.make(KERNEL_TOKENS.Knex);
26
+ const knex = scope.make("jskit.database.knex");
32
27
  const appConfig = resolveAppConfig(scope);
33
28
  return createWorkspaceSettingsRepository(knex, {
34
29
  defaultInvitesEnabled: resolveWorkspaceSettingsDefaultInvitesEnabled(appConfig)
@@ -40,7 +35,7 @@ function registerWorkspaceSettings(app) {
40
35
  (scope) =>
41
36
  createWorkspaceSettingsService({
42
37
  workspaceSettingsRepository: scope.make("workspaceSettingsRepository"),
43
- workspaceInvitationsEnabled: scope.make(USERS_WORKSPACE_INVITATIONS_ENABLED_TOKEN),
38
+ workspaceInvitationsEnabled: scope.make("users.workspace.invitations.enabled"),
44
39
  roleCatalog: createWorkspaceRoleCatalog(resolveAppConfig(scope))
45
40
  }),
46
41
  {
@@ -48,7 +43,7 @@ function registerWorkspaceSettings(app) {
48
43
  updateWorkspaceSettings: createWorkspaceEntityAndBootstrapEvents({
49
44
  workspaceEntity: "settings",
50
45
  workspaceOperation: "updated",
51
- workspaceRealtimeEvent: WORKSPACE_SETTINGS_CHANGED_EVENT
46
+ workspaceRealtimeEvent: "workspace.settings.changed"
52
47
  })
53
48
  })
54
49
  }
@@ -36,15 +36,6 @@ import {
36
36
  resolveTenancyProfile,
37
37
  isWorkspacesTenancyMode
38
38
  } from "./tenancyProfile.js";
39
- import {
40
- ACCOUNT_SETTINGS_CHANGED_EVENT,
41
- CONSOLE_SETTINGS_CHANGED_EVENT,
42
- WORKSPACE_SETTINGS_CHANGED_EVENT,
43
- WORKSPACE_MEMBERS_CHANGED_EVENT,
44
- WORKSPACE_INVITES_CHANGED_EVENT,
45
- WORKSPACES_CHANGED_EVENT,
46
- WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT
47
- } from "./events/usersEvents.js";
48
39
 
49
40
  const USERS_SHARED_API = Object.freeze({
50
41
  OWNER_ROLE_ID,
@@ -77,14 +68,7 @@ const USERS_SHARED_API = Object.freeze({
77
68
  WORKSPACE_SLUG_POLICY_IMMUTABLE_USERNAME,
78
69
  WORKSPACE_SLUG_POLICY_USER_SELECTED,
79
70
  resolveTenancyProfile,
80
- isWorkspacesTenancyMode,
81
- ACCOUNT_SETTINGS_CHANGED_EVENT,
82
- CONSOLE_SETTINGS_CHANGED_EVENT,
83
- WORKSPACE_SETTINGS_CHANGED_EVENT,
84
- WORKSPACE_MEMBERS_CHANGED_EVENT,
85
- WORKSPACE_INVITES_CHANGED_EVENT,
86
- WORKSPACES_CHANGED_EVENT,
87
- WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT
71
+ isWorkspacesTenancyMode
88
72
  });
89
73
 
90
74
  export {
@@ -119,12 +103,5 @@ export {
119
103
  WORKSPACE_SLUG_POLICY_USER_SELECTED,
120
104
  resolveTenancyProfile,
121
105
  isWorkspacesTenancyMode,
122
- ACCOUNT_SETTINGS_CHANGED_EVENT,
123
- CONSOLE_SETTINGS_CHANGED_EVENT,
124
- WORKSPACE_SETTINGS_CHANGED_EVENT,
125
- WORKSPACE_MEMBERS_CHANGED_EVENT,
126
- WORKSPACE_INVITES_CHANGED_EVENT,
127
- WORKSPACES_CHANGED_EVENT,
128
- WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT,
129
106
  USERS_SHARED_API
130
107
  };
@@ -1,8 +1,7 @@
1
1
  import { normalizeText } from "@jskit-ai/kernel/shared/actions/textNormalization";
2
2
  import { resolveGlobalArrayRegistry } from "./resolveGlobalArrayRegistry.js";
3
3
 
4
- const CONSOLE_SETTINGS_FIELDS_REGISTRY_KEY = Symbol.for("jskit.users-core.consoleSettingsFields");
5
- const consoleSettingsFields = resolveGlobalArrayRegistry(CONSOLE_SETTINGS_FIELDS_REGISTRY_KEY);
4
+ const consoleSettingsFields = resolveGlobalArrayRegistry("jskit.users-core.consoleSettingsFields");
6
5
 
7
6
  function defineField(field = {}) {
8
7
  const key = normalizeText(field.key);
@@ -8,8 +8,7 @@ const USER_SETTINGS_SECTIONS = Object.freeze({
8
8
 
9
9
  const USER_SETTINGS_SECTION_VALUES = Object.freeze(Object.values(USER_SETTINGS_SECTIONS));
10
10
 
11
- const USER_SETTINGS_FIELDS_REGISTRY_KEY = Symbol.for("jskit.users-core.userSettingsFields");
12
- const userSettingsFields = resolveGlobalArrayRegistry(USER_SETTINGS_FIELDS_REGISTRY_KEY);
11
+ const userSettingsFields = resolveGlobalArrayRegistry("jskit.users-core.userSettingsFields");
13
12
 
14
13
  function defineField(field = {}) {
15
14
  const key = normalizeText(field.key);
@@ -1,8 +1,7 @@
1
1
  import { normalizeText } from "@jskit-ai/kernel/shared/actions/textNormalization";
2
2
  import { resolveGlobalArrayRegistry } from "./resolveGlobalArrayRegistry.js";
3
3
 
4
- const WORKSPACE_SETTINGS_FIELDS_REGISTRY_KEY = Symbol.for("jskit.users-core.workspaceSettingsFields");
5
- const workspaceSettingsFields = resolveGlobalArrayRegistry(WORKSPACE_SETTINGS_FIELDS_REGISTRY_KEY);
4
+ const workspaceSettingsFields = resolveGlobalArrayRegistry("jskit.users-core.workspaceSettingsFields");
6
5
 
7
6
  function defineField(field = {}) {
8
7
  const key = normalizeText(field.key);
@@ -2,7 +2,7 @@ import { normalizePathname } from "@jskit-ai/kernel/shared/surface/paths";
2
2
  import { splitPathQueryAndHash } from "@jskit-ai/kernel/shared/support";
3
3
 
4
4
  const USERS_PUBLIC_API_BASE_PATH = "/api";
5
- const USERS_WORKSPACE_API_BASE_PATH = "/api/w/:workspaceSlug/workspace";
5
+ const USERS_WORKSPACE_API_BASE_PATH = "/api/w/:workspaceSlug";
6
6
 
7
7
  function normalizeApiRelativePath(relativePath = "/") {
8
8
  const { pathname, queryString, hash } = splitPathQueryAndHash(relativePath);
@@ -1,6 +1,5 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
4
3
  import { registerAvatarMultipartSupport } from "../src/server/accountProfile/registerAvatarMultipartSupport.js";
5
4
 
6
5
  function createAppStub({ hasFastify = true, fastify = null } = {}) {
@@ -13,13 +12,13 @@ function createAppStub({ hasFastify = true, fastify = null } = {}) {
13
12
 
14
13
  return {
15
14
  has(token) {
16
- if (token === KERNEL_TOKENS.Fastify) {
15
+ if (token === "jskit.fastify") {
17
16
  return hasFastify;
18
17
  }
19
18
  return false;
20
19
  },
21
20
  make(token) {
22
- if (token === KERNEL_TOKENS.Fastify) {
21
+ if (token === "jskit.fastify") {
23
22
  return resolvedFastify;
24
23
  }
25
24
  return null;
@@ -6,15 +6,6 @@ import { registerAccountNotifications } from "../src/server/accountNotifications
6
6
  import { registerConsoleSettings } from "../src/server/consoleSettings/registerConsoleSettings.js";
7
7
  import { registerWorkspaceMembers } from "../src/server/workspaceMembers/registerWorkspaceMembers.js";
8
8
  import { registerWorkspacePendingInvitations } from "../src/server/workspacePendingInvitations/registerWorkspacePendingInvitations.js";
9
- import {
10
- ACCOUNT_SETTINGS_CHANGED_EVENT,
11
- CONSOLE_SETTINGS_CHANGED_EVENT,
12
- USERS_BOOTSTRAP_CHANGED_EVENT,
13
- WORKSPACE_MEMBERS_CHANGED_EVENT,
14
- WORKSPACE_INVITES_CHANGED_EVENT,
15
- WORKSPACES_CHANGED_EVENT,
16
- WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT
17
- } from "../src/shared/events/usersEvents.js";
18
9
 
19
10
  function createAppDouble() {
20
11
  const serviceCalls = [];
@@ -48,43 +39,43 @@ test("account register functions publish account.settings.changed for update ope
48
39
  const profileApp = createAppDouble();
49
40
  registerAccountProfile(profileApp.app);
50
41
  const profile = findServiceCall(profileApp.serviceCalls, "users.accountProfile.service");
51
- assert.equal(profile?.metadata?.events?.updateProfile?.[0]?.realtime?.event, ACCOUNT_SETTINGS_CHANGED_EVENT);
52
- assert.equal(profile?.metadata?.events?.updateProfile?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
53
- assert.equal(profile?.metadata?.events?.uploadAvatar?.[0]?.realtime?.event, ACCOUNT_SETTINGS_CHANGED_EVENT);
54
- assert.equal(profile?.metadata?.events?.uploadAvatar?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
55
- assert.equal(profile?.metadata?.events?.deleteAvatar?.[0]?.realtime?.event, ACCOUNT_SETTINGS_CHANGED_EVENT);
56
- assert.equal(profile?.metadata?.events?.deleteAvatar?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
42
+ assert.equal(profile?.metadata?.events?.updateProfile?.[0]?.realtime?.event, "account.settings.changed");
43
+ assert.equal(profile?.metadata?.events?.updateProfile?.[1]?.realtime?.event, "users.bootstrap.changed");
44
+ assert.equal(profile?.metadata?.events?.uploadAvatar?.[0]?.realtime?.event, "account.settings.changed");
45
+ assert.equal(profile?.metadata?.events?.uploadAvatar?.[1]?.realtime?.event, "users.bootstrap.changed");
46
+ assert.equal(profile?.metadata?.events?.deleteAvatar?.[0]?.realtime?.event, "account.settings.changed");
47
+ assert.equal(profile?.metadata?.events?.deleteAvatar?.[1]?.realtime?.event, "users.bootstrap.changed");
57
48
 
58
49
  const preferencesApp = createAppDouble();
59
50
  registerAccountPreferences(preferencesApp.app);
60
51
  const preferences = findServiceCall(preferencesApp.serviceCalls, "users.accountPreferences.service");
61
- assert.equal(preferences?.metadata?.events?.updatePreferences?.[0]?.realtime?.event, ACCOUNT_SETTINGS_CHANGED_EVENT);
62
- assert.equal(preferences?.metadata?.events?.updatePreferences?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
52
+ assert.equal(preferences?.metadata?.events?.updatePreferences?.[0]?.realtime?.event, "account.settings.changed");
53
+ assert.equal(preferences?.metadata?.events?.updatePreferences?.[1]?.realtime?.event, "users.bootstrap.changed");
63
54
 
64
55
  const notificationsApp = createAppDouble();
65
56
  registerAccountNotifications(notificationsApp.app);
66
57
  const notifications = findServiceCall(notificationsApp.serviceCalls, "users.accountNotifications.service");
67
- assert.equal(notifications?.metadata?.events?.updateNotifications?.[0]?.realtime?.event, ACCOUNT_SETTINGS_CHANGED_EVENT);
68
- assert.equal(notifications?.metadata?.events?.updateNotifications?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
58
+ assert.equal(notifications?.metadata?.events?.updateNotifications?.[0]?.realtime?.event, "account.settings.changed");
59
+ assert.equal(notifications?.metadata?.events?.updateNotifications?.[1]?.realtime?.event, "users.bootstrap.changed");
69
60
  });
70
61
 
71
62
  test("console settings register publishes console.settings.changed", () => {
72
63
  const payload = createAppDouble();
73
64
  registerConsoleSettings(payload.app);
74
65
  const consoleSettings = findServiceCall(payload.serviceCalls, "users.console.settings.service");
75
- assert.equal(consoleSettings?.metadata?.events?.updateSettings?.[0]?.realtime?.event, CONSOLE_SETTINGS_CHANGED_EVENT);
66
+ assert.equal(consoleSettings?.metadata?.events?.updateSettings?.[0]?.realtime?.event, "console.settings.changed");
76
67
  });
77
68
 
78
69
  test("workspace register functions publish members/invites/workspace-list realtime events", async () => {
79
70
  const membersApp = createAppDouble();
80
71
  registerWorkspaceMembers(membersApp.app);
81
72
  const members = findServiceCall(membersApp.serviceCalls, "users.workspace.members.service");
82
- assert.equal(members?.metadata?.events?.updateMemberRole?.[0]?.realtime?.event, WORKSPACE_MEMBERS_CHANGED_EVENT);
83
- assert.equal(members?.metadata?.events?.updateMemberRole?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
84
- assert.equal(members?.metadata?.events?.removeMember?.[0]?.realtime?.event, WORKSPACE_MEMBERS_CHANGED_EVENT);
85
- assert.equal(members?.metadata?.events?.removeMember?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
86
- assert.equal(members?.metadata?.events?.createInvite?.[0]?.realtime?.event, WORKSPACE_INVITES_CHANGED_EVENT);
87
- assert.equal(members?.metadata?.events?.createInvite?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
73
+ assert.equal(members?.metadata?.events?.updateMemberRole?.[0]?.realtime?.event, "workspace.members.changed");
74
+ assert.equal(members?.metadata?.events?.updateMemberRole?.[1]?.realtime?.event, "users.bootstrap.changed");
75
+ assert.equal(members?.metadata?.events?.removeMember?.[0]?.realtime?.event, "workspace.members.changed");
76
+ assert.equal(members?.metadata?.events?.removeMember?.[1]?.realtime?.event, "users.bootstrap.changed");
77
+ assert.equal(members?.metadata?.events?.createInvite?.[0]?.realtime?.event, "workspace.invites.changed");
78
+ assert.equal(members?.metadata?.events?.createInvite?.[1]?.realtime?.event, "users.bootstrap.changed");
88
79
  assert.equal(members?.metadata?.events?.createInvite?.[1]?.entityId?.({ result: { createdInviteId: 91 } }), 91);
89
80
  assert.equal(members?.metadata?.events?.createInvite?.[1]?.realtime?.audience?.preset, "event_scope");
90
81
  assert.equal(typeof members?.metadata?.events?.createInvite?.[1]?.realtime?.audience?.userQuery, "function");
@@ -111,8 +102,8 @@ test("workspace register functions publish members/invites/workspace-list realti
111
102
  }
112
103
  });
113
104
  assert.deepEqual(createInviteAudienceQueryResult, [{ userId: 55 }]);
114
- assert.equal(members?.metadata?.events?.revokeInvite?.[0]?.realtime?.event, WORKSPACE_INVITES_CHANGED_EVENT);
115
- assert.equal(members?.metadata?.events?.revokeInvite?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
105
+ assert.equal(members?.metadata?.events?.revokeInvite?.[0]?.realtime?.event, "workspace.invites.changed");
106
+ assert.equal(members?.metadata?.events?.revokeInvite?.[1]?.realtime?.event, "users.bootstrap.changed");
116
107
  assert.equal(members?.metadata?.events?.revokeInvite?.[1]?.entityId?.({ result: { revokedInviteId: 19 } }), 19);
117
108
  assert.equal(members?.metadata?.events?.revokeInvite?.[1]?.realtime?.audience?.preset, "event_scope");
118
109
  assert.equal(typeof members?.metadata?.events?.revokeInvite?.[1]?.realtime?.audience?.userQuery, "function");
@@ -124,14 +115,14 @@ test("workspace register functions publish members/invites/workspace-list realti
124
115
  ? pending.metadata.events.acceptInviteByToken
125
116
  : [];
126
117
  const acceptInviteRealtimeEvents = acceptInviteEvents.map((entry) => entry?.realtime?.event).filter(Boolean);
127
- assert.ok(acceptInviteRealtimeEvents.includes(WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT));
128
- assert.ok(acceptInviteRealtimeEvents.includes(USERS_BOOTSTRAP_CHANGED_EVENT));
129
- assert.ok(acceptInviteRealtimeEvents.includes(WORKSPACES_CHANGED_EVENT));
130
- assert.ok(acceptInviteRealtimeEvents.includes(WORKSPACE_MEMBERS_CHANGED_EVENT));
131
- assert.ok(acceptInviteRealtimeEvents.includes(WORKSPACE_INVITES_CHANGED_EVENT));
118
+ assert.ok(acceptInviteRealtimeEvents.includes("workspace.invitations.pending.changed"));
119
+ assert.ok(acceptInviteRealtimeEvents.includes("users.bootstrap.changed"));
120
+ assert.ok(acceptInviteRealtimeEvents.includes("workspaces.changed"));
121
+ assert.ok(acceptInviteRealtimeEvents.includes("workspace.members.changed"));
122
+ assert.ok(acceptInviteRealtimeEvents.includes("workspace.invites.changed"));
132
123
 
133
124
  const acceptedMembersChange = acceptInviteEvents.find(
134
- (entry) => entry?.realtime?.event === WORKSPACE_MEMBERS_CHANGED_EVENT
125
+ (entry) => entry?.realtime?.event === "workspace.members.changed"
135
126
  );
136
127
  assert.equal(acceptedMembersChange?.entityId?.({ result: { workspaceId: 9 } }), 9);
137
128
  assert.deepEqual(
@@ -146,7 +137,7 @@ test("workspace register functions publish members/invites/workspace-list realti
146
137
  );
147
138
 
148
139
  const acceptedInvitesChange = acceptInviteEvents.find(
149
- (entry) => entry?.realtime?.event === WORKSPACE_INVITES_CHANGED_EVENT
140
+ (entry) => entry?.realtime?.event === "workspace.invites.changed"
150
141
  );
151
142
  assert.equal(acceptedInvitesChange?.entityId?.({ result: { workspaceId: 9 } }), 9);
152
143
 
@@ -154,7 +145,7 @@ test("workspace register functions publish members/invites/workspace-list realti
154
145
  ? pending.metadata.events.refuseInviteByToken
155
146
  : [];
156
147
  const refuseInviteRealtimeEvents = refuseInviteEvents.map((entry) => entry?.realtime?.event).filter(Boolean);
157
- assert.ok(refuseInviteRealtimeEvents.includes(WORKSPACE_PENDING_INVITATIONS_CHANGED_EVENT));
158
- assert.ok(refuseInviteRealtimeEvents.includes(USERS_BOOTSTRAP_CHANGED_EVENT));
159
- assert.ok(refuseInviteRealtimeEvents.includes(WORKSPACE_INVITES_CHANGED_EVENT));
148
+ assert.ok(refuseInviteRealtimeEvents.includes("workspace.invitations.pending.changed"));
149
+ assert.ok(refuseInviteRealtimeEvents.includes("users.bootstrap.changed"));
150
+ assert.ok(refuseInviteRealtimeEvents.includes("workspace.invites.changed"));
160
151
  });
@@ -1,10 +1,6 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
3
  import { registerWorkspaceSettings } from "../src/server/workspaceSettings/registerWorkspaceSettings.js";
4
- import {
5
- USERS_BOOTSTRAP_CHANGED_EVENT,
6
- WORKSPACE_SETTINGS_CHANGED_EVENT
7
- } from "../src/shared/events/usersEvents.js";
8
4
 
9
5
  test("registerWorkspaceSettings registers workspace settings service realtime event metadata", () => {
10
6
  const singletonBindings = new Map();
@@ -36,9 +32,9 @@ test("registerWorkspaceSettings registers workspace settings service realtime ev
36
32
  assert.equal(serviceCalls.length, 1);
37
33
  assert.equal(serviceCalls[0].token, "users.workspace.settings.service");
38
34
  assert.equal(typeof serviceCalls[0].factory, "function");
39
- assert.equal(serviceCalls[0].metadata?.events?.updateWorkspaceSettings?.[0]?.realtime?.event, WORKSPACE_SETTINGS_CHANGED_EVENT);
35
+ assert.equal(serviceCalls[0].metadata?.events?.updateWorkspaceSettings?.[0]?.realtime?.event, "workspace.settings.changed");
40
36
  assert.equal(serviceCalls[0].metadata?.events?.updateWorkspaceSettings?.[0]?.realtime?.audience, "event_scope");
41
- assert.equal(serviceCalls[0].metadata?.events?.updateWorkspaceSettings?.[1]?.realtime?.event, USERS_BOOTSTRAP_CHANGED_EVENT);
37
+ assert.equal(serviceCalls[0].metadata?.events?.updateWorkspaceSettings?.[1]?.realtime?.event, "users.bootstrap.changed");
42
38
  assert.equal(serviceCalls[0].metadata?.events?.updateWorkspaceSettings?.[1]?.realtime?.audience, "event_scope");
43
39
  assert.equal(actionCalls.length, 1);
44
40
  });