panel.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { Elysia } from 'elysia'
  2. import { Eta } from "eta"
  3. const eta = new Eta({ views: "./templates" })
  4. import Auth from '../../utils/auth';
  5. import Meteostanice from '../../utils/meteostanice';
  6. import stations from './panel/stations';
  7. import validateTurnstile from '../../utils/validateTurnstile';
  8. import normalizeEmail from '../../utils/normalizeEmail';
  9. export default (langName, lang) => new Elysia({ prefix: "/panel" })
  10. .use(stations(langName, lang))
  11. .get("/", async ({ cookie, redirect, set }) => {
  12. const token = cookie.session.value
  13. const session = await Auth.getSession(token)
  14. if (!session) {
  15. return redirect(`/${langName === "sk" ? `` : `${langName}/`}auth?error=loginNeeded`)
  16. }
  17. const user = Auth.getUser(session.email)
  18. const meteostanice = Meteostanice.getOwned(session.email)
  19. set.headers['content-type'] = 'text/html; charset=utf8'
  20. return eta.render(`${langName}/panel/index`, { user, meteostanice })
  21. })
  22. .get("/settings", async ({ cookie, redirect, set }) => {
  23. const token = cookie.session.value
  24. const session = await Auth.getSession(token)
  25. if (!session) {
  26. return redirect(`/${langName === "sk" ? `` : `${langName}/`}auth?error=loginNeeded`)
  27. }
  28. const user = Auth.getUser(session.email)
  29. set.headers['content-type'] = 'text/html; charset=utf8'
  30. return eta.render(`${langName}/panel/settings`, { siteKey: process.env.TURNSTILE_SITE_KEY, user })
  31. })
  32. .post("/settings", async ({ request, server, cookie, redirect, body, set }) => {
  33. const clientIP = request.headers.get('x-forwarded-for') ?? server.requestIP(request).address
  34. const token = cookie.session.value
  35. const session = await Auth.getSession(token)
  36. if (!session) {
  37. return redirect(`/${langName === "sk" ? `` : `${langName}/`}auth?error=loginNeeded`)
  38. }
  39. const user = Auth.getUser(session.email)
  40. const newName = body?.name
  41. const newEmail = body?.email
  42. if (!normalizeEmail(newEmail)) {
  43. set.headers['content-type'] = 'text/html; charset=utf8'
  44. return eta.render(`${langName}/panel/settings`, { siteKey: process.env.TURNSTILE_SITE_KEY, lang, user, error: "invalidEmail" })
  45. }
  46. const turnstileResponse = body?.["cf-turnstile-response"]
  47. if (!turnstileResponse) {
  48. set.headers['content-type'] = 'text/html; charset=utf8'
  49. return eta.render(`${langName}/panel/settings`, { siteKey: process.env.TURNSTILE_SITE_KEY, lang, user, error: "turnstile.noToken" })
  50. }
  51. const turnstileValid = await validateTurnstile(turnstileResponse, clientIP)
  52. if (!turnstileValid.success) {
  53. let errorMessage = `turnstile.unavailable`;
  54. if (turnstileValid["error-codes"]?.includes("invalid-input-response"))
  55. errorMessage = `turnstile.invalidResponse`
  56. if (turnstileValid["error-codes"]?.includes("timeout-or-duplicate"))
  57. errorMessage = `turnstile.keyUsedOrExpired`
  58. set.headers['content-type'] = 'text/html; charset=utf8'
  59. return eta.render(`${langName}/panel/settings`, { siteKey: process.env.TURNSTILE_SITE_KEY, lang, user, error: errorMessage })
  60. }
  61. Auth.editUser(session.email, newName, newEmail)
  62. set.headers['content-type'] = 'text/html; charset=utf8'
  63. return redirect(`/${langName === "sk" ? `` : `${langName}/`}panel`)
  64. })