@docbrasil/api-systemmanager 1.1.77 → 1.1.79

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/api/admin/user.js CHANGED
@@ -15,6 +15,46 @@ class AdminUser {
15
15
  const self = this;
16
16
  self.parent = options.parent;
17
17
  self.client = self.parent.dispatch.getClient();
18
+ self._orgId = null;
19
+ }
20
+
21
+ /**
22
+ * @description Set the organization ID for org-scoped API calls
23
+ * @param {string} orgId - Organization ID
24
+ * @return {AdminUser} this instance for chaining
25
+ * @public
26
+ */
27
+ setOrgId(orgId) {
28
+ this._orgId = orgId;
29
+ return this;
30
+ }
31
+
32
+ /**
33
+ * @description Get the base path for user admin API calls.
34
+ * When orgId is set, uses org-scoped endpoints.
35
+ * When orgId is not set, falls back to legacy admin endpoints.
36
+ * @return {string} base path
37
+ * @private
38
+ */
39
+ _basePath() {
40
+ if (this._orgId) {
41
+ return `/api/organizations/${this._orgId}/adminusers`;
42
+ }
43
+ return '/admin/users';
44
+ }
45
+
46
+ /**
47
+ * @description Get the base path for org-specific operations (groups, orgchart).
48
+ * When orgId is set, uses org-scoped endpoints.
49
+ * @param {string} orgId - Organization ID for the operation
50
+ * @return {string} base path
51
+ * @private
52
+ */
53
+ _orgPath(orgId) {
54
+ if (this._orgId) {
55
+ return `/api/organizations/${orgId}/adminusers`;
56
+ }
57
+ return `/admin/organizations/${orgId}`;
18
58
  }
19
59
 
