107 lines
2.6 KiB
TypeScript
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);
|
|
});
|
|
});
|