users.handler.js 4.7 KB

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