renders.handler.js 7.0 KB

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