server.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import env from "./env";
  2. import asyncHandler from "express-async-handler";
  3. import cookieParser from "cookie-parser";
  4. import passport from "passport";
  5. import express from "express";
  6. import helmet from "helmet";
  7. import morgan from "morgan";
  8. import nextApp from "next";
  9. import * as Sentry from "@sentry/node";
  10. import * as helpers from "./handlers/helpers";
  11. import * as links from "./handlers/links";
  12. import * as auth from "./handlers/auth";
  13. import __v1Routes from "./__v1";
  14. import routes from "./routes";
  15. import { stream } from "./config/winston";
  16. import "./cron";
  17. import "./passport";
  18. const port = env.PORT;
  19. const app = nextApp({ dir: "./client", dev: env.isDev });
  20. const handle = app.getRequestHandler();
  21. app.prepare().then(async () => {
  22. const server = express();
  23. server.set("trust proxy", true);
  24. if (env.isDev) {
  25. server.use(morgan("combined", { stream }));
  26. } else if (env.SENTRY_PRIVATE_DSN) {
  27. Sentry.init({
  28. dsn: env.SENTRY_PRIVATE_DSN,
  29. environment: process.env.NODE_ENV
  30. });
  31. server.use(
  32. Sentry.Handlers.requestHandler({
  33. ip: true,
  34. user: ["id", "email"]
  35. })
  36. );
  37. }
  38. server.use(helmet());
  39. server.use(cookieParser());
  40. server.use(express.json());
  41. server.use(express.urlencoded({ extended: true }));
  42. server.use(passport.initialize());
  43. server.use(express.static("static"));
  44. server.use(helpers.ip);
  45. server.use(asyncHandler(links.redirectCustomDomain));
  46. server.use("/api/v2", routes);
  47. server.use("/api", __v1Routes);
  48. server.get(
  49. "/reset-password/:resetPasswordToken?",
  50. asyncHandler(auth.resetPassword),
  51. (req, res) => app.render(req, res, "/reset-password", { token: req.token })
  52. );
  53. server.get(
  54. "/verify-email/:changeEmailToken",
  55. asyncHandler(auth.changeEmail),
  56. (req, res) => app.render(req, res, "/verify-email", { token: req.token })
  57. );
  58. server.get(
  59. "/verify/:verificationToken?",
  60. asyncHandler(auth.verify),
  61. (req, res) => app.render(req, res, "/verify", { token: req.token })
  62. );
  63. server.get("/:id", asyncHandler(links.redirect(app)));
  64. // Error handler
  65. server.use(helpers.error);
  66. // Handler everything else by Next.js
  67. server.get("*", (req, res) => handle(req, res));
  68. server.listen(port, err => {
  69. if (err) throw err;
  70. console.log(`> Ready on http://localhost:${port}`);
  71. });
  72. });