users.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. const express = require('express');
  2. const validator = require('../../lib/validator');
  3. const jwtdecode = require('../../lib/express/jwt-decode');
  4. const userIdFromMe = require('../../lib/express/user-id-from-me');
  5. const internalUser = require('../../internal/user');
  6. const apiValidator = require('../../lib/validator/api');
  7. let router = express.Router({
  8. caseSensitive: true,
  9. strict: true,
  10. mergeParams: true
  11. });
  12. /**
  13. * /api/users
  14. */
  15. router
  16. .route('/')
  17. .options((req, res) => {
  18. res.sendStatus(204);
  19. })
  20. .all(jwtdecode())
  21. /**
  22. * GET /api/users
  23. *
  24. * Retrieve all users
  25. */
  26. .get((req, res, next) => {
  27. validator({
  28. additionalProperties: false,
  29. properties: {
  30. expand: {
  31. $ref: 'definitions#/definitions/expand'
  32. },
  33. query: {
  34. $ref: 'definitions#/definitions/query'
  35. }
  36. }
  37. }, {
  38. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null),
  39. query: (typeof req.query.query === 'string' ? req.query.query : null)
  40. })
  41. .then((data) => {
  42. return internalUser.getAll(res.locals.access, data.expand, data.query);
  43. })
  44. .then((users) => {
  45. res.status(200)
  46. .send(users);
  47. })
  48. .catch(next);
  49. })
  50. /**
  51. * POST /api/users
  52. *
  53. * Create a new User
  54. */
  55. .post((req, res, next) => {
  56. apiValidator({$ref: 'endpoints/users#/links/1/schema'}, req.body)
  57. .then((payload) => {
  58. return internalUser.create(res.locals.access, payload);
  59. })
  60. .then((result) => {
  61. res.status(201)
  62. .send(result);
  63. })
  64. .catch(next);
  65. });
  66. /**
  67. * Specific user
  68. *
  69. * /api/users/123
  70. */
  71. router
  72. .route('/:user_id')
  73. .options((req, res) => {
  74. res.sendStatus(204);
  75. })
  76. .all(jwtdecode())
  77. .all(userIdFromMe)
  78. /**
  79. * GET /users/123 or /users/me
  80. *
  81. * Retrieve a specific user
  82. */
  83. .get((req, res, next) => {
  84. validator({
  85. required: ['user_id'],
  86. additionalProperties: false,
  87. properties: {
  88. user_id: {
  89. $ref: 'definitions#/definitions/id'
  90. },
  91. expand: {
  92. $ref: 'definitions#/definitions/expand'
  93. }
  94. }
  95. }, {
  96. user_id: req.params.user_id,
  97. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null)
  98. })
  99. .then((data) => {
  100. return internalUser.get(res.locals.access, {
  101. id: data.user_id,
  102. expand: data.expand,
  103. omit: internalUser.getUserOmisionsByAccess(res.locals.access, data.user_id)
  104. });
  105. })
  106. .then((user) => {
  107. res.status(200)
  108. .send(user);
  109. })
  110. .catch(next);
  111. })
  112. /**
  113. * PUT /api/users/123
  114. *
  115. * Update and existing user
  116. */
  117. .put((req, res, next) => {
  118. apiValidator({$ref: 'endpoints/users#/links/2/schema'}, req.body)
  119. .then((payload) => {
  120. payload.id = req.params.user_id;
  121. return internalUser.update(res.locals.access, payload);
  122. })
  123. .then((result) => {
  124. res.status(200)
  125. .send(result);
  126. })
  127. .catch(next);
  128. })
  129. /**
  130. * DELETE /api/users/123
  131. *
  132. * Update and existing user
  133. */
  134. .delete((req, res, next) => {
  135. internalUser.delete(res.locals.access, {id: req.params.user_id})
  136. .then((result) => {
  137. res.status(200)
  138. .send(result);
  139. })
  140. .catch(next);
  141. });
  142. /**
  143. * Specific user auth
  144. *
  145. * /api/users/123/auth
  146. */
  147. router
  148. .route('/:user_id/auth')
  149. .options((req, res) => {
  150. res.sendStatus(204);
  151. })
  152. .all(jwtdecode())
  153. .all(userIdFromMe)
  154. /**
  155. * PUT /api/users/123/auth
  156. *
  157. * Update password for a user
  158. */
  159. .put((req, res, next) => {
  160. apiValidator({$ref: 'endpoints/users#/links/4/schema'}, req.body)
  161. .then((payload) => {
  162. payload.id = req.params.user_id;
  163. return internalUser.setPassword(res.locals.access, payload);
  164. })
  165. .then((result) => {
  166. res.status(201)
  167. .send(result);
  168. })
  169. .catch(next);
  170. });
  171. /**
  172. * Specific user permissions
  173. *
  174. * /api/users/123/permissions
  175. */
  176. router
  177. .route('/:user_id/permissions')
  178. .options((req, res) => {
  179. res.sendStatus(204);
  180. })
  181. .all(jwtdecode())
  182. .all(userIdFromMe)
  183. /**
  184. * PUT /api/users/123/permissions
  185. *
  186. * Set some or all permissions for a user
  187. */
  188. .put((req, res, next) => {
  189. apiValidator({$ref: 'endpoints/users#/links/5/schema'}, req.body)
  190. .then((payload) => {
  191. payload.id = req.params.user_id;
  192. return internalUser.setPermissions(res.locals.access, payload);
  193. })
  194. .then((result) => {
  195. res.status(201)
  196. .send(result);
  197. })
  198. .catch(next);
  199. });
  200. /**
  201. * Specific user login as
  202. *
  203. * /api/users/123/login
  204. */
  205. router
  206. .route('/:user_id/login')
  207. .options((req, res) => {
  208. res.sendStatus(204);
  209. })
  210. .all(jwtdecode())
  211. /**
  212. * POST /api/users/123/login
  213. *
  214. * Log in as a user
  215. */
  216. .post((req, res, next) => {
  217. internalUser.loginAs(res.locals.access, {id: parseInt(req.params.user_id, 10)})
  218. .then((result) => {
  219. res.status(201)
  220. .send(result);
  221. })
  222. .catch(next);
  223. });
  224. module.exports = router;