users.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const joi = require('joi');
  2. const { ObjectID } = require('mongodb');
  3. const { clientError } = require('server/modules/client-error');
  4. const COLLECTION_USERS = 'users';
  5. function getObjectId(id) {
  6. if (process.env.NODE_ENV === 'test') {
  7. return id;
  8. }
  9. return new ObjectID(id);
  10. }
  11. async function insertUser(db, info) {
  12. const { error, value } = joi.validate(info, {
  13. name: joi.string().required(),
  14. email: joi.string()
  15. .email()
  16. .required()
  17. });
  18. if (error) {
  19. throw clientError(error);
  20. }
  21. const users = await db.collection(COLLECTION_USERS);
  22. const result = await users.insert(value);
  23. try {
  24. const { _id, ...userResult } = result.ops[0];
  25. return {
  26. id: String(_id),
  27. ...userResult
  28. };
  29. } catch (err) {
  30. return value;
  31. }
  32. }
  33. async function modifyUser(db, id, info) {
  34. const { error, value } = joi.validate(info, {
  35. name: joi.string(),
  36. email: joi.string()
  37. .email()
  38. });
  39. if (error) {
  40. throw clientError(error);
  41. }
  42. const users = await db.collection(COLLECTION_USERS);
  43. const _id = getObjectId(id);
  44. await users.updateOne({ _id }, { $set: value }, {
  45. upsert: false,
  46. multi: false
  47. });
  48. }
  49. async function deleteUser(db, id) {
  50. const users = await db.collection(COLLECTION_USERS);
  51. await users.deleteOne({ _id: getObjectId(id) });
  52. }
  53. async function getUsers(db) {
  54. const users = await db.collection(COLLECTION_USERS);
  55. const rows = await users.find({})
  56. .toArray();
  57. return rows.map(({ _id, ...rest }) => ({
  58. id: String(_id),
  59. ...rest
  60. }));
  61. }
  62. module.exports = {
  63. insertUser,
  64. modifyUser,
  65. deleteUser,
  66. getUsers,
  67. COLLECTION_USERS
  68. };