user-group-relation.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { ErrorV3 } from '@growi/core/dist/models';
  2. import express from 'express';
  3. import { SCOPE } from '~/interfaces/scope';
  4. import { accessTokenParser } from '~/server/middlewares/access-token-parser';
  5. import { serializeUserGroupRelationSecurely } from '~/server/models/serializers';
  6. import UserGroupRelation from '~/server/models/user-group-relation';
  7. import loggerFactory from '~/utils/logger';
  8. const logger = loggerFactory('growi:routes:apiv3:user-group-relation'); // eslint-disable-line no-unused-vars
  9. const { query } = require('express-validator');
  10. const router = express.Router();
  11. const validator = {};
  12. /** @param {import('~/server/crowi').default} crowi Crowi instance */
  13. module.exports = (crowi) => {
  14. const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
  15. const adminRequired = require('../../middlewares/admin-required')(crowi);
  16. validator.list = [
  17. query('groupIds', 'groupIds is required and must be an array').isArray(),
  18. query('childGroupIds', 'childGroupIds must be an array').optional().isArray(),
  19. ];
  20. /**
  21. * @swagger
  22. * paths:
  23. * /user-group-relations:
  24. * get:
  25. * tags: [UserGroupRelations]
  26. * operationId: listUserGroupRelations
  27. * summary: /user-group-relations
  28. * description: Gets the user group relations
  29. * responses:
  30. * 200:
  31. * description: user group relations are fetched
  32. * content:
  33. * application/json:
  34. * schema:
  35. * properties:
  36. * userGroupRelations:
  37. * type: object
  38. * description: contains arrays user objects related
  39. */
  40. router.get('/', accessTokenParser([SCOPE.READ.ADMIN.USER_GROUP_MANAGEMENT]), loginRequiredStrictly, adminRequired, validator.list, async(req, res) => {
  41. const { query } = req;
  42. try {
  43. const relations = await UserGroupRelation.find({ relatedGroup: { $in: query.groupIds } }).populate('relatedUser');
  44. let relationsOfChildGroups = null;
  45. if (Array.isArray(query.childGroupIds)) {
  46. const _relationsOfChildGroups = await UserGroupRelation.find({ relatedGroup: { $in: query.childGroupIds } }).populate('relatedUser');
  47. relationsOfChildGroups = _relationsOfChildGroups.map(relation => serializeUserGroupRelationSecurely(relation)); // serialize
  48. }
  49. const serialized = relations.map(relation => serializeUserGroupRelationSecurely(relation));
  50. return res.apiv3({ userGroupRelations: serialized, relationsOfChildGroups });
  51. }
  52. catch (err) {
  53. const msg = 'Error occurred in fetching user group relations';
  54. logger.error('Error', err);
  55. return res.apiv3Err(new ErrorV3(msg, 'user-group-relation-list-fetch-failed'));
  56. }
  57. });
  58. return router;
  59. };