@jskit-ai/users-core 0.1.26 → 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.
- package/package.descriptor.mjs +15 -22
- package/package.json +5 -6
- package/src/server/UsersCoreServiceProvider.js +2 -6
- package/src/server/accountNotifications/bootAccountNotificationsRoutes.js +1 -2
- package/src/server/accountNotifications/registerAccountNotifications.js +2 -4
- package/src/server/accountPreferences/bootAccountPreferencesRoutes.js +1 -2
- package/src/server/accountPreferences/registerAccountPreferences.js +2 -4
- package/src/server/accountProfile/bootAccountProfileRoutes.js +2 -4
- package/src/server/accountProfile/registerAccountProfile.js +8 -14
- package/src/server/accountProfile/registerAvatarMultipartSupport.js +5 -8
- package/src/server/accountSecurity/bootAccountSecurityRoutes.js +1 -2
- package/src/server/accountSecurity/registerAccountSecurity.js +2 -4
- package/src/server/common/README.md +0 -1
- package/src/server/common/registerCommonRepositories.js +6 -7
- package/src/server/common/support/realtimeServiceEvents.js +3 -7
- package/src/server/consoleSettings/bootConsoleSettingsRoutes.js +1 -2
- package/src/server/consoleSettings/registerConsoleSettings.js +1 -2
- package/src/server/registerWorkspaceBootstrap.js +4 -10
- package/src/server/registerWorkspaceCore.js +14 -25
- package/src/server/workspaceDirectory/bootWorkspaceDirectoryRoutes.js +3 -7
- package/src/server/workspaceMembers/bootWorkspaceMembers.js +3 -5
- package/src/server/workspaceMembers/registerWorkspaceMembers.js +7 -13
- package/src/server/workspacePendingInvitations/bootWorkspacePendingInvitations.js +1 -2
- package/src/server/workspacePendingInvitations/registerWorkspacePendingInvitations.js +7 -17
- package/src/server/workspaceSettings/bootWorkspaceSettings.js +1 -2
- package/src/server/workspaceSettings/registerWorkspaceSettings.js +3 -8
- package/src/shared/index.js +1 -24
- package/src/shared/resources/consoleSettingsFields.js +1 -2
- package/src/shared/resources/userSettingsFields.js +1 -2
- package/src/shared/resources/workspaceSettingsFields.js +1 -2
- package/src/shared/support/usersApiPaths.js +1 -1
- package/test/registerAvatarMultipartSupport.test.js +2 -3
- package/test/registerServiceRealtimeEvents.test.js +29 -38
- package/test/registerWorkspaceSettings.test.js +2 -6
- package/test/usersApiPaths.test.js +2 -2
- package/test/usersRouteRequestInputValidator.test.js +38 -39
- package/test/workspaceSettingsRepository.test.js +6 -4
- package/src/server/common/diTokens.js +0 -21
- 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(
|
|
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(
|
|
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(
|
|
54
|
-
return scope.make(
|
|
42
|
+
app.singleton("users.workspace.enabled", (scope) => {
|
|
43
|
+
return scope.make("users.tenancy.profile").workspace.enabled === true;
|
|
55
44
|
});
|
|
56
45
|
|
|
57
|
-
app.singleton(
|
|
58
|
-
return scope.make(
|
|
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(
|
|
62
|
-
return scope.make(
|
|
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(
|
|
54
|
+
app.singleton("users.workspace.invitations.enabled", (scope) => {
|
|
66
55
|
const appConfig = resolveAppConfig(scope);
|
|
67
|
-
const tenancyProfile = scope.make(
|
|
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,
|
|
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(
|
|
81
|
-
app.singleton(
|
|
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,
|
|
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(
|
|
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(
|
|
20
|
-
? app.make(
|
|
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(
|
|
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(
|
|
21
|
-
? app.make(
|
|
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
|
-
|
|
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(
|
|
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:
|
|
71
|
+
workspaceRealtimeEvent: "workspace.members.changed"
|
|
78
72
|
}),
|
|
79
73
|
removeMember: createWorkspaceEntityAndBootstrapEvents({
|
|
80
74
|
workspaceEntity: "member",
|
|
81
75
|
workspaceOperation: "updated",
|
|
82
|
-
workspaceRealtimeEvent:
|
|
76
|
+
workspaceRealtimeEvent: "workspace.members.changed"
|
|
83
77
|
}),
|
|
84
78
|
createInvite: createWorkspaceEntityAndBootstrapEvents({
|
|
85
79
|
workspaceEntity: "invite",
|
|
86
80
|
workspaceOperation: "created",
|
|
87
|
-
workspaceRealtimeEvent:
|
|
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:
|
|
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:
|
|
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(
|
|
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:
|
|
53
|
+
realtimeEvent: "workspace.invitations.pending.changed"
|
|
64
54
|
}),
|
|
65
55
|
createActorUserEvent({
|
|
66
56
|
source: "users",
|
|
67
57
|
entity: "bootstrap",
|
|
68
|
-
realtimeEvent:
|
|
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:
|
|
67
|
+
realtimeEvent: "workspaces.changed"
|
|
78
68
|
}),
|
|
79
69
|
createWorkspaceAudienceEvent({
|
|
80
70
|
entity: "member",
|
|
81
|
-
realtimeEvent:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
46
|
+
workspaceRealtimeEvent: "workspace.settings.changed"
|
|
52
47
|
})
|
|
53
48
|
})
|
|
54
49
|
}
|
package/src/shared/index.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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 ===
|
|
15
|
+
if (token === "jskit.fastify") {
|
|
17
16
|
return hasFastify;
|
|
18
17
|
}
|
|
19
18
|
return false;
|
|
20
19
|
},
|
|
21
20
|
make(token) {
|
|
22
|
-
if (token ===
|
|
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,
|
|
52
|
-
assert.equal(profile?.metadata?.events?.updateProfile?.[1]?.realtime?.event,
|
|
53
|
-
assert.equal(profile?.metadata?.events?.uploadAvatar?.[0]?.realtime?.event,
|
|
54
|
-
assert.equal(profile?.metadata?.events?.uploadAvatar?.[1]?.realtime?.event,
|
|
55
|
-
assert.equal(profile?.metadata?.events?.deleteAvatar?.[0]?.realtime?.event,
|
|
56
|
-
assert.equal(profile?.metadata?.events?.deleteAvatar?.[1]?.realtime?.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,
|
|
62
|
-
assert.equal(preferences?.metadata?.events?.updatePreferences?.[1]?.realtime?.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,
|
|
68
|
-
assert.equal(notifications?.metadata?.events?.updateNotifications?.[1]?.realtime?.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,
|
|
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,
|
|
83
|
-
assert.equal(members?.metadata?.events?.updateMemberRole?.[1]?.realtime?.event,
|
|
84
|
-
assert.equal(members?.metadata?.events?.removeMember?.[0]?.realtime?.event,
|
|
85
|
-
assert.equal(members?.metadata?.events?.removeMember?.[1]?.realtime?.event,
|
|
86
|
-
assert.equal(members?.metadata?.events?.createInvite?.[0]?.realtime?.event,
|
|
87
|
-
assert.equal(members?.metadata?.events?.createInvite?.[1]?.realtime?.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,
|
|
115
|
-
assert.equal(members?.metadata?.events?.revokeInvite?.[1]?.realtime?.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(
|
|
128
|
-
assert.ok(acceptInviteRealtimeEvents.includes(
|
|
129
|
-
assert.ok(acceptInviteRealtimeEvents.includes(
|
|
130
|
-
assert.ok(acceptInviteRealtimeEvents.includes(
|
|
131
|
-
assert.ok(acceptInviteRealtimeEvents.includes(
|
|
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 ===
|
|
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 ===
|
|
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(
|
|
158
|
-
assert.ok(refuseInviteRealtimeEvents.includes(
|
|
159
|
-
assert.ok(refuseInviteRealtimeEvents.includes(
|
|
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,
|
|
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,
|
|
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
|
});
|