@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.
@@ -102,6 +102,46 @@ class AdminUser {
102
102
  const self = this;
103
103
  self.parent = options.parent;
104
104
  self.client = self.parent.dispatch.getClient();
105
+ self._orgId = null;
106
+ }
107
+
108
+ /**
109
+ * @description Set the organization ID for org-scoped API calls
110
+ * @param {string} orgId - Organization ID
111
+ * @return {AdminUser} this instance for chaining
112
+ * @public
113
+ */
114
+ setOrgId(orgId) {
115
+ this._orgId = orgId;
116
+ return this;
117
+ }
118
+
119
+ /**
120
+ * @description Get the base path for user admin API calls.
121
+ * When orgId is set, uses org-scoped endpoints.
122
+ * When orgId is not set, falls back to legacy admin endpoints.
123
+ * @return {string} base path
124
+ * @private
125
+ */
126
+ _basePath() {
127
+ if (this._orgId) {
128
+ return `/api/organizations/${this._orgId}/adminusers`;
129
+ }
130
+ return '/admin/users';
131
+ }
132
+
133
+ /**
134
+ * @description Get the base path for org-specific operations (groups, orgchart).
135
+ * When orgId is set, uses org-scoped endpoints.
136
+ * @param {string} orgId - Organization ID for the operation
137
+ * @return {string} base path
138
+ * @private
139
+ */
140
+ _orgPath(orgId) {
141
+ if (this._orgId) {
142
+ return `/api/organizations/${orgId}/adminusers`;
143
+ }
144
+ return `/admin/organizations/${orgId}`;
105
145
  }
106
146
 
