user-group-relation.js 2.6 KB

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