20
60
  /**
@@ -71,7 +111,7 @@ class AdminUser {
71
111
  Joi.assert(userId, Joi.string().required());
72
112
  Joi.assert(session, Joi.string().required());
73
113
 
74
- const apiCall = self.client.get(`/admin/users/${userId}`, self._setHeader(session));
114
+ const apiCall = self.client.get(`${self._basePath()}/${userId}`, self._setHeader(session));
75
115
  return self._returnData(await apiCall);
76
116
  } catch (ex) {
77
117
  throw ex;
@@ -142,7 +182,7 @@ class AdminUser {
142
182
  Joi.assert(session, Joi.string().required());
143
183
 
144
184
  const { userId, ...payload } = params;
145
- const apiCall = self.client.put(`/admin/users/${userId}/password`, payload, self._setHeader(session));
185
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/password`, payload, self._setHeader(session));
146
186
  return self._returnData(await apiCall);
147
187
  } catch (ex) {
148
188
  throw ex;
@@ -172,7 +212,7 @@ class AdminUser {
172
212
  Joi.assert(session, Joi.string().required());
173
213
 
174
214
  const payload = { email };
175
- const apiCall = self.client.post(`/admin/users/email/exist`, payload, self._setHeader(session));
215
+ const apiCall = self.client.post(`${self._basePath()}/email/exist`, payload, self._setHeader(session));
176
216
  return self._returnData(await apiCall);
177
217
  } catch (ex) {
178
218
  throw ex;
@@ -204,7 +244,84 @@ class AdminUser {
204
244
  Joi.assert(payload, Joi.object().required(), 'Payload to update');
205
245
  Joi.assert(session, Joi.string().required(), 'Session user admin');
206
246
 
207
- const apiCall = self.client.put(`/admin/users/${userId}`, payload, self._setHeader(session));
247
+ const apiCall = self.client.put(`${self._basePath()}/${userId}`, payload, self._setHeader(session));
248
+ return self._returnData(await apiCall);
249
+ } catch (ex) {
250
+ throw ex;
251
+ }
252
+ }
253
+
254
+ /**
255
+ * @author Myndware <augusto.pissarra@myndware.com>
256
+ * @description Create a new user
257
+ * @param {object} payload User data to create
258
+ * @param {string} payload.name Full name (required)
259
+ * @param {string} payload.username Username (required)
260
+ * @param {string} payload.email Email (required)
261
+ * @param {string} payload.orgId Primary organization ID (required)
262
+ * @param {array} [payload.orgIds] Organization IDs
263
+ * @param {array} [payload.role=[2]] Security roles
264
+ * @param {string} [payload.password] Initial password
265
+ * @param {string} session JWT session token
266
+ * @return {Promise<object>} Created user document
267
+ * @public
268
+ * @async
269
+ * @example
270
+ *
271
+ * const API = require('@docbrasil/api-systemmanager');
272
+ * const api = new API();
273
+ * const payload = {
274
+ * name: 'Maria Silva',
275
+ * username: 'maria.silva',
276
+ * email: 'maria@example.com',
277
+ * orgId: '5edd11c46b6ce9729c2c297c',
278
+ * role: [2]
279
+ * };
280
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
281
+ * await api.admin.user.create(payload, session);
282
+ */
283
+ async create(payload, session) {
284
+ const self = this;
285
+
286
+ try {
287
+ Joi.assert(payload, Joi.object().required(), 'User data to create');
288
+ Joi.assert(payload.name, Joi.string().required(), 'Full name');
289
+ Joi.assert(payload.username, Joi.string().required(), 'Username');
290
+ Joi.assert(payload.email, Joi.string().email().required(), 'Email');
291
+ Joi.assert(payload.orgId, Joi.string().required(), 'Primary organization ID');
292
+ Joi.assert(session, Joi.string().required(), 'Session token');
293
+
294
+ const apiCall = self.client.put(self._basePath(), payload, self._setHeader(session));
295
+ return self._returnData(await apiCall);
296
+ } catch (ex) {
297
+ throw ex;
298
+ }
299
+ }
300
+
301
+ /**
302
+ * @author Myndware <augusto.pissarra@myndware.com>
303
+ * @description Remove a user
304
+ * @param {string} userId User ID to remove (required)
305
+ * @param {string} session JWT session token
306
+ * @return {Promise<object>} Removal confirmation
307
+ * @public
308
+ * @async
309
+ * @example
310
+ *
311
+ * const API = require('@docbrasil/api-systemmanager');
312
+ * const api = new API();
313
+ * const userId = '55e4a3bd6be6b45210833fae';
314
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
315
+ * await api.admin.user.remove(userId, session);
316
+ */
317
+ async remove(userId, session) {
318
+ const self = this;
319
+
320
+ try {
321
+ Joi.assert(userId, Joi.string().required(), 'User ID');
322
+ Joi.assert(session, Joi.string().required(), 'Session token');
323
+
324
+ const apiCall = self.client.delete(`${self._basePath()}/${userId}`, self._setHeader(session));
208
325
  return self._returnData(await apiCall);
209
326
  } catch (ex) {
210
327
  throw ex;
@@ -232,7 +349,7 @@ class AdminUser {
232
349
  Joi.assert(session, Joi.string().required(), 'Session user admin');
233
350
 
234
351
  const payload = { email };
235
- const apiCall = self.client.post('/admin/users/change/password', payload, self._setHeader(session));
352
+ const apiCall = self.client.post(`${self._basePath()}/change/password`, payload, self._setHeader(session));
236
353
 
237
354
  return self._returnData(await apiCall);
238
355
  } catch (ex) {
@@ -265,7 +382,7 @@ class AdminUser {
265
382
  Joi.assert(payload.newPassword, Joi.string().required(), 'New password');
266
383
  Joi.assert(session, Joi.string().required(), 'Session user admin');
267
384
 
268
- const apiCall = self.client.put('/admin/users/change/password', payload, self._setHeader(session));
385
+ const apiCall = self.client.put(`${self._basePath()}/change/password`, payload, self._setHeader(session));
269
386
 
270
387
  return self._returnData(await apiCall);
271
388
  } catch (ex) {
@@ -313,13 +430,14 @@ class AdminUser {
313
430
  page = 1,
314
431
  perPage = 200,
315
432
  project = PROJECTION_DEFAULT,
316
- sort = SORT_DEFAULT
433
+ sort = SORT_DEFAULT,
434
+ filter = {}
317
435
  } = params;
318
436
 
319
- const payloadToSend = {$project: project, sort};
437
+ const payloadToSend = {$project: project, sort, ...filter};
320
438
 
321
- const apiCall = self._client
322
- .post(`/admin/users?page=${page}&perPage=${perPage}`, payloadToSend, self._setHeader(session));
439
+ const apiCall = self.client
440
+ .post(`${self._basePath()}?page=${page}&perPage=${perPage}`, payloadToSend, self._setHeader(session));
323
441
 
324
442
  return self._returnData(await apiCall);
325
443
 
@@ -327,6 +445,291 @@ class AdminUser {
327
445
  throw ex;
328
446
  }
329
447
  }
448
+
449
+ /**
450
+ * @author Myndware <augusto.pissarra@myndware.com>
451
+ * @description Block a user (prevent login)
452
+ * @param {string} userId User ID to block (required)
453
+ * @param {string} session JWT session token
454
+ * @return {Promise<object>} Updated user
455
+ * @public
456
+ * @async
457
+ * @example
458
+ *
459
+ * const API = require('@docbrasil/api-systemmanager');
460
+ * const api = new API();
461
+ * const userId = '55e4a3bd6be6b45210833fae';
462
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
463
+ * await api.admin.user.block(userId, session);
464
+ */
465
+ async block(userId, session) {
466
+ const self = this;
467
+
468
+ try {
469
+ Joi.assert(userId, Joi.string().required(), 'User ID');
470
+ Joi.assert(session, Joi.string().required(), 'Session token');
471
+
472
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/block`, {}, self._setHeader(session));
473
+ return self._returnData(await apiCall);
474
+ } catch (ex) {
475
+ throw ex;
476
+ }
477
+ }
478
+
479
+ /**
480
+ * @author Myndware <augusto.pissarra@myndware.com>
481
+ * @description Unblock a user (allow login)
482
+ * @param {string} userId User ID to unblock (required)
483
+ * @param {string} session JWT session token
484
+ * @return {Promise<object>} Updated user
485
+ * @public
486
+ * @async
487
+ * @example
488
+ *
489
+ * const API = require('@docbrasil/api-systemmanager');
490
+ * const api = new API();
491
+ * const userId = '55e4a3bd6be6b45210833fae';
492
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
493
+ * await api.admin.user.unblock(userId, session);
494
+ */
495
+ async unblock(userId, session) {
496
+ const self = this;
497
+
498
+ try {
499
+ Joi.assert(userId, Joi.string().required(), 'User ID');
500
+ Joi.assert(session, Joi.string().required(), 'Session token');
501
+
502
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/unblock`, {}, self._setHeader(session));
503
+ return self._returnData(await apiCall);
504
+ } catch (ex) {
505
+ throw ex;
506
+ }
507
+ }
508
+
509
+ /**
510
+ * @author Myndware <augusto.pissarra@myndware.com>
511
+ * @description Block email notifications for a user
512
+ * @param {string} userId User ID (required)
513
+ * @param {string} session JWT session token
514
+ * @return {Promise<object>} Updated user
515
+ * @public
516
+ * @async
517
+ */
518
+ async blockEmail(userId, session) {
519
+ const self = this;
520
+
521
+ try {
522
+ Joi.assert(userId, Joi.string().required(), 'User ID');
523
+ Joi.assert(session, Joi.string().required(), 'Session token');
524
+
525
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/blockemail`, {}, self._setHeader(session));
526
+ return self._returnData(await apiCall);
527
+ } catch (ex) {
528
+ throw ex;
529
+ }
530
+ }
531
+
532
+ /**
533
+ * @author Myndware <augusto.pissarra@myndware.com>
534
+ * @description Unblock email notifications for a user
535
+ * @param {string} userId User ID (required)
536
+ * @param {string} session JWT session token
537
+ * @return {Promise<object>} Updated user
538
+ * @public
539
+ * @async
540
+ */
541
+ async unblockEmail(userId, session) {
542
+ const self = this;
543
+
544
+ try {
545
+ Joi.assert(userId, Joi.string().required(), 'User ID');
546
+ Joi.assert(session, Joi.string().required(), 'Session token');
547
+
548
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/unblockemail`, {}, self._setHeader(session));
549
+ return self._returnData(await apiCall);
550
+ } catch (ex) {
551
+ throw ex;
552
+ }
553
+ }
554
+
555
+ /**
556
+ * @author Myndware <augusto.pissarra@myndware.com>
557
+ * @description Update user type classification
558
+ * @param {object} params Parameters
559
+ * @param {string} params.userId User ID (required)
560
+ * @param {string} params.userType New user type (required)
561
+ * @param {string} session JWT session token
562
+ * @return {Promise<object>} Updated user
563
+ * @public
564
+ * @async
565
+ * @example
566
+ *
567
+ * const API = require('@docbrasil/api-systemmanager');
568
+ * const api = new API();
569
+ * const params = { userId: '55e4a3bd6be6b45210833fae', userType: 'USER' };
570
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
571
+ * await api.admin.user.updateUserType(params, session);
572
+ */
573
+ async updateUserType(params, session) {
574
+ const self = this;
575
+
576
+ try {
577
+ Joi.assert(params, Joi.object().required(), 'Parameters');
578
+ Joi.assert(params.userId, Joi.string().required(), 'User ID');
579
+ Joi.assert(params.userType, Joi.string().required(), 'User type');
580
+ Joi.assert(session, Joi.string().required(), 'Session token');
581
+
582
+ const { userId, userType } = params;
583
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/type/${userType}`, {}, self._setHeader(session));
584
+ return self._returnData(await apiCall);
585
+ } catch (ex) {
586
+ throw ex;
587
+ }
588
+ }
589
+
590
+ /**
591
+ * @author Myndware <augusto.pissarra@myndware.com>
592
+ * @description Get organization groups with their permissions
593
+ * @param {string} orgId Organization ID (required)
594
+ * @param {string} session JWT session token
595
+ * @return {Promise<array>} Array of groups with permissions
596
+ * @public
597
+ * @async
598
+ * @example
599
+ *
600
+ * const API = require('@docbrasil/api-systemmanager');
601
+ * const api = new API();
602
+ * const orgId = '5edd11c46b6ce9729c2c297c';
603
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
604
+ * const groups = await api.admin.user.getGroupsPermissions(orgId, session);
605
+ */
606
+ async getGroupsPermissions(orgId, session) {
607
+ const self = this;
608
+
609
+ try {
610
+ Joi.assert(orgId, Joi.string().required(), 'Organization ID');
611
+ Joi.assert(session, Joi.string().required(), 'Session token');
612
+
613
+ const apiCall = self.client.get(
614
+ `${self._orgPath(orgId)}/groups/permissions`,
615
+ self._setHeader(session)
616
+ );
617
+ return self._returnData(await apiCall);
618
+ } catch (ex) {
619
+ throw ex;
620
+ }
621
+ }
622
+
623
+ /**
624
+ * @author Myndware <augusto.pissarra@myndware.com>
625
+ * @description Update user's group memberships in an organization
626
+ * @param {object} params Parameters
627
+ * @param {string} params.orgId Organization ID (required)
628
+ * @param {string} params.userId User ID (required)
629
+ * @param {array} params.groups Array of group IDs (required)
630
+ * @param {string} session JWT session token
631
+ * @return {Promise<object>} Updated groups
632
+ * @public
633
+ * @async
634
+ * @example
635
+ *
636
+ * const API = require('@docbrasil/api-systemmanager');
637
+ * const api = new API();
638
+ * const params = {
639
+ * orgId: '5edd11c46b6ce9729c2c297c',
640
+ * userId: '55e4a3bd6be6b45210833fae',
641
+ * groups: ['groupId1', 'groupId2']
642
+ * };
643
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
644
+ * await api.admin.user.updateUserGroups(params, session);
645
+ */
646
+ async updateUserGroups(params, session) {
647
+ const self = this;
648
+
649
+ try {
650
+ Joi.assert(params, Joi.object().required(), 'Parameters');
651
+ Joi.assert(params.orgId, Joi.string().required(), 'Organization ID');
652
+ Joi.assert(params.userId, Joi.string().required(), 'User ID');
653
+ Joi.assert(params.groups, Joi.array().required(), 'Group IDs');
654
+ Joi.assert(session, Joi.string().required(), 'Session token');
655
+
656
+ const { orgId, userId, groups } = params;
657
+ const apiCall = self.client.put(
658
+ `${self._orgPath(orgId)}/groups/${userId}`,
659
+ { groups },
660
+ self._setHeader(session)
661
+ );
662
+ return self._returnData(await apiCall);
663
+ } catch (ex) {
664
+ throw ex;
665
+ }
666
+ }
667
+
668
+ /**
669
+ * @author Myndware <augusto.pissarra@myndware.com>
670
+ * @description Get organizations the admin user can manage
671
+ * @param {string} session JWT session token
672
+ * @return {Promise<array>} Array of organizations
673
+ * @public
674
+ * @async
675
+ * @example
676
+ *
677
+ * const API = require('@docbrasil/api-systemmanager');
678
+ * const api = new API();
679
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
680
+ * const orgs = await api.admin.user.getOrganizations(session);
681
+ */
682
+ async getOrganizations(session) {
683
+ const self = this;
684
+
685
+ try {
686
+ Joi.assert(session, Joi.string().required(), 'Session token');
687
+
688
+ const apiCall = self.client.get(`${self._basePath()}/organizations`, self._setHeader(session));
689
+ return self._returnData(await apiCall);
690
+ } catch (ex) {
691
+ throw ex;
692
+ }
693
+ }
694
+
695
+ /**
696
+ * @author Myndware <augusto.pissarra@myndware.com>
697
+ * @description Get users belonging to an organization
698
+ * @param {object} params Parameters
699
+ * @param {string} params.orgId Organization ID (required)
700
+ * @param {array} [params.userIds] Optional array of user IDs to filter
701
+ * @param {string} session JWT session token
702
+ * @return {Promise<array>} Array of users with id, name, email, title
703
+ * @public
704
+ * @async
705
+ * @example
706
+ *
707
+ * const API = require('@docbrasil/api-systemmanager');
708
+ * const api = new API();
709
+ * const params = { orgId: '5edd11c46b6ce9729c2c297c' };
710
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
711
+ * const users = await api.admin.user.getOrgUsers(params, session);
712
+ */
713
+ async getOrgUsers(params, session) {
714
+ const self = this;
715
+
716
+ try {
717
+ Joi.assert(params, Joi.object().required(), 'Parameters');
718
+ Joi.assert(params.orgId, Joi.string().required(), 'Organization ID');
719
+ Joi.assert(session, Joi.string().required(), 'Session token');
720
+
721
+ const { orgId, userIds } = params;
722
+ let url = this._orgId ? `${self._orgPath(orgId)}/orgusers` : `/admin/organizations/${orgId}/orgusers`;
723
+ if (userIds && userIds.length > 0) {
724
+ url += `?userIds=${JSON.stringify(userIds)}`;
725
+ }
726
+
727
+ const apiCall = self.client.get(url, self._setHeader(session));
728
+ return self._returnData(await apiCall);
729
+ } catch (ex) {
730
+ throw ex;
731
+ }
732
+ }
330
733
  }
331
734
 
332
735
  export default AdminUser;