renders.handler.js 7.3 KB

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