107
147
  /**
@@ -158,7 +198,7 @@ class AdminUser {
158
198
  Joi.assert(userId, Joi.string().required());
159
199
  Joi.assert(session, Joi.string().required());
160
200
 
161
- const apiCall = self.client.get(`/admin/users/${userId}`, self._setHeader(session));
201
+ const apiCall = self.client.get(`${self._basePath()}/${userId}`, self._setHeader(session));
162
202
  return self._returnData(await apiCall);
163
203
  } catch (ex) {
164
204
  throw ex;
@@ -229,7 +269,7 @@ class AdminUser {
229
269
  Joi.assert(session, Joi.string().required());
230
270
 
231
271
  const { userId, ...payload } = params;
232
- const apiCall = self.client.put(`/admin/users/${userId}/password`, payload, self._setHeader(session));
272
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/password`, payload, self._setHeader(session));
233
273
  return self._returnData(await apiCall);
234
274
  } catch (ex) {
235
275
  throw ex;
@@ -259,7 +299,7 @@ class AdminUser {
259
299
  Joi.assert(session, Joi.string().required());
260
300
 
261
301
  const payload = { email };
262
- const apiCall = self.client.post(`/admin/users/email/exist`, payload, self._setHeader(session));
302
+ const apiCall = self.client.post(`${self._basePath()}/email/exist`, payload, self._setHeader(session));
263
303
  return self._returnData(await apiCall);
264
304
  } catch (ex) {
265
305
  throw ex;
@@ -291,7 +331,84 @@ class AdminUser {
291
331
  Joi.assert(payload, Joi.object().required(), 'Payload to update');
292
332
  Joi.assert(session, Joi.string().required(), 'Session user admin');
293
333
 
294
- const apiCall = self.client.put(`/admin/users/${userId}`, payload, self._setHeader(session));
334
+ const apiCall = self.client.put(`${self._basePath()}/${userId}`, payload, self._setHeader(session));
335
+ return self._returnData(await apiCall);
336
+ } catch (ex) {
337
+ throw ex;
338
+ }
339
+ }
340
+
341
+ /**
342
+ * @author Myndware <augusto.pissarra@myndware.com>
343
+ * @description Create a new user
344
+ * @param {object} payload User data to create
345
+ * @param {string} payload.name Full name (required)
346
+ * @param {string} payload.username Username (required)
347
+ * @param {string} payload.email Email (required)
348
+ * @param {string} payload.orgId Primary organization ID (required)
349
+ * @param {array} [payload.orgIds] Organization IDs
350
+ * @param {array} [payload.role=[2]] Security roles
351
+ * @param {string} [payload.password] Initial password
352
+ * @param {string} session JWT session token
353
+ * @return {Promise<object>} Created user document
354
+ * @public
355
+ * @async
356
+ * @example
357
+ *
358
+ * const API = require('@docbrasil/api-systemmanager');
359
+ * const api = new API();
360
+ * const payload = {
361
+ * name: 'Maria Silva',
362
+ * username: 'maria.silva',
363
+ * email: 'maria@example.com',
364
+ * orgId: '5edd11c46b6ce9729c2c297c',
365
+ * role: [2]
366
+ * };
367
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
368
+ * await api.admin.user.create(payload, session);
369
+ */
370
+ async create(payload, session) {
371
+ const self = this;
372
+
373
+ try {
374
+ Joi.assert(payload, Joi.object().required(), 'User data to create');
375
+ Joi.assert(payload.name, Joi.string().required(), 'Full name');
376
+ Joi.assert(payload.username, Joi.string().required(), 'Username');
377
+ Joi.assert(payload.email, Joi.string().email().required(), 'Email');
378
+ Joi.assert(payload.orgId, Joi.string().required(), 'Primary organization ID');
379
+ Joi.assert(session, Joi.string().required(), 'Session token');
380
+
381
+ const apiCall = self.client.put(self._basePath(), payload, self._setHeader(session));
382
+ return self._returnData(await apiCall);
383
+ } catch (ex) {
384
+ throw ex;
385
+ }
386
+ }
387
+
388
+ /**
389
+ * @author Myndware <augusto.pissarra@myndware.com>
390
+ * @description Remove a user
391
+ * @param {string} userId User ID to remove (required)
392
+ * @param {string} session JWT session token
393
+ * @return {Promise<object>} Removal confirmation
394
+ * @public
395
+ * @async
396
+ * @example
397
+ *
398
+ * const API = require('@docbrasil/api-systemmanager');
399
+ * const api = new API();
400
+ * const userId = '55e4a3bd6be6b45210833fae';
401
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
402
+ * await api.admin.user.remove(userId, session);
403
+ */
404
+ async remove(userId, session) {
405
+ const self = this;
406
+
407
+ try {
408
+ Joi.assert(userId, Joi.string().required(), 'User ID');
409
+ Joi.assert(session, Joi.string().required(), 'Session token');
410
+
411
+ const apiCall = self.client.delete(`${self._basePath()}/${userId}`, self._setHeader(session));
295
412
  return self._returnData(await apiCall);
296
413
  } catch (ex) {
297
414
  throw ex;
@@ -319,7 +436,7 @@ class AdminUser {
319
436
  Joi.assert(session, Joi.string().required(), 'Session user admin');
320
437
 
321
438
  const payload = { email };
322
- const apiCall = self.client.post('/admin/users/change/password', payload, self._setHeader(session));
439
+ const apiCall = self.client.post(`${self._basePath()}/change/password`, payload, self._setHeader(session));
323
440
 
324
441
  return self._returnData(await apiCall);
325
442
  } catch (ex) {
@@ -352,7 +469,7 @@ class AdminUser {
352
469
  Joi.assert(payload.newPassword, Joi.string().required(), 'New password');
353
470
  Joi.assert(session, Joi.string().required(), 'Session user admin');
354
471
 
355
- const apiCall = self.client.put('/admin/users/change/password', payload, self._setHeader(session));
472
+ const apiCall = self.client.put(`${self._basePath()}/change/password`, payload, self._setHeader(session));
356
473
 
357
474
  return self._returnData(await apiCall);
358
475
  } catch (ex) {
@@ -400,13 +517,14 @@ class AdminUser {
400
517
  page = 1,
401
518
  perPage = 200,
402
519
  project = PROJECTION_DEFAULT,
403
- sort = SORT_DEFAULT
520
+ sort = SORT_DEFAULT,
521
+ filter = {}
404
522
  } = params;
405
523
 
406
- const payloadToSend = {$project: project, sort};
524
+ const payloadToSend = {$project: project, sort, ...filter};
407
525
 
408
- const apiCall = self._client
409
- .post(`/admin/users?page=${page}&perPage=${perPage}`, payloadToSend, self._setHeader(session));
526
+ const apiCall = self.client
527
+ .post(`${self._basePath()}?page=${page}&perPage=${perPage}`, payloadToSend, self._setHeader(session));
410
528
 
411
529
  return self._returnData(await apiCall);
412
530
 
@@ -414,6 +532,291 @@ class AdminUser {
414
532
  throw ex;
415
533
  }
416
534
  }
535
+
536
+ /**
537
+ * @author Myndware <augusto.pissarra@myndware.com>
538
+ * @description Block a user (prevent login)
539
+ * @param {string} userId User ID to block (required)
540
+ * @param {string} session JWT session token
541
+ * @return {Promise<object>} Updated user
542
+ * @public
543
+ * @async
544
+ * @example
545
+ *
546
+ * const API = require('@docbrasil/api-systemmanager');
547
+ * const api = new API();
548
+ * const userId = '55e4a3bd6be6b45210833fae';
549
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
550
+ * await api.admin.user.block(userId, session);
551
+ */
552
+ async block(userId, session) {
553
+ const self = this;
554
+
555
+ try {
556
+ Joi.assert(userId, Joi.string().required(), 'User ID');
557
+ Joi.assert(session, Joi.string().required(), 'Session token');
558
+
559
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/block`, {}, self._setHeader(session));
560
+ return self._returnData(await apiCall);
561
+ } catch (ex) {
562
+ throw ex;
563
+ }
564
+ }
565
+
566
+ /**
567
+ * @author Myndware <augusto.pissarra@myndware.com>
568
+ * @description Unblock a user (allow login)
569
+ * @param {string} userId User ID to unblock (required)
570
+ * @param {string} session JWT session token
571
+ * @return {Promise<object>} Updated user
572
+ * @public
573
+ * @async
574
+ * @example
575
+ *
576
+ * const API = require('@docbrasil/api-systemmanager');
577
+ * const api = new API();
578
+ * const userId = '55e4a3bd6be6b45210833fae';
579
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
580
+ * await api.admin.user.unblock(userId, session);
581
+ */
582
+ async unblock(userId, session) {
583
+ const self = this;
584
+
585
+ try {
586
+ Joi.assert(userId, Joi.string().required(), 'User ID');
587
+ Joi.assert(session, Joi.string().required(), 'Session token');
588
+
589
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/unblock`, {}, self._setHeader(session));
590
+ return self._returnData(await apiCall);
591
+ } catch (ex) {
592
+ throw ex;
593
+ }
594
+ }
595
+
596
+ /**
597
+ * @author Myndware <augusto.pissarra@myndware.com>
598
+ * @description Block email notifications for a user
599
+ * @param {string} userId User ID (required)
600
+ * @param {string} session JWT session token
601
+ * @return {Promise<object>} Updated user
602
+ * @public
603
+ * @async
604
+ */
605
+ async blockEmail(userId, session) {
606
+ const self = this;
607
+
608
+ try {
609
+ Joi.assert(userId, Joi.string().required(), 'User ID');
610
+ Joi.assert(session, Joi.string().required(), 'Session token');
611
+
612
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/blockemail`, {}, self._setHeader(session));
613
+ return self._returnData(await apiCall);
614
+ } catch (ex) {
615
+ throw ex;
616
+ }
617
+ }
618
+
619
+ /**
620
+ * @author Myndware <augusto.pissarra@myndware.com>
621
+ * @description Unblock email notifications for a user
622
+ * @param {string} userId User ID (required)
623
+ * @param {string} session JWT session token
624
+ * @return {Promise<object>} Updated user
625
+ * @public
626
+ * @async
627
+ */
628
+ async unblockEmail(userId, session) {
629
+ const self = this;
630
+
631
+ try {
632
+ Joi.assert(userId, Joi.string().required(), 'User ID');
633
+ Joi.assert(session, Joi.string().required(), 'Session token');
634
+
635
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/unblockemail`, {}, self._setHeader(session));
636
+ return self._returnData(await apiCall);
637
+ } catch (ex) {
638
+ throw ex;
639
+ }
640
+ }
641
+
642
+ /**
643
+ * @author Myndware <augusto.pissarra@myndware.com>
644
+ * @description Update user type classification
645
+ * @param {object} params Parameters
646
+ * @param {string} params.userId User ID (required)
647
+ * @param {string} params.userType New user type (required)
648
+ * @param {string} session JWT session token
649
+ * @return {Promise<object>} Updated user
650
+ * @public
651
+ * @async
652
+ * @example
653
+ *
654
+ * const API = require('@docbrasil/api-systemmanager');
655
+ * const api = new API();
656
+ * const params = { userId: '55e4a3bd6be6b45210833fae', userType: 'USER' };
657
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
658
+ * await api.admin.user.updateUserType(params, session);
659
+ */
660
+ async updateUserType(params, session) {
661
+ const self = this;
662
+
663
+ try {
664
+ Joi.assert(params, Joi.object().required(), 'Parameters');
665
+ Joi.assert(params.userId, Joi.string().required(), 'User ID');
666
+ Joi.assert(params.userType, Joi.string().required(), 'User type');
667
+ Joi.assert(session, Joi.string().required(), 'Session token');
668
+
669
+ const { userId, userType } = params;
670
+ const apiCall = self.client.put(`${self._basePath()}/${userId}/type/${userType}`, {}, self._setHeader(session));
671
+ return self._returnData(await apiCall);
672
+ } catch (ex) {
673
+ throw ex;
674
+ }
675
+ }
676
+
677
+ /**
678
+ * @author Myndware <augusto.pissarra@myndware.com>
679
+ * @description Get organization groups with their permissions
680
+ * @param {string} orgId Organization ID (required)
681
+ * @param {string} session JWT session token
682
+ * @return {Promise<array>} Array of groups with permissions
683
+ * @public
684
+ * @async
685
+ * @example
686
+ *
687
+ * const API = require('@docbrasil/api-systemmanager');
688
+ * const api = new API();
689
+ * const orgId = '5edd11c46b6ce9729c2c297c';
690
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
691
+ * const groups = await api.admin.user.getGroupsPermissions(orgId, session);
692
+ */
693
+ async getGroupsPermissions(orgId, session) {
694
+ const self = this;
695
+
696
+ try {
697
+ Joi.assert(orgId, Joi.string().required(), 'Organization ID');
698
+ Joi.assert(session, Joi.string().required(), 'Session token');
699
+
700
+ const apiCall = self.client.get(
701
+ `${self._orgPath(orgId)}/groups/permissions`,
702
+ self._setHeader(session)
703
+ );
704
+ return self._returnData(await apiCall);
705
+ } catch (ex) {
706
+ throw ex;
707
+ }
708
+ }
709
+
710
+ /**
711
+ * @author Myndware <augusto.pissarra@myndware.com>
712
+ * @description Update user's group memberships in an organization
713
+ * @param {object} params Parameters
714
+ * @param {string} params.orgId Organization ID (required)
715
+ * @param {string} params.userId User ID (required)
716
+ * @param {array} params.groups Array of group IDs (required)
717
+ * @param {string} session JWT session token
718
+ * @return {Promise<object>} Updated groups
719
+ * @public
720
+ * @async
721
+ * @example
722
+ *
723
+ * const API = require('@docbrasil/api-systemmanager');
724
+ * const api = new API();
725
+ * const params = {
726
+ * orgId: '5edd11c46b6ce9729c2c297c',
727
+ * userId: '55e4a3bd6be6b45210833fae',
728
+ * groups: ['groupId1', 'groupId2']
729
+ * };
730
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
731
+ * await api.admin.user.updateUserGroups(params, session);
732
+ */
733
+ async updateUserGroups(params, session) {
734
+ const self = this;
735
+
736
+ try {
737
+ Joi.assert(params, Joi.object().required(), 'Parameters');
738
+ Joi.assert(params.orgId, Joi.string().required(), 'Organization ID');
739
+ Joi.assert(params.userId, Joi.string().required(), 'User ID');
740
+ Joi.assert(params.groups, Joi.array().required(), 'Group IDs');
741
+ Joi.assert(session, Joi.string().required(), 'Session token');
742
+
743
+ const { orgId, userId, groups } = params;
744
+ const apiCall = self.client.put(
745
+ `${self._orgPath(orgId)}/groups/${userId}`,
746
+ { groups },
747
+ self._setHeader(session)
748
+ );
749
+ return self._returnData(await apiCall);
750
+ } catch (ex) {
751
+ throw ex;
752
+ }
753
+ }
754
+
755
+ /**
756
+ * @author Myndware <augusto.pissarra@myndware.com>
757
+ * @description Get organizations the admin user can manage
758
+ * @param {string} session JWT session token
759
+ * @return {Promise<array>} Array of organizations
760
+ * @public
761
+ * @async
762
+ * @example
763
+ *
764
+ * const API = require('@docbrasil/api-systemmanager');
765
+ * const api = new API();
766
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
767
+ * const orgs = await api.admin.user.getOrganizations(session);
768
+ */
769
+ async getOrganizations(session) {
770
+ const self = this;
771
+
772
+ try {
773
+ Joi.assert(session, Joi.string().required(), 'Session token');
774
+
775
+ const apiCall = self.client.get(`${self._basePath()}/organizations`, self._setHeader(session));
776
+ return self._returnData(await apiCall);
777
+ } catch (ex) {
778
+ throw ex;
779
+ }
780
+ }
781
+
782
+ /**
783
+ * @author Myndware <augusto.pissarra@myndware.com>
784
+ * @description Get users belonging to an organization
785
+ * @param {object} params Parameters
786
+ * @param {string} params.orgId Organization ID (required)
787
+ * @param {array} [params.userIds] Optional array of user IDs to filter
788
+ * @param {string} session JWT session token
789
+ * @return {Promise<array>} Array of users with id, name, email, title
790
+ * @public
791
+ * @async
792
+ * @example
793
+ *
794
+ * const API = require('@docbrasil/api-systemmanager');
795
+ * const api = new API();
796
+ * const params = { orgId: '5edd11c46b6ce9729c2c297c' };
797
+ * const session = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
798
+ * const users = await api.admin.user.getOrgUsers(params, session);
799
+ */
800
+ async getOrgUsers(params, session) {
801
+ const self = this;
802
+
803
+ try {
804
+ Joi.assert(params, Joi.object().required(), 'Parameters');
805
+ Joi.assert(params.orgId, Joi.string().required(), 'Organization ID');
806
+ Joi.assert(session, Joi.string().required(), 'Session token');
807
+
808
+ const { orgId, userIds } = params;
809
+ let url = this._orgId ? `${self._orgPath(orgId)}/orgusers` : `/admin/organizations/${orgId}/orgusers`;
810
+ if (userIds && userIds.length > 0) {
811
+ url += `?userIds=${JSON.stringify(userIds)}`;
812
+ }
813
+
814
+ const apiCall = self.client.get(url, self._setHeader(session));
815
+ return self._returnData(await apiCall);
816
+ } catch (ex) {
817
+ throw ex;
818
+ }
819
+ }
417
820
  }
418
821
 
419
822
  export default AdminUser;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@docbrasil/api-systemmanager",
3
3
  "description": "Module API System Manager",
4
- "version": "1.1.77",
4
+ "version": "1.1.79",
5
5
  "scripts": {
6
6
  "htmldoc": "rm -rf docs && jsdoc api/** -d docs -t ./node_modules/better-docs",
7
7
  "doc": "rm -rf doc && mkdir doc && jsdoc2md api/**/* api/* > doc/api.md",