users.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. const loggerFactory = require('@alias/logger');
  2. const logger = loggerFactory('growi:routes:apiv3:user-group'); // eslint-disable-line no-unused-vars
  3. const express = require('express');
  4. const router = express.Router();
  5. const { body } = require('express-validator/check');
  6. const { isEmail } = require('validator');
  7. const validator = {};
  8. module.exports = (crowi) => {
  9. const {
  10. ErrorV3,
  11. User,
  12. Page,
  13. ExternalAccount,
  14. } = crowi.models;
  15. const { ApiV3FormValidator } = crowi.middlewares;
  16. const {
  17. loginRequired,
  18. adminRequired,
  19. csrfVerify: csrf,
  20. } = require('../../util/middlewares')(crowi);
  21. validator.inviteEmail = [
  22. // isEmail prevents line breaks, so use isString
  23. body('shapedEmailList').custom((value) => {
  24. const array = value.filter((value) => { return isEmail(value) });
  25. if (array.length === 0) {
  26. throw new Error('At least one valid email address is required');
  27. }
  28. return array;
  29. }),
  30. ];
  31. /**
  32. * @swagger
  33. *
  34. * paths:
  35. * /_api/v3/users/invite:
  36. * post:
  37. * tags: [Users]
  38. * description: Create new users and send Emails
  39. * produces:
  40. * - application/json
  41. * parameters:
  42. * - name: shapedEmailList
  43. * in: query
  44. * description: Invitation emailList
  45. * schema:
  46. * type: array
  47. * - name: sendEmail
  48. * in: query
  49. * description: Whether to send mail
  50. * schema:
  51. * type: boolean
  52. * responses:
  53. * 200:
  54. * description: Inviting user success
  55. * content:
  56. * application/json:
  57. * schema:
  58. * properties:
  59. * createdUserList:
  60. * type: array
  61. * email:
  62. * type: string
  63. * password:
  64. * type: string
  65. * description: Users successfully created
  66. * existingEmailList:
  67. * type: array
  68. * email:
  69. * type: string
  70. * description: Users email that already exists
  71. */
  72. router.post('/invite', loginRequired(), adminRequired, csrf, validator.inviteEmail, ApiV3FormValidator, async(req, res) => {
  73. try {
  74. const emailList = await User.createUsersByInvitation(req.body.shapedEmailList, req.body.sendEmail);
  75. return res.apiv3({ emailList });
  76. }
  77. catch (err) {
  78. return res.apiv3Err(new ErrorV3(err));
  79. }
  80. });
  81. router.delete('/:id/remove', loginRequired(), adminRequired, csrf, async(req, res) => {
  82. const { id } = req.params;
  83. try {
  84. const userData = await User.findById(id);
  85. await userData.statusDelete();
  86. await ExternalAccount.remove({ user: userData });
  87. await Page.removeByPath(`/user/${userData.username}`);
  88. return res.apiv3({ userData });
  89. }
  90. catch (err) {
  91. return res.apiv3Err(new ErrorV3(err));
  92. }
  93. });
  94. return router;
  95. };