renders.handler.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. const query = require("../queries");
  2. const utils = require("../utils");
  3. const env = require("../env");
  4. /**
  5. *
  6. * PAGES
  7. *
  8. **/
  9. async function homepage(req, res) {
  10. res.render("homepage", {
  11. title: "Modern open source URL shortener",
  12. });
  13. }
  14. async function login(req, res) {
  15. if (req.user) {
  16. res.redirect("/");
  17. return;
  18. }
  19. res.render("login", {
  20. title: "Log in or sign up"
  21. });
  22. }
  23. function logout(req, res) {
  24. utils.deleteCurrentToken(res);
  25. res.render("logout", {
  26. title: "Logging out.."
  27. });
  28. }
  29. async function createAdmin(req, res) {
  30. const isThereAUser = await query.user.findAny();
  31. if (isThereAUser) {
  32. res.redirect("/login");
  33. return;
  34. }
  35. res.render("create_admin", {
  36. title: "Create admin account"
  37. });
  38. }
  39. function notFound(req, res) {
  40. res.render("404", {
  41. title: "404 - Not found"
  42. });
  43. }
  44. function settings(req, res) {
  45. res.render("settings", {
  46. title: "Settings"
  47. });
  48. }
  49. function admin(req, res) {
  50. res.render("admin", {
  51. title: "Admin"
  52. });
  53. }
  54. function stats(req, res) {
  55. res.render("stats", {
  56. title: "Stats"
  57. });
  58. }
  59. async function banned(req, res) {
  60. res.render("banned", {
  61. title: "Banned link",
  62. });
  63. }
  64. async function report(req, res) {
  65. if (!env.REPORT_EMAIL) {
  66. res.redirect("/");
  67. return;
  68. }
  69. res.render("report", {
  70. title: "Report abuse",
  71. });
  72. }
  73. async function resetPassword(req, res) {
  74. res.render("reset_password", {
  75. title: "Reset password",
  76. });
  77. }
  78. async function resetPasswordSetNewPassword(req, res) {
  79. const reset_password_token = req.params.resetPasswordToken;
  80. if (reset_password_token) {
  81. const user = await query.user.find(
  82. {
  83. reset_password_token,
  84. reset_password_expires: [">", utils.dateToUTC(new Date())]
  85. }
  86. );
  87. if (user) {
  88. res.locals.token_verified = true;
  89. }
  90. }
  91. res.render("reset_password_set_new_password", {
  92. title: "Reset password",
  93. ...(res.locals.token_verified && { reset_password_token }),
  94. });
  95. }
  96. async function verifyChangeEmail(req, res) {
  97. res.render("verify_change_email", {
  98. title: "Verifying email",
  99. });
  100. }
  101. async function verify(req, res) {
  102. res.render("verify", {
  103. title: "Verify",
  104. });
  105. }
  106. async function terms(req, res) {
  107. res.render("terms", {
  108. title: "Terms of Service",
  109. });
  110. }
  111. /**
  112. *
  113. * PARTIALS
  114. *
  115. **/
  116. async function confirmLinkDelete(req, res) {
  117. const link = await query.link.find({
  118. uuid: req.query.id,
  119. ...(!req.user.admin && { user_id: req.user.id })
  120. });
  121. if (!link) {
  122. return res.render("partials/links/dialog/message", {
  123. layout: false,
  124. message: "Could not find the link."
  125. });
  126. }
  127. res.render("partials/links/dialog/delete", {
  128. layout: false,
  129. link: utils.getShortURL(link.address, link.domain).link,
  130. id: link.uuid
  131. });
  132. }
  133. async function confirmLinkBan(req, res) {
  134. const link = await query.link.find({
  135. uuid: req.query.id,
  136. ...(!req.user.admin && { user_id: req.user.id })
  137. });
  138. if (!link) {
  139. return res.render("partials/links/dialog/message", {
  140. message: "Could not find the link."
  141. });
  142. }
  143. res.render("partials/links/dialog/ban", {
  144. link: utils.getShortURL(link.address, link.domain).link,
  145. id: link.uuid
  146. });
  147. }
  148. async function confirmUserDelete(req, res) {
  149. const user = await query.user.find({ id: req.query.id });
  150. if (!user) {
  151. return res.render("partials/admin/dialog/message", {
  152. layout: false,
  153. message: "Could not find the user."
  154. });
  155. }
  156. res.render("partials/admin/dialog/delete_user", {
  157. layout: false,
  158. email: user.email,
  159. id: user.id
  160. });
  161. }
  162. async function confirmUserBan(req, res) {
  163. const user = await query.user.find({ id: req.query.id });
  164. if (!user) {
  165. return res.render("partials/admin/dialog/message", {
  166. layout: false,
  167. message: "Could not find the user."
  168. });
  169. }
  170. res.render("partials/admin/dialog/ban_user", {
  171. layout: false,
  172. email: user.email,
  173. id: user.id
  174. });
  175. }
  176. async function createUser(req, res) {
  177. res.render("partials/admin/dialog/create_user", {
  178. layout: false,
  179. });
  180. }
  181. async function addDomainAdmin(req, res) {
  182. res.render("partials/admin/dialog/add_domain", {
  183. layout: false,
  184. });
  185. }
  186. async function addDomainForm(req, res) {
  187. res.render("partials/settings/domain/add_form");
  188. }
  189. async function confirmDomainDelete(req, res) {
  190. const domain = await query.domain.find({
  191. uuid: req.query.id,
  192. user_id: req.user.id
  193. });
  194. if (!domain) {
  195. throw new utils.CustomError("Could not find the domain.", 400);
  196. }
  197. res.render("partials/settings/domain/delete", {
  198. ...utils.sanitize.domain(domain)
  199. });
  200. }
  201. async function confirmDomainBan(req, res) {
  202. const domain = await query.domain.find({
  203. id: req.query.id
  204. });
  205. if (!domain) {
  206. throw new utils.CustomError("Could not find the domain.", 400);
  207. }
  208. const hasUser = !!domain.user_id;
  209. const hasLink = await query.link.find({ domain_id: domain.id });
  210. res.render("partials/admin/dialog/ban_domain", {
  211. id: domain.id,
  212. address: domain.address,
  213. hasUser,
  214. hasLink,
  215. });
  216. }
  217. async function confirmDomainDeleteAdmin(req, res) {
  218. const domain = await query.domain.find({
  219. id: req.query.id
  220. });
  221. if (!domain) {
  222. throw new utils.CustomError("Could not find the domain.", 400);
  223. }
  224. const hasLink = await query.link.find({ domain_id: domain.id });
  225. res.render("partials/admin/dialog/delete_domain", {
  226. id: domain.id,
  227. address: domain.address,
  228. hasLink,
  229. });
  230. }
  231. async function getReportEmail(req, res) {
  232. if (!env.REPORT_EMAIL) {
  233. throw new utils.CustomError("No report email is available.", 400);
  234. }
  235. res.render("partials/report/email", {
  236. report_email_address: env.REPORT_EMAIL.replace("@", "[at]")
  237. });
  238. }
  239. async function getSupportEmail(req, res) {
  240. if (!env.CONTACT_EMAIL) {
  241. throw new utils.CustomError("No support email is available.", 400);
  242. }
  243. await utils.sleep(500);
  244. res.render("partials/support_email", {
  245. email: env.CONTACT_EMAIL,
  246. });
  247. }
  248. async function linkEdit(req, res) {
  249. const link = await query.link.find({
  250. uuid: req.params.id,
  251. ...(!req.user.admin && { user_id: req.user.id })
  252. });
  253. res.render("partials/links/edit", {
  254. ...(link && utils.sanitize.link(link)),
  255. });
  256. }
  257. async function linkEditAdmin(req, res) {
  258. const link = await query.link.find({
  259. uuid: req.params.id,
  260. });
  261. res.render("partials/admin/links/edit", {
  262. ...(link && utils.sanitize.link(link)),
  263. });
  264. }
  265. module.exports = {
  266. addDomainAdmin,
  267. addDomainForm,
  268. admin,
  269. banned,
  270. confirmDomainBan,
  271. confirmDomainDelete,
  272. confirmDomainDeleteAdmin,
  273. confirmLinkBan,
  274. confirmLinkDelete,
  275. confirmUserBan,
  276. confirmUserDelete,
  277. createAdmin,
  278. createUser,
  279. getReportEmail,
  280. getSupportEmail,
  281. homepage,
  282. linkEdit,
  283. linkEditAdmin,
  284. login,
  285. logout,
  286. notFound,
  287. report,
  288. resetPassword,
  289. resetPasswordSetNewPassword,
  290. settings,
  291. stats,
  292. terms,
  293. verifyChangeEmail,
  294. verify,
  295. }