Files
plunk/packages/api/src/app.ts
T

107 lines
2.6 KiB
TypeScript

import "dotenv/config";
import "express-async-errors";
import { STATUS_CODES } from "node:http";
import { Server } from "@overnightjs/core";
import compression from "compression";
import cookies from "cookie-parser";
import cors from "cors";
import { type NextFunction, type Request, type Response, json } from "express";
import helmet from "helmet";
import morgan from "morgan";
import signale from "signale";
import { APP_URI, NODE_ENV } from "./app/constants";
import { task } from "./app/cron";
import { Auth } from "./controllers/Auth";
import { Identities } from "./controllers/Identities";
import { Memberships } from "./controllers/Memberships";
import { Projects } from "./controllers/Projects";
import { Tasks } from "./controllers/Tasks";
import { Users } from "./controllers/Users";
import { Webhooks } from "./controllers/Webhooks";
import { V1 } from "./controllers/v1";
import { prisma } from "./database/prisma";
import { HttpException } from "./exceptions";
const server = new (class extends Server {
public constructor() {
super();
// Set the content-type to JSON for any request coming from AWS SNS
this.app.use((req, res, next) => {
if (req.get("x-amz-sns-message-type")) {
req.headers["content-type"] = "application/json";
}
next();
});
this.app.use(
compression({
threshold: 0,
}),
);
// Parse the rest of our application as json
this.app.use(json({ limit: "50mb" }));
this.app.use(cookies());
this.app.use(helmet());
this.app.use(["/v1", "/v1/track", "/v1/send"], (req, res, next) => {
res.set({ "Access-Control-Allow-Origin": "*" });
next();
});
this.app.use(
cors({
origin: [APP_URI],
credentials: true,
}),
);
this.app.use(morgan(NODE_ENV === "development" ? "dev" : "short"));
this.addControllers([
new Auth(),
new Users(),
new Projects(),
new Memberships(),
new Webhooks(),
new Identities(),
new Tasks(),
new V1(),
]);
this.app.use("*", () => {
throw new HttpException(404, "Unknown route");
});
}
})();
server.app.use((req, res, next) => {
console.log(`Incoming request: ${req.method} ${req.path}`);
next();
});
server.app.use((error: Error, req: Request, res: Response, _next: NextFunction) => {
const code = error instanceof HttpException ? error.code : 500;
if (NODE_ENV !== "development") {
signale.error(error);
}
res.status(code).json({
code,
error: STATUS_CODES[code],
message: error.message,
time: Date.now(),
});
});
void prisma.$connect().then(() => {
server.app.listen(4000, () => {
task.start();
signale.success("[HTTPS] Ready on", 4000);
});
});