UserMembershipController.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. const SessionManager = require('../Authentication/SessionManager')
  2. const UserMembershipHandler = require('./UserMembershipHandler')
  3. const Errors = require('../Errors/Errors')
  4. const EmailHelper = require('../Helpers/EmailHelper')
  5. const { csvAttachment } = require('../../infrastructure/Response')
  6. const {
  7. UserIsManagerError,
  8. UserAlreadyAddedError,
  9. UserNotFoundError,
  10. } = require('./UserMembershipErrors')
  11. const { SSOConfig } = require('../../models/SSOConfig')
  12. const CSVParser = require('json2csv').Parser
  13. const { expressify } = require('@overleaf/promise-utils')
  14. async function manageGroupMembers(req, res, next) {
  15. const { entity: subscription, entityConfig } = req
  16. const entityPrimaryKey =
  17. subscription[entityConfig.fields.primaryKey].toString()
  18. let entityName
  19. if (entityConfig.fields.name) {
  20. entityName = subscription[entityConfig.fields.name]
  21. }
  22. const users = await UserMembershipHandler.promises.getUsers(
  23. subscription,
  24. entityConfig
  25. )
  26. const ssoConfig = await SSOConfig.findById(subscription.ssoConfig).exec()
  27. res.render('user_membership/group-members-react', {
  28. name: entityName,
  29. groupId: entityPrimaryKey,
  30. users,
  31. groupSize: subscription.membersLimit,
  32. managedUsersActive: subscription.managedUsersEnabled,
  33. groupSSOActive: ssoConfig?.enabled,
  34. })
  35. }
  36. async function manageGroupManagers(req, res, next) {
  37. await _renderManagersPage(
  38. req,
  39. res,
  40. next,
  41. 'user_membership/group-managers-react'
  42. )
  43. }
  44. async function manageInstitutionManagers(req, res, next) {
  45. await _renderManagersPage(
  46. req,
  47. res,
  48. next,
  49. 'user_membership/institution-managers-react'
  50. )
  51. }
  52. async function managePublisherManagers(req, res, next) {
  53. await _renderManagersPage(
  54. req,
  55. res,
  56. next,
  57. 'user_membership/publisher-managers-react'
  58. )
  59. }
  60. async function _renderManagersPage(req, res, next, template) {
  61. const { entity, entityConfig } = req
  62. const fetchV1Data = new Promise((resolve, reject) => {
  63. entity.fetchV1Data((error, entity) => {
  64. if (error) {
  65. reject(error)
  66. } else {
  67. resolve(entity)
  68. }
  69. })
  70. })
  71. const entityWithV1Data = await fetchV1Data
  72. const entityPrimaryKey =
  73. entityWithV1Data[entityConfig.fields.primaryKey].toString()
  74. let entityName
  75. if (entityConfig.fields.name) {
  76. entityName = entityWithV1Data[entityConfig.fields.name]
  77. }
  78. const users = await UserMembershipHandler.promises.getUsers(
  79. entityWithV1Data,
  80. entityConfig
  81. )
  82. res.render(template, {
  83. name: entityName,
  84. users,
  85. groupId: entityPrimaryKey,
  86. })
  87. }
  88. module.exports = {
  89. manageGroupMembers: expressify(manageGroupMembers),
  90. manageGroupManagers: expressify(manageGroupManagers),
  91. manageInstitutionManagers: expressify(manageInstitutionManagers),
  92. managePublisherManagers: expressify(managePublisherManagers),
  93. add(req, res, next) {
  94. const { entity, entityConfig } = req
  95. const email = EmailHelper.parseEmail(req.body.email)
  96. if (email == null) {
  97. return res.status(400).json({
  98. error: {
  99. code: 'invalid_email',
  100. message: req.i18n.translate('invalid_email'),
  101. },
  102. })
  103. }
  104. if (entityConfig.readOnly) {
  105. return next(new Errors.NotFoundError('Cannot add users to entity'))
  106. }
  107. UserMembershipHandler.addUser(
  108. entity,
  109. entityConfig,
  110. email,
  111. function (error, user) {
  112. if (error && error instanceof UserAlreadyAddedError) {
  113. return res.status(400).json({
  114. error: {
  115. code: 'user_already_added',
  116. message: req.i18n.translate('user_already_added'),
  117. },
  118. })
  119. }
  120. if (error && error instanceof UserNotFoundError) {
  121. return res.status(404).json({
  122. error: {
  123. code: 'user_not_found',
  124. message: req.i18n.translate('user_not_found'),
  125. },
  126. })
  127. }
  128. if (error != null) {
  129. return next(error)
  130. }
  131. res.json({ user })
  132. }
  133. )
  134. },
  135. remove(req, res, next) {
  136. const { entity, entityConfig } = req
  137. const { userId } = req.params
  138. if (entityConfig.readOnly) {
  139. return next(new Errors.NotFoundError('Cannot remove users from entity'))
  140. }
  141. const loggedInUserId = SessionManager.getLoggedInUserId(req.session)
  142. if (loggedInUserId === userId) {
  143. return res.status(400).json({
  144. error: {
  145. code: 'managers_cannot_remove_self',
  146. message: req.i18n.translate('managers_cannot_remove_self'),
  147. },
  148. })
  149. }
  150. UserMembershipHandler.removeUser(
  151. entity,
  152. entityConfig,
  153. userId,
  154. function (error, user) {
  155. if (error && error instanceof UserIsManagerError) {
  156. return res.status(400).json({
  157. error: {
  158. code: 'managers_cannot_remove_admin',
  159. message: req.i18n.translate('managers_cannot_remove_admin'),
  160. },
  161. })
  162. }
  163. if (error != null) {
  164. return next(error)
  165. }
  166. res.sendStatus(200)
  167. }
  168. )
  169. },
  170. exportCsv(req, res, next) {
  171. const { entity, entityConfig } = req
  172. const fields = ['email', 'last_logged_in_at', 'last_active_at']
  173. UserMembershipHandler.getUsers(
  174. entity,
  175. entityConfig,
  176. function (error, users) {
  177. if (error != null) {
  178. return next(error)
  179. }
  180. const csvParser = new CSVParser({ fields })
  181. csvAttachment(res, csvParser.parse(users), 'Group.csv')
  182. }
  183. )
  184. },
  185. new(req, res, next) {
  186. res.render('user_membership/new', {
  187. entityName: req.params.name,
  188. entityId: req.params.id,
  189. })
  190. },
  191. create(req, res, next) {
  192. const entityId = req.params.id
  193. const entityConfig = req.entityConfig
  194. UserMembershipHandler.createEntity(
  195. entityId,
  196. entityConfig,
  197. function (error, entity) {
  198. if (error != null) {
  199. return next(error)
  200. }
  201. res.redirect(entityConfig.pathsFor(entityId).index)
  202. }
  203. )
  204. },
  205. }