renders.handler.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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. res.render("report", {
  66. title: "Report abuse",
  67. });
  68. }
  69. async function resetPassword(req, res) {
  70. res.render("reset_password", {
  71. title: "Reset password",
  72. });
  73. }
  74. async function resetPasswordSetNewPassword(req, res) {
  75. const reset_password_token = req.params.resetPasswordToken;
  76. if (reset_password_token) {
  77. const user = await query.user.find(
  78. {
  79. reset_password_token,
  80. reset_password_expires: [">", utils.dateToUTC(new Date())]
  81. }
  82. );
  83. if (user) {
  84. res.locals.token_verified = true;
  85. }
  86. }
  87. res.render("reset_password_set_new_password", {
  88. title: "Reset password",
  89. ...(res.locals.token_verified && { reset_password_token }),
  90. });
  91. }
  92. async function verifyChangeEmail(req, res) {
  93. res.render("verify_change_email", {
  94. title: "Verifying email",
  95. });
  96. }
  97. async function verify(req, res) {
  98. res.render("verify", {
  99. title: "Verify",
  100. });
  101. }
  102. async function terms(req, res) {
  103. res.render("terms", {
  104. title: "Terms of Service",
  105. });
  106. }
  107. /**
  108. *
  109. * PARTIALS
  110. *
  111. **/
  112. async function confirmLinkDelete(req, res) {
  113. const link = await query.link.find({
  114. uuid: req.query.id,
  115. ...(!req.user.admin && { user_id: req.user.id })
  116. });
  117. if (!link) {
  118. return res.render("partials/links/dialog/message", {
  119. layout: false,
  120. message: "Could not find the link."
  121. });
  122. }
  123. res.render("partials/links/dialog/delete", {
  124. layout: false,
  125. link: utils.getShortURL(link.address, link.domain).link,
  126. id: link.uuid
  127. });
  128. }
  129. async function confirmLinkBan(req, res) {
  130. const link = await query.link.find({
  131. uuid: req.query.id,
  132. ...(!req.user.admin && { user_id: req.user.id })
  133. });
  134. if (!link) {
  135. return res.render("partials/links/dialog/message", {
  136. message: "Could not find the link."
  137. });
  138. }
  139. res.render("partials/links/dialog/ban", {
  140. link: utils.getShortURL(link.address, link.domain).link,
  141. id: link.uuid
  142. });
  143. }
  144. async function confirmUserDelete(req, res) {
  145. const user = await query.user.find({ id: req.query.id });
  146. if (!user) {
  147. return res.render("partials/admin/dialog/message", {
  148. layout: false,
  149. message: "Could not find the user."
  150. });
  151. }
  152. res.render("partials/admin/dialog/delete_user", {
  153. layout: false,
  154. email: user.email,
  155. id: user.id
  156. });
  157. }
  158. async function confirmUserBan(req, res) {
  159. const user = await query.user.find({ id: req.query.id });
  160. if (!user) {
  161. return res.render("partials/admin/dialog/message", {
  162. layout: false,
  163. message: "Could not find the user."
  164. });
  165. }
  166. res.render("partials/admin/dialog/ban_user", {
  167. layout: false,
  168. email: user.email,
  169. id: user.id
  170. });
  171. }
  172. async function createUser(req, res) {
  173. res.render("partials/admin/dialog/create_user", {
  174. layout: false,
  175. });
  176. }
  177. async function addDomainAdmin(req, res) {
  178. res.render("partials/admin/dialog/add_domain", {
  179. layout: false,
  180. });
  181. }
  182. async function addDomainForm(req, res) {
  183. res.render("partials/settings/domain/add_form");
  184. }
  185. async function confirmDomainDelete(req, res) {
  186. const domain = await query.domain.find({
  187. uuid: req.query.id,
  188. user_id: req.user.id
  189. });
  190. if (!domain) {
  191. throw new utils.CustomError("Could not find the domain.", 400);
  192. }
  193. res.render("partials/settings/domain/delete", {
  194. ...utils.sanitize.domain(domain)
  195. });
  196. }
  197. async function confirmDomainBan(req, res) {
  198. const domain = await query.domain.find({
  199. id: req.query.id
  200. });
  201. if (!domain) {
  202. throw new utils.CustomError("Could not find the domain.", 400);
  203. }
  204. const hasUser = !!domain.user_id;
  205. const hasLink = await query.link.find({ domain_id: domain.id });
  206. res.render("partials/admin/dialog/ban_domain", {
  207. id: domain.id,
  208. address: domain.address,
  209. hasUser,
  210. hasLink,
  211. });
  212. }
  213. async function confirmDomainDeleteAdmin(req, res) {
  214. const domain = await query.domain.find({
  215. id: req.query.id
  216. });
  217. if (!domain) {
  218. throw new utils.CustomError("Could not find the domain.", 400);
  219. }
  220. const hasLink = await query.link.find({ domain_id: domain.id });
  221. res.render("partials/admin/dialog/delete_domain", {
  222. id: domain.id,
  223. address: domain.address,
  224. hasLink,
  225. });
  226. }
  227. async function getReportEmail(req, res) {
  228. if (!env.REPORT_EMAIL) {
  229. throw new utils.CustomError("No report email is available.", 400);
  230. }
  231. res.render("partials/report/email", {
  232. report_email: env.REPORT_EMAIL.replace("@", "[at]")
  233. });
  234. }
  235. async function getSupportEmail(req, res) {
  236. if (!env.CONTACT_EMAIL) {
  237. throw new utils.CustomError("No support email is available.", 400);
  238. }
  239. await utils.sleep(500);
  240. res.render("partials/support_email", {
  241. email: env.CONTACT_EMAIL,
  242. });
  243. }
  244. async function linkEdit(req, res) {
  245. const link = await query.link.find({
  246. uuid: req.params.id,
  247. ...(!req.user.admin && { user_id: req.user.id })
  248. });
  249. res.render("partials/links/edit", {
  250. ...(link && utils.sanitize.link(link)),
  251. });
  252. }
  253. async function linkEditAdmin(req, res) {
  254. const link = await query.link.find({
  255. uuid: req.params.id,
  256. });
  257. res.render("partials/admin/links/edit", {
  258. ...(link && utils.sanitize.link(link)),
  259. });
  260. }
  261. module.exports = {
  262. addDomainAdmin,
  263. addDomainForm,
  264. admin,
  265. banned,
  266. confirmDomainBan,
  267. confirmDomainDelete,
  268. confirmDomainDeleteAdmin,
  269. confirmLinkBan,
  270. confirmLinkDelete,
  271. confirmUserBan,
  272. confirmUserDelete,
  273. createAdmin,
  274. createUser,
  275. getReportEmail,
  276. getSupportEmail,
  277. homepage,
  278. linkEdit,
  279. linkEditAdmin,
  280. login,
  281. logout,
  282. notFound,
  283. report,
  284. resetPassword,
  285. resetPasswordSetNewPassword,
  286. settings,
  287. stats,
  288. terms,
  289. verifyChangeEmail,
  290. verify,
  291. }