@tidecloak/js 0.13.9 → 0.13.13

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.
@@ -0,0 +1,419 @@
1
+ /**
2
+ * AdminAPI - Keycloak Admin REST API client
3
+ *
4
+ * Provides methods to interact with the Keycloak Admin REST API
5
+ * using the IAMService for authentication.
6
+ */
7
+ import IAMService from './IAMService.js';
8
+ class AdminAPI {
9
+ constructor(realm) {
10
+ this.realm = realm;
11
+ }
12
+ /**
13
+ * Set the realm for API calls
14
+ */
15
+ setRealm(realm) {
16
+ this.realm = realm;
17
+ }
18
+ /**
19
+ * Get the current realm
20
+ */
21
+ getRealm() {
22
+ if (this.realm)
23
+ return this.realm;
24
+ const config = IAMService.getConfig();
25
+ return (config === null || config === void 0 ? void 0 : config.realm) || 'master';
26
+ }
27
+ /**
28
+ * Make an authenticated fetch request
29
+ */
30
+ async fetch(endpoint, options = {}) {
31
+ const token = await IAMService.getToken();
32
+ const baseURL = IAMService.getBaseUrl();
33
+ const url = endpoint.startsWith('http') ? endpoint : `${baseURL}${endpoint}`;
34
+ const response = await fetch(url, {
35
+ ...options,
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ 'Authorization': `Bearer ${token}`,
39
+ ...options.headers,
40
+ },
41
+ });
42
+ if (!response.ok) {
43
+ const errorText = await response.text().catch(() => '');
44
+ throw new Error(`API error ${response.status}: ${errorText || response.statusText}`);
45
+ }
46
+ const text = await response.text();
47
+ return text ? JSON.parse(text) : null;
48
+ }
49
+ /**
50
+ * Make an authenticated fetch request with FormData (no Content-Type header)
51
+ */
52
+ async fetchWithFormData(endpoint, formData) {
53
+ const token = await IAMService.getToken();
54
+ const baseURL = IAMService.getBaseUrl();
55
+ const url = endpoint.startsWith('http') ? endpoint : `${baseURL}${endpoint}`;
56
+ const response = await fetch(url, {
57
+ method: 'POST',
58
+ headers: {
59
+ 'Authorization': `Bearer ${token}`,
60
+ },
61
+ body: formData,
62
+ });
63
+ if (!response.ok) {
64
+ const errorText = await response.text().catch(() => '');
65
+ throw new Error(`API error ${response.status}: ${errorText || response.statusText}`);
66
+ }
67
+ const text = await response.text();
68
+ return text ? JSON.parse(text) : null;
69
+ }
70
+ // ==========================================================================
71
+ // Roles
72
+ // ==========================================================================
73
+ async getRoles() {
74
+ const realm = this.getRealm();
75
+ return this.fetch(`/admin/realms/${realm}/roles`);
76
+ }
77
+ async getRole(roleName) {
78
+ const realm = this.getRealm();
79
+ return this.fetch(`/admin/realms/${realm}/roles/${encodeURIComponent(roleName)}`);
80
+ }
81
+ async createRole(role) {
82
+ const realm = this.getRealm();
83
+ return this.fetch(`/admin/realms/${realm}/roles`, {
84
+ method: 'POST',
85
+ body: JSON.stringify(role),
86
+ });
87
+ }
88
+ async updateRole(roleName, role) {
89
+ const realm = this.getRealm();
90
+ return this.fetch(`/admin/realms/${realm}/roles/${encodeURIComponent(roleName)}`, {
91
+ method: 'PUT',
92
+ body: JSON.stringify(role),
93
+ });
94
+ }
95
+ async deleteRole(roleName) {
96
+ const realm = this.getRealm();
97
+ return this.fetch(`/admin/realms/${realm}/roles/${encodeURIComponent(roleName)}`, {
98
+ method: 'DELETE',
99
+ });
100
+ }
101
+ // ==========================================================================
102
+ // Client Roles
103
+ // ==========================================================================
104
+ /**
105
+ * Get the client UUID from the client_id (resource) in the config
106
+ */
107
+ async getClientUUID(clientId) {
108
+ if (!clientId) {
109
+ const config = IAMService.getConfig();
110
+ clientId = (config === null || config === void 0 ? void 0 : config.resource) || (config === null || config === void 0 ? void 0 : config.clientId);
111
+ }
112
+ if (!clientId) {
113
+ throw new Error('No client ID available');
114
+ }
115
+ const realm = this.getRealm();
116
+ const clients = await this.fetch(`/admin/realms/${realm}/clients?clientId=${encodeURIComponent(clientId)}`);
117
+ if (!clients || clients.length === 0) {
118
+ throw new Error(`Client not found: ${clientId}`);
119
+ }
120
+ return clients[0].id;
121
+ }
122
+ async getClientRoles(clientId) {
123
+ const realm = this.getRealm();
124
+ const clientUUID = await this.getClientUUID(clientId);
125
+ return this.fetch(`/admin/realms/${realm}/clients/${clientUUID}/roles`);
126
+ }
127
+ async getClientRole(roleName, clientId) {
128
+ const realm = this.getRealm();
129
+ const clientUUID = await this.getClientUUID(clientId);
130
+ return this.fetch(`/admin/realms/${realm}/clients/${clientUUID}/roles/${encodeURIComponent(roleName)}`);
131
+ }
132
+ async createClientRole(role, clientId) {
133
+ const realm = this.getRealm();
134
+ const clientUUID = await this.getClientUUID(clientId);
135
+ return this.fetch(`/admin/realms/${realm}/clients/${clientUUID}/roles`, {
136
+ method: 'POST',
137
+ body: JSON.stringify(role),
138
+ });
139
+ }
140
+ async updateClientRole(roleName, role, clientId) {
141
+ const realm = this.getRealm();
142
+ const clientUUID = await this.getClientUUID(clientId);
143
+ return this.fetch(`/admin/realms/${realm}/clients/${clientUUID}/roles/${encodeURIComponent(roleName)}`, {
144
+ method: 'PUT',
145
+ body: JSON.stringify(role),
146
+ });
147
+ }
148
+ async deleteClientRole(roleName, clientId) {
149
+ const realm = this.getRealm();
150
+ const clientUUID = await this.getClientUUID(clientId);
151
+ return this.fetch(`/admin/realms/${realm}/clients/${clientUUID}/roles/${encodeURIComponent(roleName)}`, {
152
+ method: 'DELETE',
153
+ });
154
+ }
155
+ // ==========================================================================
156
+ // Users
157
+ // ==========================================================================
158
+ async getUsers(params = {}) {
159
+ const realm = this.getRealm();
160
+ const query = new URLSearchParams();
161
+ if (params.first !== undefined)
162
+ query.set('first', String(params.first));
163
+ if (params.max !== undefined)
164
+ query.set('max', String(params.max));
165
+ if (params.search)
166
+ query.set('search', params.search);
167
+ const qs = query.toString();
168
+ return this.fetch(`/admin/realms/${realm}/users${qs ? `?${qs}` : ''}`);
169
+ }
170
+ async getUser(userId) {
171
+ const realm = this.getRealm();
172
+ return this.fetch(`/admin/realms/${realm}/users/${userId}`);
173
+ }
174
+ async createUser(user) {
175
+ const realm = this.getRealm();
176
+ return this.fetch(`/admin/realms/${realm}/users`, {
177
+ method: 'POST',
178
+ body: JSON.stringify(user),
179
+ });
180
+ }
181
+ async updateUser(userId, user) {
182
+ const realm = this.getRealm();
183
+ return this.fetch(`/admin/realms/${realm}/users/${userId}`, {
184
+ method: 'PUT',
185
+ body: JSON.stringify(user),
186
+ });
187
+ }
188
+ async deleteUser(userId) {
189
+ const realm = this.getRealm();
190
+ return this.fetch(`/admin/realms/${realm}/users/${userId}`, {
191
+ method: 'DELETE',
192
+ });
193
+ }
194
+ async setUserEnabled(userId, enabled) {
195
+ const realm = this.getRealm();
196
+ return this.fetch(`/admin/realms/${realm}/users/${userId}`, {
197
+ method: 'PUT',
198
+ body: JSON.stringify({ enabled }),
199
+ });
200
+ }
201
+ /**
202
+ * Get a Tide link URL for a user to link their Tide account
203
+ * @param {string} userId - The user ID
204
+ * @param {string} redirectUri - The redirect URI after linking
205
+ * @param {number} [lifespan=43200] - Link lifespan in seconds (default: 12 hours)
206
+ * @returns {Promise<string>} The Tide link URL
207
+ */
208
+ async getTideLinkUrl(userId, redirectUri, lifespan = 43200) {
209
+ const token = await IAMService.getToken();
210
+ const baseURL = IAMService.getBaseUrl();
211
+ const realm = this.getRealm();
212
+ const config = IAMService.getConfig();
213
+ const clientId = (config === null || config === void 0 ? void 0 : config.resource) || (config === null || config === void 0 ? void 0 : config.clientId);
214
+ const params = new URLSearchParams({
215
+ userId,
216
+ lifespan: String(lifespan),
217
+ redirect_uri: redirectUri,
218
+ client_id: clientId,
219
+ });
220
+ const url = `${baseURL}/admin/realms/${realm}/tideAdminResources/get-required-action-link?${params.toString()}`;
221
+ const response = await fetch(url, {
222
+ method: 'POST',
223
+ headers: {
224
+ 'Content-Type': 'application/json',
225
+ 'Authorization': `Bearer ${token}`,
226
+ },
227
+ body: JSON.stringify(['link-tide-account-action']),
228
+ });
229
+ if (!response.ok) {
230
+ const errorText = await response.text().catch(() => '');
231
+ throw new Error(`API error ${response.status}: ${errorText || response.statusText}`);
232
+ }
233
+ // Returns the URL as plain text, not JSON
234
+ return response.text();
235
+ }
236
+ // ==========================================================================
237
+ // User Roles
238
+ // ==========================================================================
239
+ async getUserRoles(userId) {
240
+ const realm = this.getRealm();
241
+ return this.fetch(`/admin/realms/${realm}/users/${userId}/role-mappings/realm`);
242
+ }
243
+ async addUserRoles(userId, roles) {
244
+ const realm = this.getRealm();
245
+ return this.fetch(`/admin/realms/${realm}/users/${userId}/role-mappings/realm`, {
246
+ method: 'POST',
247
+ body: JSON.stringify(roles),
248
+ });
249
+ }
250
+ async removeUserRoles(userId, roles) {
251
+ const realm = this.getRealm();
252
+ return this.fetch(`/admin/realms/${realm}/users/${userId}/role-mappings/realm`, {
253
+ method: 'DELETE',
254
+ body: JSON.stringify(roles),
255
+ });
256
+ }
257
+ // ==========================================================================
258
+ // Policy Templates (Tide Admin) - Read only, templates managed elsewhere
259
+ // ==========================================================================
260
+ async getTemplates() {
261
+ const realm = this.getRealm();
262
+ try {
263
+ return await this.fetch(`/admin/realms/${realm}/tide-admin/policy-templates`);
264
+ }
265
+ catch {
266
+ return [];
267
+ }
268
+ }
269
+ // ==========================================================================
270
+ // Change Sets / Approvals (Tide Admin)
271
+ // ==========================================================================
272
+ /**
273
+ * Get pending user change requests
274
+ * @returns {Promise<Array>} Array of user change request objects
275
+ */
276
+ async getUserChangeRequests() {
277
+ const realm = this.getRealm();
278
+ try {
279
+ const data = await this.fetch(`/admin/realms/${realm}/tide-admin/change-set/users/requests`);
280
+ return (data || []).map(d => ({
281
+ ...d,
282
+ changeSetId: d.draftRecordId,
283
+ changeSetType: d.changeSetType,
284
+ actionType: d.actionType,
285
+ }));
286
+ }
287
+ catch {
288
+ return [];
289
+ }
290
+ }
291
+ /**
292
+ * Get pending role change requests
293
+ * @returns {Promise<Array>} Array of role change request objects
294
+ */
295
+ async getRoleChangeRequests() {
296
+ const realm = this.getRealm();
297
+ try {
298
+ const data = await this.fetch(`/admin/realms/${realm}/tide-admin/change-set/roles/requests`);
299
+ return (data || []).map(d => ({
300
+ ...d,
301
+ changeSetId: d.draftRecordId,
302
+ changeSetType: d.changeSetType,
303
+ actionType: d.actionType,
304
+ }));
305
+ }
306
+ catch {
307
+ return [];
308
+ }
309
+ }
310
+ /**
311
+ * Get all pending change sets (users + roles)
312
+ * @deprecated Use getUserChangeRequests() and getRoleChangeRequests() separately
313
+ */
314
+ async getPendingChangeSets() {
315
+ const [users, roles] = await Promise.all([
316
+ this.getUserChangeRequests(),
317
+ this.getRoleChangeRequests(),
318
+ ]);
319
+ return [...users, ...roles];
320
+ }
321
+ /**
322
+ * Add approval to a change request
323
+ * @param {Object} changeSet - Change set object with changeSetId, actionType, changeSetType
324
+ */
325
+ async approveChangeSet(changeSet) {
326
+ const realm = this.getRealm();
327
+ const formData = new FormData();
328
+ formData.append('changeSetId', changeSet.changeSetId);
329
+ formData.append('actionType', changeSet.actionType);
330
+ formData.append('changeSetType', changeSet.changeSetType);
331
+ return this.fetchWithFormData(`/admin/realms/${realm}/tideAdminResources/add-review`, formData);
332
+ }
333
+ /**
334
+ * Add rejection to a change request
335
+ * @param {Object} changeSet - Change set object with changeSetId, actionType, changeSetType
336
+ */
337
+ async rejectChangeSet(changeSet) {
338
+ const realm = this.getRealm();
339
+ const formData = new FormData();
340
+ formData.append('changeSetId', changeSet.changeSetId);
341
+ formData.append('actionType', changeSet.actionType);
342
+ formData.append('changeSetType', changeSet.changeSetType);
343
+ return this.fetchWithFormData(`/admin/realms/${realm}/tideAdminResources/add-rejection`, formData);
344
+ }
345
+ /**
346
+ * Commit a change request
347
+ * @param {Object} changeSet - Change set object with changeSetId, actionType, changeSetType
348
+ */
349
+ async commitChangeSet(changeSet) {
350
+ const realm = this.getRealm();
351
+ return this.fetch(`/admin/realms/${realm}/tide-admin/change-set/commit`, {
352
+ method: 'POST',
353
+ body: JSON.stringify({
354
+ changeSetId: changeSet.changeSetId,
355
+ actionType: changeSet.actionType,
356
+ changeSetType: changeSet.changeSetType,
357
+ }),
358
+ });
359
+ }
360
+ /**
361
+ * Cancel a change request
362
+ * @param {Object} changeSet - Change set object with changeSetId, actionType, changeSetType
363
+ */
364
+ async cancelChangeSet(changeSet) {
365
+ const realm = this.getRealm();
366
+ return this.fetch(`/admin/realms/${realm}/tide-admin/change-set/cancel`, {
367
+ method: 'POST',
368
+ body: JSON.stringify({
369
+ changeSetId: changeSet.changeSetId,
370
+ actionType: changeSet.actionType,
371
+ changeSetType: changeSet.changeSetType,
372
+ }),
373
+ });
374
+ }
375
+ /**
376
+ * Get raw change set requests for signing
377
+ * @param {Object} changeSet - Change set object with changeSetId, actionType, changeSetType
378
+ * @returns {Promise<Array>} Array of raw change set responses for signing
379
+ */
380
+ async getRawChangeSetRequest(changeSet) {
381
+ const realm = this.getRealm();
382
+ return this.fetch(`/admin/realms/${realm}/tide-admin/change-set/sign/batch`, {
383
+ method: 'POST',
384
+ body: JSON.stringify({ changeSets: [changeSet] }),
385
+ });
386
+ }
387
+ /**
388
+ * Add approval with a signed request
389
+ * @param {Object} changeSet - Change set object with changeSetId, actionType, changeSetType
390
+ * @param {string} signedRequest - The signed request string
391
+ */
392
+ async approveChangeSetWithSignature(changeSet, signedRequest) {
393
+ const realm = this.getRealm();
394
+ const formData = new FormData();
395
+ formData.append('changeSetId', changeSet.changeSetId);
396
+ formData.append('actionType', changeSet.actionType);
397
+ formData.append('changeSetType', changeSet.changeSetType);
398
+ formData.append('requests', signedRequest);
399
+ return this.fetchWithFormData(`/admin/realms/${realm}/tideAdminResources/add-review`, formData);
400
+ }
401
+ // ==========================================================================
402
+ // Logs
403
+ // ==========================================================================
404
+ async getAccessLogs(params = {}) {
405
+ const realm = this.getRealm();
406
+ const query = new URLSearchParams();
407
+ if (params.first !== undefined)
408
+ query.set('first', String(params.first));
409
+ if (params.max !== undefined)
410
+ query.set('max', String(params.max));
411
+ const qs = query.toString();
412
+ return this.fetch(`/admin/realms/${realm}/events${qs ? `?${qs}` : ''}`);
413
+ }
414
+ }
415
+ // Export singleton instance
416
+ const adminAPI = new AdminAPI();
417
+ export default adminAPI;
418
+ export { AdminAPI };
419
+ //# sourceMappingURL=AdminAPI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAPI.js","sourceRoot":"","sources":["../../../src/AdminAPI.js"],"names":[],"mappings":"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"}