users.handler.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const bcrypt = require("bcryptjs");
  2. const query = require("../queries");
  3. const utils = require("../utils");
  4. const mail = require("../mail");
  5. const env = require("../env");
  6. async function get(req, res) {
  7. const domains = await query.domain.get({ user_id: req.user.id });
  8. const data = {
  9. apikey: req.user.apikey,
  10. email: req.user.email,
  11. domains: domains.map(utils.sanitize.domain)
  12. };
  13. return res.status(200).send(data);
  14. };
  15. async function remove(req, res) {
  16. await query.user.remove(req.user);
  17. if (req.isHTML) {
  18. utils.deleteCurrentToken(res);
  19. res.setHeader("HX-Trigger-After-Swap", "redirectToHomepage");
  20. res.render("partials/settings/delete_account", {
  21. success: "Account has been deleted. Logging out..."
  22. });
  23. return;
  24. }
  25. return res.status(200).send("OK");
  26. };
  27. async function removeByAdmin(req, res) {
  28. const user = await query.user.find({ id: req.params.id });
  29. if (!user) {
  30. const message = "Could not find the user.";
  31. if (req.isHTML) {
  32. return res.render("partials/admin/dialog/message", {
  33. layout: false,
  34. message
  35. });
  36. } else {
  37. return res.status(400).send({ message });
  38. }
  39. }
  40. await query.user.remove(user);
  41. if (req.isHTML) {
  42. res.setHeader("HX-Reswap", "outerHTML");
  43. res.setHeader("HX-Trigger", "reloadMainTable");
  44. res.render("partials/admin/dialog/delete_user_success", {
  45. email: user.email,
  46. });
  47. return;
  48. }
  49. return res.status(200).send({ message: "User has been deleted successfully." });
  50. };
  51. async function getAdmin(req, res) {
  52. const { limit, skip, all } = req.context;
  53. const { role, search } = req.query;
  54. const userId = req.user.id;
  55. const verified = utils.parseBooleanQuery(req.query.verified);
  56. const banned = utils.parseBooleanQuery(req.query.banned);
  57. const domains = utils.parseBooleanQuery(req.query.domains);
  58. const links = utils.parseBooleanQuery(req.query.links);
  59. const match = {
  60. ...(role && { role }),
  61. ...(verified !== undefined && { verified }),
  62. ...(banned !== undefined && { banned }),
  63. };
  64. const [data, total] = await Promise.all([
  65. query.user.getAdmin(match, { limit, search, domains, links, skip }),
  66. query.user.totalAdmin(match, { search, domains, links })
  67. ]);
  68. const users = data.map(utils.sanitize.user_admin);
  69. if (req.isHTML) {
  70. res.render("partials/admin/users/table", {
  71. total,
  72. total_formatted: total.toLocaleString("en-US"),
  73. limit,
  74. skip,
  75. users,
  76. })
  77. return;
  78. }
  79. return res.send({
  80. total,
  81. limit,
  82. skip,
  83. data: users,
  84. });
  85. };
  86. async function ban(req, res) {
  87. const { id } = req.params;
  88. const update = {
  89. banned_by_id: req.user.id,
  90. banned: true
  91. };
  92. // 1. check if user exists
  93. const user = await query.user.find({ id });
  94. if (!user) {
  95. throw new CustomError("No user has been found.", 400);
  96. }
  97. if (user.banned) {
  98. throw new CustomError("User has been banned already.", 400);
  99. }
  100. const tasks = [];
  101. // 2. ban user
  102. tasks.push(query.user.update({ id }, update));
  103. // 3. ban user links
  104. if (req.body.links) {
  105. tasks.push(query.link.update({ user_id: id }, update));
  106. }
  107. // 4. ban user domains
  108. if (req.body.domains) {
  109. tasks.push(query.domain.update({ user_id: id }, update));
  110. }
  111. // 5. wait for all tasks to finish
  112. await Promise.all(tasks).catch((err) => {
  113. throw new CustomError("Couldn't ban entries.");
  114. });
  115. // 6. send response
  116. if (req.isHTML) {
  117. res.setHeader("HX-Reswap", "outerHTML");
  118. res.setHeader("HX-Trigger", "reloadMainTable");
  119. res.render("partials/admin/dialog/ban_user_success", {
  120. email: user.email,
  121. });
  122. return;
  123. }
  124. return res.status(200).send({ message: "Banned user successfully." });
  125. }
  126. async function create(req, res) {
  127. const salt = await bcrypt.genSalt(12);
  128. req.body.password = await bcrypt.hash(req.body.password, salt);
  129. const user = await query.user.create(req.body);
  130. if (req.body.verification_email && !user.banned && !user.verified) {
  131. await mail.verification(user);
  132. }
  133. if (req.isHTML) {
  134. res.setHeader("HX-Trigger", "reloadMainTable");
  135. res.render("partials/admin/dialog/create_user_success", {
  136. email: user.email,
  137. });
  138. return;
  139. }
  140. return res.status(201).send({ message: "The user has been created successfully." });
  141. }
  142. module.exports = {
  143. ban,
  144. create,
  145. get,
  146. getAdmin,
  147. remove,
  148. removeByAdmin,
  149. }