@acorex-platform/module-security-management-client 0.0.58 → 0.0.60
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/fesm2022/{acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-BSGZRsGz.mjs → acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-B61j_cJF.mjs} +212 -13
- package/fesm2022/acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-B61j_cJF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-approve-join-request.command-BSvK59LV.mjs +322 -0
- package/fesm2022/acorex-platform-module-security-management-client-approve-join-request.command-BSvK59LV.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-device-sessions.mjs +21 -2
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-device-sessions.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-users.mjs +173 -14
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-users.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-B4oiF8FO.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-JP3zTrun.mjs} +10 -10
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-B4oiF8FO.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-JP3zTrun.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-CU-5X-qu.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-lwQtCJoy.mjs} +23 -4
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-lwQtCJoy.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-Bld1buTd.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-DZfizo-n.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-Bld1buTd.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-DZfizo-n.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-DZVzHzVM.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-Dkl_6Iio.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-DZVzHzVM.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-Dkl_6Iio.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-BCy5fNc9.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-Ddbd-rAG.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-BCy5fNc9.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-Ddbd-rAG.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-DcvYjfZm.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-WCgik8MV.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-DcvYjfZm.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-WCgik8MV.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-lNKDIDry.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-CRZftClq.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-lNKDIDry.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-CRZftClq.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-DKII6o5N.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-9QpoRCOF.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-DKII6o5N.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-9QpoRCOF.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-ge21b3mE.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-C34VzcYk.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-ge21b3mE.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-C34VzcYk.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-CJ7x5rjC.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-DuC5cfIb.mjs} +175 -16
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-DuC5cfIb.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts.mjs +342 -4
- package/fesm2022/acorex-platform-module-security-management-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-security-management-client-create-user-in-tenant.command-BFnZRmh9.mjs +376 -0
- package/fesm2022/acorex-platform-module-security-management-client-create-user-in-tenant.command-BFnZRmh9.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-index-DKk9lEIl.mjs → acorex-platform-module-security-management-client-index-B6qo6qLT.mjs} +5 -156
- package/fesm2022/acorex-platform-module-security-management-client-index-B6qo6qLT.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs +370 -0
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-reject-join-request.command-B3kiok6b.mjs +76 -0
- package/fesm2022/acorex-platform-module-security-management-client-reject-join-request.command-B3kiok6b.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-reset-two-factor.command-psTDKoNf.mjs → acorex-platform-module-security-management-client-reset-two-factor.command-C27mUZ1-.mjs} +7 -2
- package/fesm2022/acorex-platform-module-security-management-client-reset-two-factor.command-C27mUZ1-.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-send-password-reset-email.command-CoQgWdya.mjs → acorex-platform-module-security-management-client-send-password-reset-email.command-DFxm2T_x.mjs} +7 -2
- package/fesm2022/acorex-platform-module-security-management-client-send-password-reset-email.command-DFxm2T_x.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-settings.provider-CwDiU-C8.mjs +54 -0
- package/fesm2022/acorex-platform-module-security-management-client-settings.provider-CwDiU-C8.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs +231 -0
- package/fesm2022/acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client.mjs +1 -1
- package/i18n/en-AU/security-management.json +91 -4
- package/i18n/en-US/security-management.json +91 -4
- package/i18n/fa-IR/security-management.json +91 -4
- package/package.json +1 -1
- package/types/acorex-platform-module-security-management-client-contracts.d.ts +288 -8
- package/fesm2022/acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-BSGZRsGz.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-CU-5X-qu.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-CJ7x5rjC.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-index-DKk9lEIl.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-kFXjLdxy.mjs +0 -143
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-kFXjLdxy.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-reset-two-factor.command-psTDKoNf.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-send-password-reset-email.command-CoQgWdya.mjs.map +0 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
2
|
+
import { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
|
|
3
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
4
|
+
import { AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
|
|
5
|
+
import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
|
|
6
|
+
import { AXPWidgetsList } from '@acorex-platform/framework-shared/core';
|
|
7
|
+
import { resolveEntityActionCommandInput } from '@acorex-platform/framework-shared/runtime';
|
|
8
|
+
import { AXMSecurityManagementServerCommands, normalizeCreateApplicationRoleAssignments, flattenCreateApplicationRoleAssignments } from '@acorex-platform/module-security-management-client/contracts';
|
|
9
|
+
export { AXM_USER_CREATE_IN_TENANT_COMMAND } from '@acorex-platform/module-security-management-client/contracts';
|
|
10
|
+
import * as i0 from '@angular/core';
|
|
11
|
+
import { inject, Injectable } from '@angular/core';
|
|
12
|
+
import { A as AXMUserRoleGrantService } from './acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs';
|
|
13
|
+
|
|
14
|
+
/** TM edition feature — multi-app create (same gate as TM invite surface). */
|
|
15
|
+
const CREATE_MULTI_APPLICATION_FEATURE = 'TenantManagement:Feature:InviteMultiApplication';
|
|
16
|
+
/** Tenant-wide create surface only — Application Users stay app-scoped. */
|
|
17
|
+
const TENANT_USER_ENTITY = 'TenantManagement.TenantUser';
|
|
18
|
+
const TENANT_USER_ENTITY_NAME = 'TenantUser';
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region ----- Create user in tenant command -----
|
|
21
|
+
class AXPCreateUserInTenantCommand {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
24
|
+
this.commandService = inject(AXPCommandService);
|
|
25
|
+
this.toastService = inject(AXToastService);
|
|
26
|
+
this.translationService = inject(AXTranslationService);
|
|
27
|
+
this.sessionService = inject(AXPSessionService);
|
|
28
|
+
this.userRoleGrantService = inject(AXMUserRoleGrantService);
|
|
29
|
+
}
|
|
30
|
+
async execute(input) {
|
|
31
|
+
const actionInput = resolveEntityActionCommandInput(input);
|
|
32
|
+
const form = await this.openCreateDialog(actionInput);
|
|
33
|
+
if (!form) {
|
|
34
|
+
return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
|
|
35
|
+
}
|
|
36
|
+
const tenantMembershipCreate = this.allowsMultiApplicationCreate(actionInput);
|
|
37
|
+
const remotePayload = this.toCreateRemotePayload(form, tenantMembershipCreate);
|
|
38
|
+
// Nested server call must skip toast middleware — this command owns UX toasts.
|
|
39
|
+
const result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.CreateUserInTenant, remotePayload);
|
|
40
|
+
if (result?.success) {
|
|
41
|
+
const [toastTitle, toastContent] = await Promise.all([
|
|
42
|
+
this.translationService
|
|
43
|
+
.translateAsync('@security-management:users.entities.user.actions.create-in-tenant.success.title')
|
|
44
|
+
.catch(() => 'User Created'),
|
|
45
|
+
this.translationService
|
|
46
|
+
.translateAsync('@security-management:users.entities.user.actions.create-in-tenant.success.description')
|
|
47
|
+
.catch(() => 'The user was created and is ready to sign in.'),
|
|
48
|
+
]);
|
|
49
|
+
this.toastService.show({ color: 'success', title: toastTitle, content: toastContent, timeOut: 3000 });
|
|
50
|
+
return { success: true, kind: 'object', data: result.data };
|
|
51
|
+
}
|
|
52
|
+
const [toastTitle, fallback] = await Promise.all([
|
|
53
|
+
this.translationService
|
|
54
|
+
.translateAsync('@security-management:users.entities.user.actions.create-in-tenant.error.title')
|
|
55
|
+
.catch(() => 'Create Failed'),
|
|
56
|
+
this.translationService
|
|
57
|
+
.translateAsync('@security-management:users.entities.user.actions.create-in-tenant.error.description')
|
|
58
|
+
.catch(() => 'Failed to create user.'),
|
|
59
|
+
]);
|
|
60
|
+
const toastContent = (typeof result?.message?.text === 'string' && result.message.text) || fallback;
|
|
61
|
+
this.toastService.show({ color: 'danger', title: toastTitle, content: toastContent, timeOut: 4000 });
|
|
62
|
+
return { success: false, message: { text: toastContent } };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Multi-app repeater only for TM → Tenant Users create (ADR D-05 surface).
|
|
66
|
+
* Security → Users stays current-application only.
|
|
67
|
+
*/
|
|
68
|
+
allowsMultiApplicationCreate(actionInput) {
|
|
69
|
+
if (!this.sessionService.isFeatureEnabled(CREATE_MULTI_APPLICATION_FEATURE)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const entity = actionInput.entity ?? '';
|
|
73
|
+
const name = actionInput.entityInfo?.name ?? '';
|
|
74
|
+
return entity === TENANT_USER_ENTITY || name === TENANT_USER_ENTITY_NAME;
|
|
75
|
+
}
|
|
76
|
+
toCreateRemotePayload(form, tenantMembershipCreate) {
|
|
77
|
+
const base = {
|
|
78
|
+
email: form.email,
|
|
79
|
+
username: form.username,
|
|
80
|
+
displayName: form.displayName,
|
|
81
|
+
password: form.password,
|
|
82
|
+
tenantMembershipCreate,
|
|
83
|
+
};
|
|
84
|
+
if (!tenantMembershipCreate) {
|
|
85
|
+
const current = this.sessionService.application?.id?.trim();
|
|
86
|
+
return {
|
|
87
|
+
...base,
|
|
88
|
+
applicationIds: current ? [current] : undefined,
|
|
89
|
+
roleIds: form.roleIds,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const assignments = normalizeCreateApplicationRoleAssignments(form.applicationRoleRows);
|
|
93
|
+
const flat = flattenCreateApplicationRoleAssignments(assignments);
|
|
94
|
+
return {
|
|
95
|
+
...base,
|
|
96
|
+
applicationIds: flat.applicationIds,
|
|
97
|
+
roleIds: flat.roleIds.length > 0 ? flat.roleIds : undefined,
|
|
98
|
+
applicationRoleAssignments: assignments,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async loadCreateEntitledApplicationOptions() {
|
|
102
|
+
const result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.ListTenantEntitledApplications, {});
|
|
103
|
+
if (!result?.success) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const payload = result?.data;
|
|
107
|
+
const items = Array.isArray(payload?.items) ? payload.items : [];
|
|
108
|
+
const locale = this.translationService.getActiveLang?.() ?? 'en-US';
|
|
109
|
+
return items
|
|
110
|
+
.map((item) => {
|
|
111
|
+
const id = String(item?.id ?? '').trim();
|
|
112
|
+
if (!id) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const title = resolveMultiLanguageString(item.title, locale).trim() || id;
|
|
116
|
+
return { id, title };
|
|
117
|
+
})
|
|
118
|
+
.filter((row) => row != null);
|
|
119
|
+
}
|
|
120
|
+
async loadCreateAssignableRoleOptions(applicationId) {
|
|
121
|
+
const result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.ListInviteAssignableRoles, applicationId ? { applicationId } : {});
|
|
122
|
+
if (!result?.success) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const payload = result?.data;
|
|
126
|
+
const items = Array.isArray(payload?.items) ? payload.items : [];
|
|
127
|
+
const locale = this.translationService.getActiveLang?.() ?? 'en-US';
|
|
128
|
+
return items
|
|
129
|
+
.map((item) => {
|
|
130
|
+
const id = String(item?.id ?? '').trim();
|
|
131
|
+
const appId = String(item?.applicationId ?? '').trim();
|
|
132
|
+
if (!id || !appId) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const title = resolveMultiLanguageString(item.title, locale).trim() || id;
|
|
136
|
+
return { id, title, applicationId: appId };
|
|
137
|
+
})
|
|
138
|
+
.filter((row) => row != null);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Per-row Application + Roles for create-in-tenant. Duplicate apps allowed in UI;
|
|
142
|
+
* submit merges via `normalizeCreateApplicationRoleAssignments`.
|
|
143
|
+
*/
|
|
144
|
+
buildCreateApplicationRoleRepeaterChildren(entitledApps, roleOptions) {
|
|
145
|
+
return [
|
|
146
|
+
{
|
|
147
|
+
type: AXPWidgetsList.Layouts.FlexLayout,
|
|
148
|
+
mode: 'edit',
|
|
149
|
+
options: {
|
|
150
|
+
flexDirection: 'row',
|
|
151
|
+
gap: '12px',
|
|
152
|
+
alignItems: 'flex-end',
|
|
153
|
+
wrap: 'nowrap',
|
|
154
|
+
},
|
|
155
|
+
children: [
|
|
156
|
+
{
|
|
157
|
+
type: AXPWidgetsList.Layouts.FlexItemLayout,
|
|
158
|
+
mode: 'edit',
|
|
159
|
+
options: { grow: '1', shrink: '1', basis: '0' },
|
|
160
|
+
children: [
|
|
161
|
+
{
|
|
162
|
+
type: AXPWidgetsList.Layouts.FormField,
|
|
163
|
+
mode: 'edit',
|
|
164
|
+
options: {
|
|
165
|
+
label: '@security-management:users.entities.user.actions.create-in-tenant.fields.application',
|
|
166
|
+
showLabel: true,
|
|
167
|
+
},
|
|
168
|
+
children: [
|
|
169
|
+
{
|
|
170
|
+
type: AXPWidgetsList.Editors.SelectBox,
|
|
171
|
+
mode: 'edit',
|
|
172
|
+
path: 'applicationId',
|
|
173
|
+
name: 'applicationId',
|
|
174
|
+
options: {
|
|
175
|
+
dataSource: entitledApps,
|
|
176
|
+
valueField: 'id',
|
|
177
|
+
textField: 'title',
|
|
178
|
+
allowSearch: true,
|
|
179
|
+
validations: [{ rule: 'required' }],
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: AXPWidgetsList.Layouts.FlexItemLayout,
|
|
188
|
+
mode: 'edit',
|
|
189
|
+
options: { grow: '1', shrink: '1', basis: '0' },
|
|
190
|
+
children: [
|
|
191
|
+
{
|
|
192
|
+
type: AXPWidgetsList.Layouts.FormField,
|
|
193
|
+
mode: 'edit',
|
|
194
|
+
options: {
|
|
195
|
+
label: '@security-management:users.entities.user.actions.create-in-tenant.fields.roles',
|
|
196
|
+
showLabel: true,
|
|
197
|
+
},
|
|
198
|
+
children: [
|
|
199
|
+
{
|
|
200
|
+
type: AXPWidgetsList.Editors.SelectBox,
|
|
201
|
+
mode: 'edit',
|
|
202
|
+
path: 'roleIds',
|
|
203
|
+
name: 'roleIds',
|
|
204
|
+
options: {
|
|
205
|
+
dataSource: roleOptions,
|
|
206
|
+
valueField: 'id',
|
|
207
|
+
textField: 'title',
|
|
208
|
+
multiple: true,
|
|
209
|
+
allowSearch: true,
|
|
210
|
+
disabled: "{{ !context.eval('>applicationId') }}",
|
|
211
|
+
filter: {
|
|
212
|
+
field: 'applicationId',
|
|
213
|
+
operator: { type: 'equal' },
|
|
214
|
+
value: "{{ context.eval('>applicationId') }}",
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
triggers: [
|
|
218
|
+
{
|
|
219
|
+
event: "{{ events.context('>applicationId') }}",
|
|
220
|
+
action: '{{ widget.setValue([]); widget.refresh(); }}',
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
];
|
|
231
|
+
}
|
|
232
|
+
async openCreateDialog(actionInput) {
|
|
233
|
+
const multiApp = this.allowsMultiApplicationCreate(actionInput);
|
|
234
|
+
const [entitledApps, createRoleOptions, productRoleOptions] = await Promise.all([
|
|
235
|
+
multiApp
|
|
236
|
+
? this.loadCreateEntitledApplicationOptions()
|
|
237
|
+
: Promise.resolve([]),
|
|
238
|
+
multiApp
|
|
239
|
+
? this.loadCreateAssignableRoleOptions()
|
|
240
|
+
: Promise.resolve([]),
|
|
241
|
+
multiApp
|
|
242
|
+
? Promise.resolve([])
|
|
243
|
+
: this.userRoleGrantService.listInviteRoleOptions('application'),
|
|
244
|
+
]);
|
|
245
|
+
const appsWithRoles = new Set(createRoleOptions.map((row) => row.applicationId));
|
|
246
|
+
const selectableApps = appsWithRoles.size > 0
|
|
247
|
+
? entitledApps.filter((app) => appsWithRoles.has(app.id))
|
|
248
|
+
: entitledApps;
|
|
249
|
+
const result = await this.layoutBuilder
|
|
250
|
+
.create()
|
|
251
|
+
.dialog((dialog) => {
|
|
252
|
+
dialog
|
|
253
|
+
.setTitle('@security-management:users.entities.user.actions.create-in-tenant.dialog.title')
|
|
254
|
+
.setSize(multiApp ? 'lg' : 'md')
|
|
255
|
+
.setCloseButton(true)
|
|
256
|
+
.setContext(multiApp
|
|
257
|
+
? {
|
|
258
|
+
email: '',
|
|
259
|
+
username: '',
|
|
260
|
+
displayName: '',
|
|
261
|
+
password: '',
|
|
262
|
+
applicationRoleRows: [{ applicationId: '', roleIds: [] }],
|
|
263
|
+
}
|
|
264
|
+
: {
|
|
265
|
+
email: '',
|
|
266
|
+
username: '',
|
|
267
|
+
displayName: '',
|
|
268
|
+
password: '',
|
|
269
|
+
roleIds: [],
|
|
270
|
+
})
|
|
271
|
+
.content((flex) => {
|
|
272
|
+
flex
|
|
273
|
+
.setDirection('column')
|
|
274
|
+
.setGap('12px')
|
|
275
|
+
.formField('@security-management:users.entities.user.actions.create-in-tenant.fields.email', (field) => {
|
|
276
|
+
field.path('email');
|
|
277
|
+
field.textBox({ validations: [{ rule: 'email' }] });
|
|
278
|
+
})
|
|
279
|
+
.formField('@security-management:users.entities.user.actions.create-in-tenant.fields.username', (field) => {
|
|
280
|
+
field.path('username');
|
|
281
|
+
field.textBox({});
|
|
282
|
+
})
|
|
283
|
+
.formField('@security-management:users.entities.user.actions.create-in-tenant.fields.display-name', (field) => {
|
|
284
|
+
field.path('displayName');
|
|
285
|
+
field.textBox({});
|
|
286
|
+
})
|
|
287
|
+
.formField('@security-management:users.entities.user.actions.create-in-tenant.fields.password', (field) => {
|
|
288
|
+
field.path('password');
|
|
289
|
+
field.passwordBox({
|
|
290
|
+
revealToggle: true,
|
|
291
|
+
validations: [{ rule: 'required' }, { rule: 'minLength', options: { value: 6 } }],
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
if (multiApp) {
|
|
295
|
+
flex.formField('@security-management:users.entities.user.actions.create-in-tenant.fields.application-roles', (field) => {
|
|
296
|
+
field.path('applicationRoleRows');
|
|
297
|
+
field.setShowLabel(true);
|
|
298
|
+
field.customWidget(AXPWidgetsList.Layouts.RepeaterLayout, {
|
|
299
|
+
hasControls: true,
|
|
300
|
+
inlineAddControl: true,
|
|
301
|
+
defaultItem: { applicationId: '', roleIds: [] },
|
|
302
|
+
children: this.buildCreateApplicationRoleRepeaterChildren(selectableApps, createRoleOptions),
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
flex.formField('@security-management:users.entities.user.actions.create-in-tenant.fields.roles', (field) => {
|
|
308
|
+
field.path('roleIds');
|
|
309
|
+
field.selectBox({
|
|
310
|
+
dataSource: productRoleOptions,
|
|
311
|
+
valueField: 'id',
|
|
312
|
+
textField: 'title',
|
|
313
|
+
multiple: true,
|
|
314
|
+
validations: [{ rule: 'required' }],
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
})
|
|
319
|
+
.setActions((actions) => {
|
|
320
|
+
actions.cancel('@general:actions.cancel.title');
|
|
321
|
+
actions.submit('@security-management:users.entities.user.actions.create-in-tenant.dialog.submit');
|
|
322
|
+
})
|
|
323
|
+
.onAction(async (dialogRef) => {
|
|
324
|
+
if (dialogRef.action() === 'cancel') {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
const ctx = dialogRef.context();
|
|
328
|
+
const email = (ctx.email ?? '').trim() || undefined;
|
|
329
|
+
const username = (ctx.username ?? '').trim() || undefined;
|
|
330
|
+
if (!email && !username) {
|
|
331
|
+
throw new Error('@security-management:users.entities.user.actions.create-in-tenant.errors.identity-required');
|
|
332
|
+
}
|
|
333
|
+
if (multiApp) {
|
|
334
|
+
const assignments = normalizeCreateApplicationRoleAssignments(ctx.applicationRoleRows);
|
|
335
|
+
if (assignments.length === 0) {
|
|
336
|
+
throw new Error('@security-management:users.entities.user.actions.create-in-tenant.errors.application-required');
|
|
337
|
+
}
|
|
338
|
+
if (assignments.some((row) => row.roleIds.length === 0)) {
|
|
339
|
+
throw new Error('@security-management:users.entities.user.actions.create-in-tenant.errors.roles-required');
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
email,
|
|
343
|
+
username,
|
|
344
|
+
displayName: (ctx.displayName ?? '').trim() || undefined,
|
|
345
|
+
password: (ctx.password ?? '').trim() || undefined,
|
|
346
|
+
applicationRoleRows: assignments,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
const roleIds = Array.isArray(ctx.roleIds)
|
|
350
|
+
? [...new Set(ctx.roleIds.map((id) => String(id).trim()).filter(Boolean))]
|
|
351
|
+
: [];
|
|
352
|
+
if (roleIds.length === 0) {
|
|
353
|
+
throw new Error('@security-management:users.entities.user.actions.create-in-tenant.errors.roles-required');
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
email,
|
|
357
|
+
username,
|
|
358
|
+
displayName: (ctx.displayName ?? '').trim() || undefined,
|
|
359
|
+
password: (ctx.password ?? '').trim() || undefined,
|
|
360
|
+
roleIds,
|
|
361
|
+
};
|
|
362
|
+
});
|
|
363
|
+
})
|
|
364
|
+
.show();
|
|
365
|
+
return resolveLayoutBuilderDialogResult(result);
|
|
366
|
+
}
|
|
367
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCreateUserInTenantCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
368
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCreateUserInTenantCommand, providedIn: 'root' }); }
|
|
369
|
+
}
|
|
370
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCreateUserInTenantCommand, decorators: [{
|
|
371
|
+
type: Injectable,
|
|
372
|
+
args: [{ providedIn: 'root' }]
|
|
373
|
+
}] });
|
|
374
|
+
|
|
375
|
+
export { AXPCreateUserInTenantCommand };
|
|
376
|
+
//# sourceMappingURL=acorex-platform-module-security-management-client-create-user-in-tenant.command-BFnZRmh9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-security-management-client-create-user-in-tenant.command-BFnZRmh9.mjs","sources":["../../../../libs/modules/security-management/client/src/lib/commands/create-user-in-tenant.command.ts"],"sourcesContent":["import { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPLayoutBuilderService,\n resolveLayoutBuilderDialogResult,\n} from '@acorex-platform/framework-client/layout/builder';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport type {\n AXPCommand,\n AXPCommandExecuteResultPromise,\n AXPEntityActionCommandInput,\n} from '@acorex-platform/framework-shared/runtime';\nimport { resolveEntityActionCommandInput } from '@acorex-platform/framework-shared/runtime';\nimport {\n AXM_USER_CREATE_IN_TENANT_COMMAND,\n AXMSecurityManagementServerCommands,\n flattenCreateApplicationRoleAssignments,\n normalizeCreateApplicationRoleAssignments,\n type AXMListInviteAssignableRolesResult,\n type AXMListTenantEntitledApplicationsResult,\n} from '@acorex-platform/module-security-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\nimport { AXMUserRoleGrantService } from '../features/user-roles/user-role-grant.service';\nimport type { UserRoleOption } from '../features/user-roles/user-role-grant.types';\n\n//#region ----- Types -----\n\ninterface CreateApplicationRoleRow {\n id?: string;\n applicationId?: string;\n roleIds?: string[];\n}\n\ninterface CreateInTenantFormResult {\n email?: string;\n username?: string;\n displayName?: string;\n password?: string;\n roleIds?: string[];\n applicationRoleRows?: CreateApplicationRoleRow[];\n}\n\ninterface EntitledApplicationOption {\n id: string;\n title: string;\n}\n\ninterface CreateRoleOption {\n id: string;\n title: string;\n applicationId: string;\n}\n\ninterface CreateRemotePayload {\n email?: string;\n username?: string;\n displayName?: string;\n password?: string;\n applicationIds?: string[];\n roleIds?: string[];\n applicationRoleAssignments?: Array<{ applicationId: string; roleIds: string[] }>;\n tenantMembershipCreate: boolean;\n}\n\n/** TM edition feature — multi-app create (same gate as TM invite surface). */\nconst CREATE_MULTI_APPLICATION_FEATURE = 'TenantManagement:Feature:InviteMultiApplication';\n\n/** Tenant-wide create surface only — Application Users stay app-scoped. */\nconst TENANT_USER_ENTITY = 'TenantManagement.TenantUser';\nconst TENANT_USER_ENTITY_NAME = 'TenantUser';\n\n//#endregion\n\n//#region ----- Create user in tenant command -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPCreateUserInTenantCommand implements AXPCommand {\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly userRoleGrantService = inject(AXMUserRoleGrantService);\n\n async execute(input?: unknown): AXPCommandExecuteResultPromise {\n const actionInput = resolveEntityActionCommandInput(input);\n const form = await this.openCreateDialog(actionInput);\n if (!form) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n\n const tenantMembershipCreate = this.allowsMultiApplicationCreate(actionInput);\n const remotePayload = this.toCreateRemotePayload(form, tenantMembershipCreate);\n\n // Nested server call must skip toast middleware — this command owns UX toasts.\n const result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.CreateUserInTenant,\n remotePayload,\n );\n\n if (result?.success) {\n const [toastTitle, toastContent] = await Promise.all([\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.create-in-tenant.success.title')\n .catch(() => 'User Created'),\n this.translationService\n .translateAsync(\n '@security-management:users.entities.user.actions.create-in-tenant.success.description',\n )\n .catch(() => 'The user was created and is ready to sign in.'),\n ]);\n this.toastService.show({ color: 'success', title: toastTitle, content: toastContent, timeOut: 3000 });\n return { success: true, kind: 'object', data: result.data };\n }\n\n const [toastTitle, fallback] = await Promise.all([\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.create-in-tenant.error.title')\n .catch(() => 'Create Failed'),\n this.translationService\n .translateAsync(\n '@security-management:users.entities.user.actions.create-in-tenant.error.description',\n )\n .catch(() => 'Failed to create user.'),\n ]);\n const toastContent =\n (typeof result?.message?.text === 'string' && result.message.text) || fallback;\n this.toastService.show({ color: 'danger', title: toastTitle, content: toastContent, timeOut: 4000 });\n return { success: false, message: { text: toastContent } };\n }\n\n /**\n * Multi-app repeater only for TM → Tenant Users create (ADR D-05 surface).\n * Security → Users stays current-application only.\n */\n private allowsMultiApplicationCreate(actionInput: AXPEntityActionCommandInput): boolean {\n if (!this.sessionService.isFeatureEnabled(CREATE_MULTI_APPLICATION_FEATURE)) {\n return false;\n }\n const entity = actionInput.entity ?? '';\n const name = actionInput.entityInfo?.name ?? '';\n return entity === TENANT_USER_ENTITY || name === TENANT_USER_ENTITY_NAME;\n }\n\n private toCreateRemotePayload(\n form: CreateInTenantFormResult,\n tenantMembershipCreate: boolean,\n ): CreateRemotePayload {\n const base: CreateRemotePayload = {\n email: form.email,\n username: form.username,\n displayName: form.displayName,\n password: form.password,\n tenantMembershipCreate,\n };\n\n if (!tenantMembershipCreate) {\n const current = this.sessionService.application?.id?.trim();\n return {\n ...base,\n applicationIds: current ? [current] : undefined,\n roleIds: form.roleIds,\n };\n }\n\n const assignments = normalizeCreateApplicationRoleAssignments(form.applicationRoleRows);\n const flat = flattenCreateApplicationRoleAssignments(assignments);\n return {\n ...base,\n applicationIds: flat.applicationIds,\n roleIds: flat.roleIds.length > 0 ? flat.roleIds : undefined,\n applicationRoleAssignments: assignments,\n };\n }\n\n private async loadCreateEntitledApplicationOptions(): Promise<EntitledApplicationOption[]> {\n const result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.ListTenantEntitledApplications,\n {},\n );\n if (!result?.success) {\n return [];\n }\n const payload = (result as { data?: AXMListTenantEntitledApplicationsResult })?.data;\n const items = Array.isArray(payload?.items) ? payload.items : [];\n const locale = this.translationService.getActiveLang?.() ?? 'en-US';\n return items\n .map((item) => {\n const id = String(item?.id ?? '').trim();\n if (!id) {\n return null;\n }\n const title =\n resolveMultiLanguageString(item.title as never, locale).trim() || id;\n return { id, title };\n })\n .filter((row): row is EntitledApplicationOption => row != null);\n }\n\n private async loadCreateAssignableRoleOptions(applicationId?: string): Promise<CreateRoleOption[]> {\n const result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.ListInviteAssignableRoles,\n applicationId ? { applicationId } : {},\n );\n if (!result?.success) {\n return [];\n }\n const payload = (result as { data?: AXMListInviteAssignableRolesResult })?.data;\n const items = Array.isArray(payload?.items) ? payload.items : [];\n const locale = this.translationService.getActiveLang?.() ?? 'en-US';\n return items\n .map((item) => {\n const id = String(item?.id ?? '').trim();\n const appId = String(item?.applicationId ?? '').trim();\n if (!id || !appId) {\n return null;\n }\n const title =\n resolveMultiLanguageString(item.title as never, locale).trim() || id;\n return { id, title, applicationId: appId };\n })\n .filter((row): row is CreateRoleOption => row != null);\n }\n\n /**\n * Per-row Application + Roles for create-in-tenant. Duplicate apps allowed in UI;\n * submit merges via `normalizeCreateApplicationRoleAssignments`.\n */\n private buildCreateApplicationRoleRepeaterChildren(\n entitledApps: EntitledApplicationOption[],\n roleOptions: CreateRoleOption[],\n ): Record<string, unknown>[] {\n return [\n {\n type: AXPWidgetsList.Layouts.FlexLayout,\n mode: 'edit' as const,\n options: {\n flexDirection: 'row',\n gap: '12px',\n alignItems: 'flex-end',\n wrap: 'nowrap',\n },\n children: [\n {\n type: AXPWidgetsList.Layouts.FlexItemLayout,\n mode: 'edit' as const,\n options: { grow: '1', shrink: '1', basis: '0' },\n children: [\n {\n type: AXPWidgetsList.Layouts.FormField,\n mode: 'edit' as const,\n options: {\n label:\n '@security-management:users.entities.user.actions.create-in-tenant.fields.application',\n showLabel: true,\n },\n children: [\n {\n type: AXPWidgetsList.Editors.SelectBox,\n mode: 'edit' as const,\n path: 'applicationId',\n name: 'applicationId',\n options: {\n dataSource: entitledApps,\n valueField: 'id',\n textField: 'title',\n allowSearch: true,\n validations: [{ rule: 'required' }],\n },\n },\n ],\n },\n ],\n },\n {\n type: AXPWidgetsList.Layouts.FlexItemLayout,\n mode: 'edit' as const,\n options: { grow: '1', shrink: '1', basis: '0' },\n children: [\n {\n type: AXPWidgetsList.Layouts.FormField,\n mode: 'edit' as const,\n options: {\n label:\n '@security-management:users.entities.user.actions.create-in-tenant.fields.roles',\n showLabel: true,\n },\n children: [\n {\n type: AXPWidgetsList.Editors.SelectBox,\n mode: 'edit' as const,\n path: 'roleIds',\n name: 'roleIds',\n options: {\n dataSource: roleOptions,\n valueField: 'id',\n textField: 'title',\n multiple: true,\n allowSearch: true,\n disabled: \"{{ !context.eval('>applicationId') }}\",\n filter: {\n field: 'applicationId',\n operator: { type: 'equal' },\n value: \"{{ context.eval('>applicationId') }}\",\n },\n },\n triggers: [\n {\n event: \"{{ events.context('>applicationId') }}\",\n action: '{{ widget.setValue([]); widget.refresh(); }}',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ];\n }\n\n private async openCreateDialog(\n actionInput: AXPEntityActionCommandInput,\n ): Promise<CreateInTenantFormResult | null> {\n const multiApp = this.allowsMultiApplicationCreate(actionInput);\n const [entitledApps, createRoleOptions, productRoleOptions] = await Promise.all([\n multiApp\n ? this.loadCreateEntitledApplicationOptions()\n : Promise.resolve([] as EntitledApplicationOption[]),\n multiApp\n ? this.loadCreateAssignableRoleOptions()\n : Promise.resolve([] as CreateRoleOption[]),\n multiApp\n ? Promise.resolve([] as UserRoleOption[])\n : this.userRoleGrantService.listInviteRoleOptions('application'),\n ]);\n const appsWithRoles = new Set(createRoleOptions.map((row) => row.applicationId));\n const selectableApps =\n appsWithRoles.size > 0\n ? entitledApps.filter((app) => appsWithRoles.has(app.id))\n : entitledApps;\n\n const result = await this.layoutBuilder\n .create()\n .dialog<CreateInTenantFormResult | null>((dialog) => {\n dialog\n .setTitle('@security-management:users.entities.user.actions.create-in-tenant.dialog.title')\n .setSize(multiApp ? 'lg' : 'md')\n .setCloseButton(true)\n .setContext(\n multiApp\n ? {\n email: '',\n username: '',\n displayName: '',\n password: '',\n applicationRoleRows: [{ applicationId: '', roleIds: [] }],\n }\n : {\n email: '',\n username: '',\n displayName: '',\n password: '',\n roleIds: [],\n },\n )\n .content((flex) => {\n flex\n .setDirection('column')\n .setGap('12px')\n .formField(\n '@security-management:users.entities.user.actions.create-in-tenant.fields.email',\n (field) => {\n field.path('email');\n field.textBox({ validations: [{ rule: 'email' }] });\n },\n )\n .formField(\n '@security-management:users.entities.user.actions.create-in-tenant.fields.username',\n (field) => {\n field.path('username');\n field.textBox({});\n },\n )\n .formField(\n '@security-management:users.entities.user.actions.create-in-tenant.fields.display-name',\n (field) => {\n field.path('displayName');\n field.textBox({});\n },\n )\n .formField(\n '@security-management:users.entities.user.actions.create-in-tenant.fields.password',\n (field) => {\n field.path('password');\n field.passwordBox({\n revealToggle: true,\n validations: [{ rule: 'required' }, { rule: 'minLength', options: { value: 6 } }],\n });\n },\n );\n\n if (multiApp) {\n flex.formField(\n '@security-management:users.entities.user.actions.create-in-tenant.fields.application-roles',\n (field) => {\n field.path('applicationRoleRows');\n field.setShowLabel(true);\n field.customWidget(AXPWidgetsList.Layouts.RepeaterLayout, {\n hasControls: true,\n inlineAddControl: true,\n defaultItem: { applicationId: '', roleIds: [] },\n children: this.buildCreateApplicationRoleRepeaterChildren(\n selectableApps,\n createRoleOptions,\n ),\n });\n },\n );\n } else {\n flex.formField(\n '@security-management:users.entities.user.actions.create-in-tenant.fields.roles',\n (field) => {\n field.path('roleIds');\n field.selectBox({\n dataSource: productRoleOptions as UserRoleOption[],\n valueField: 'id',\n textField: 'title',\n multiple: true,\n validations: [{ rule: 'required' }],\n });\n },\n );\n }\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title');\n actions.submit(\n '@security-management:users.entities.user.actions.create-in-tenant.dialog.submit',\n );\n })\n .onAction(async (dialogRef) => {\n if (dialogRef.action() === 'cancel') {\n return null;\n }\n const ctx = dialogRef.context() as CreateInTenantFormResult;\n const email = (ctx.email ?? '').trim() || undefined;\n const username = (ctx.username ?? '').trim() || undefined;\n if (!email && !username) {\n throw new Error(\n '@security-management:users.entities.user.actions.create-in-tenant.errors.identity-required',\n );\n }\n\n if (multiApp) {\n const assignments = normalizeCreateApplicationRoleAssignments(ctx.applicationRoleRows);\n if (assignments.length === 0) {\n throw new Error(\n '@security-management:users.entities.user.actions.create-in-tenant.errors.application-required',\n );\n }\n if (assignments.some((row) => row.roleIds.length === 0)) {\n throw new Error(\n '@security-management:users.entities.user.actions.create-in-tenant.errors.roles-required',\n );\n }\n return {\n email,\n username,\n displayName: (ctx.displayName ?? '').trim() || undefined,\n password: (ctx.password ?? '').trim() || undefined,\n applicationRoleRows: assignments,\n };\n }\n\n const roleIds = Array.isArray(ctx.roleIds)\n ? [...new Set(ctx.roleIds.map((id) => String(id).trim()).filter(Boolean))]\n : [];\n if (roleIds.length === 0) {\n throw new Error(\n '@security-management:users.entities.user.actions.create-in-tenant.errors.roles-required',\n );\n }\n return {\n email,\n username,\n displayName: (ctx.displayName ?? '').trim() || undefined,\n password: (ctx.password ?? '').trim() || undefined,\n roleIds,\n };\n });\n })\n .show();\n\n return resolveLayoutBuilderDialogResult<CreateInTenantFormResult>(result);\n }\n}\n\nexport { AXM_USER_CREATE_IN_TENANT_COMMAND };\n\n//#endregion\n"],"names":[],"mappings":"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"}
|
|
@@ -8,164 +8,13 @@ import * as i12 from '@acorex/core/translation';
|
|
|
8
8
|
import { AXTranslationModule } from '@acorex/core/translation';
|
|
9
9
|
import { AsyncPipe } from '@angular/common';
|
|
10
10
|
import * as i0 from '@angular/core';
|
|
11
|
-
import {
|
|
11
|
+
import { input, inject, signal, computed, effect, untracked, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
|
|
12
12
|
import * as i2 from '@angular/forms';
|
|
13
13
|
import { FormsModule } from '@angular/forms';
|
|
14
14
|
import { isEqual } from 'lodash-es';
|
|
15
|
-
import { r as resolvePersistedEntityId } from './acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { AXPEntityDefinitionRegistryService, AXPEntityService, dispatchEntityModifiedSideEffects } from '@acorex-platform/framework-client/layout/entity';
|
|
19
|
-
import { RootConfig, USER_ROLES_PAGE_COMPONENT_KEY } from '@acorex-platform/module-security-management-client/contracts';
|
|
20
|
-
|
|
21
|
-
//#region ----- Imports -----
|
|
22
|
-
//#endregion
|
|
23
|
-
//#region ----- Service -----
|
|
24
|
-
/**
|
|
25
|
-
* Loads and persists scoped UserRole assignments for a user.
|
|
26
|
-
* Shared by the User roles detail page.
|
|
27
|
-
*/
|
|
28
|
-
class AXMUserRoleGrantService {
|
|
29
|
-
constructor() {
|
|
30
|
-
//#region ----- Services & Dependencies -----
|
|
31
|
-
this.entityRegistry = inject(AXPEntityDefinitionRegistryService);
|
|
32
|
-
this.entityService = inject(AXPEntityService);
|
|
33
|
-
this.sessionService = inject(AXPSessionService);
|
|
34
|
-
this.entityEvents = inject(AXPEntityBroadcastService);
|
|
35
|
-
}
|
|
36
|
-
//#endregion
|
|
37
|
-
//#region ----- Scope -----
|
|
38
|
-
resolveSessionScope() {
|
|
39
|
-
const tenantId = this.sessionService.tenant?.id;
|
|
40
|
-
if (!tenantId) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
tenantId,
|
|
45
|
-
applicationId: this.sessionService.application?.id,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
//#endregion
|
|
49
|
-
//#region ----- Query -----
|
|
50
|
-
userRoleData() {
|
|
51
|
-
return this.entityService
|
|
52
|
-
.withEntity(RootConfig.module.name, RootConfig.entities.userRole.name)
|
|
53
|
-
.data();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Roles available to assign in the current workspace.
|
|
57
|
-
* Also loads any already-assigned role ids that list queries hide (`stateInfo.isHidden`).
|
|
58
|
-
*/
|
|
59
|
-
async listRoleOptions(includeRoleIds = []) {
|
|
60
|
-
const roleData = this.entityService
|
|
61
|
-
.withEntity(RootConfig.module.name, RootConfig.entities.roles.name)
|
|
62
|
-
.data();
|
|
63
|
-
const result = await roleData.query({
|
|
64
|
-
skip: 0,
|
|
65
|
-
take: 500,
|
|
66
|
-
});
|
|
67
|
-
const byId = new Map();
|
|
68
|
-
const items = (result?.items ?? []);
|
|
69
|
-
for (const item of items) {
|
|
70
|
-
const id = String(item['id'] ?? '');
|
|
71
|
-
if (!id) {
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
byId.set(id, {
|
|
75
|
-
id,
|
|
76
|
-
title: String(item['title'] ?? item['name'] ?? ''),
|
|
77
|
-
name: typeof item['name'] === 'string' ? item['name'] : undefined,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
const missingIds = includeRoleIds.filter((id) => id && !byId.has(id));
|
|
81
|
-
await Promise.all(missingIds.map(async (id) => {
|
|
82
|
-
try {
|
|
83
|
-
const row = (await roleData.byKey(id));
|
|
84
|
-
if (!row?.['id']) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
byId.set(String(row['id']), {
|
|
88
|
-
id: String(row['id']),
|
|
89
|
-
title: String(row['title'] ?? row['name'] ?? row['id']),
|
|
90
|
-
name: typeof row['name'] === 'string' ? row['name'] : undefined,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
/* role missing or inaccessible */
|
|
95
|
-
}
|
|
96
|
-
}));
|
|
97
|
-
return [...byId.values()].sort((a, b) => a.title.localeCompare(b.title));
|
|
98
|
-
}
|
|
99
|
-
async findGrant(userId, tenantId, applicationId) {
|
|
100
|
-
const result = await this.userRoleData().query({
|
|
101
|
-
skip: 0,
|
|
102
|
-
take: 50,
|
|
103
|
-
filter: {
|
|
104
|
-
logic: 'and',
|
|
105
|
-
filters: [
|
|
106
|
-
{ field: 'userId', operator: { type: 'equal' }, value: userId },
|
|
107
|
-
{ field: 'scopeInfo.tenantId', operator: { type: 'equal' }, value: tenantId },
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
const items = (result?.items ?? []);
|
|
112
|
-
if (items.length === 0) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
if (applicationId) {
|
|
116
|
-
const appMatch = items.find((item) => item.scopeInfo?.applicationId === applicationId);
|
|
117
|
-
if (appMatch) {
|
|
118
|
-
return appMatch;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
const tenantWide = items.find((item) => !item.scopeInfo?.applicationId);
|
|
122
|
-
return tenantWide ?? items[0] ?? null;
|
|
123
|
-
}
|
|
124
|
-
//#endregion
|
|
125
|
-
//#region ----- Persist -----
|
|
126
|
-
async saveGrant(options) {
|
|
127
|
-
const existingState = options.existing?.stateInfo;
|
|
128
|
-
if (existingState?.isSystem === true || existingState?.isImmutable === true) {
|
|
129
|
-
throw new Error('System user role grants are readonly.');
|
|
130
|
-
}
|
|
131
|
-
const entityKey = `${RootConfig.module.name}.${RootConfig.entities.userRole.name}`;
|
|
132
|
-
const [moduleName, entityName] = entityKey.split('.');
|
|
133
|
-
const entityRef = await this.entityRegistry.resolve(moduleName, entityName);
|
|
134
|
-
const scopeInfo = {
|
|
135
|
-
tenantId: options.tenantId,
|
|
136
|
-
...(options.existing?.scopeInfo?.applicationId
|
|
137
|
-
? { applicationId: options.existing.scopeInfo.applicationId }
|
|
138
|
-
: options.applicationId
|
|
139
|
-
? { applicationId: options.applicationId }
|
|
140
|
-
: {}),
|
|
141
|
-
};
|
|
142
|
-
if (options.existing?.id) {
|
|
143
|
-
const updatePayload = {
|
|
144
|
-
...options.existing,
|
|
145
|
-
userId: options.userId,
|
|
146
|
-
roleIds: options.roleIds,
|
|
147
|
-
scopeInfo,
|
|
148
|
-
};
|
|
149
|
-
return (entityRef.commands?.update?.execute)(updatePayload);
|
|
150
|
-
}
|
|
151
|
-
const createPayload = {
|
|
152
|
-
userId: options.userId,
|
|
153
|
-
roleIds: options.roleIds,
|
|
154
|
-
scopeInfo,
|
|
155
|
-
};
|
|
156
|
-
return (entityRef.commands?.create?.execute)(createPayload);
|
|
157
|
-
}
|
|
158
|
-
notifyGrantModified(saved) {
|
|
159
|
-
const entityKey = `${RootConfig.module.name}.${RootConfig.entities.userRole.name}`;
|
|
160
|
-
dispatchEntityModifiedSideEffects(this.entityEvents, entityKey, saved);
|
|
161
|
-
}
|
|
162
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserRoleGrantService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
163
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserRoleGrantService, providedIn: 'root' }); }
|
|
164
|
-
}
|
|
165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserRoleGrantService, decorators: [{
|
|
166
|
-
type: Injectable,
|
|
167
|
-
args: [{ providedIn: 'root' }]
|
|
168
|
-
}] });
|
|
15
|
+
import { r as resolvePersistedEntityId } from './acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-B61j_cJF.mjs';
|
|
16
|
+
import { A as AXMUserRoleGrantService } from './acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs';
|
|
17
|
+
import { USER_ROLES_PAGE_COMPONENT_KEY } from '@acorex-platform/module-security-management-client/contracts';
|
|
169
18
|
|
|
170
19
|
//#endregion
|
|
171
20
|
//#region ----- Constants -----
|
|
@@ -459,4 +308,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
459
308
|
}] });
|
|
460
309
|
|
|
461
310
|
export { AXMUserRolesPageComponent, AXMUserRolesPageComponentProvider };
|
|
462
|
-
//# sourceMappingURL=acorex-platform-module-security-management-client-index-
|
|
311
|
+
//# sourceMappingURL=acorex-platform-module-security-management-client-index-B6qo6qLT.mjs.map
|