amati/apps/backend/src/index.ts
2024-09-06 15:06:59 +07:00

138 lines
3.6 KiB
TypeScript

import { serve } from "@hono/node-server";
import { configDotenv } from "dotenv";
import { Hono } from "hono";
import authRoutes from "./routes/auth/route";
import usersRoute from "./routes/users/route";
import managementAspectsRoute from "./routes/managementAspect/route";
import respondentsRoute from "./routes/register/route";
import { verifyAccessToken } from "./utils/authUtils";
import permissionRoutes from "./routes/permissions/route";
import { cors } from "hono/cors";
import { HTTPException } from "hono/http-exception";
import { getSignedCookie } from "hono/cookie";
import dashboardRoutes from "./routes/dashboard/routes";
import rolesRoute from "./routes/roles/route";
import { logger } from "hono/logger";
import DashboardError from "./errors/DashboardError";
import HonoEnv from "./types/HonoEnv";
import devRoutes from "./routes/dev/route";
import appEnv from "./appEnv";
import questionsRoute from "./routes/questions/route";
import assessmentResultRoute from "./routes/assessmentResult/route";
import assessmentRequestRoute from "./routes/assessmentRequest/route";
import forgotPasswordRoutes from "./routes/forgotPassword/route";
import assessmentsRoute from "./routes/assessments/route";
import assessmentsRequestManagementRoutes from "./routes/assessmentRequestManagement/route";
configDotenv();
const app = new Hono<HonoEnv>();
const routes = app
.use(logger())
.use(
cors({
origin: "*",
})
)
.use(async (c, next) => {
const cookieSecret = appEnv.COOKIE_SECRET;
if (!cookieSecret)
throw new HTTPException(500, {
message: "The 'COOKIE_SECRET' env is not set",
});
const accessToken = await getSignedCookie(
c,
cookieSecret,
"access_token",
"secure"
);
if (accessToken) {
const payload = await verifyAccessToken(accessToken);
if (payload) c.set("uid", payload.uid);
} else {
const authHeader = c.req.header("Authorization");
if (authHeader && authHeader.startsWith("Bearer ")) {
const token = authHeader.substring(7);
const payload = await verifyAccessToken(token);
if (payload) c.set("uid", payload.uid);
}
}
await next();
})
.use(async (c, next) => {
console.log("Incoming request:", c.req.path);
await next();
console.log("Outgoing response:", c.res.status);
if (c.res.status !== 200) {
console.log(await c.res.text());
}
})
.get("/test", (c) => {
return c.json({
message: "Server is up",
} as const);
})
.route("/auth", authRoutes)
.route("/users", usersRoute)
.route("/permissions", permissionRoutes)
.route("/dashboard", dashboardRoutes)
.route("/roles", rolesRoute)
.route("/dev", devRoutes)
.route("/questions", questionsRoute)
.route("/management-aspect", managementAspectsRoute)
.route("/register", respondentsRoute)
.route("/assessmentResult", assessmentResultRoute)
.route("/assessmentRequest", assessmentRequestRoute)
.route("/forgot-password", forgotPasswordRoutes)
.route("/assessments", assessmentsRoute)
.route("/assessmentRequestManagement",assessmentsRequestManagementRoutes)
.onError((err, c) => {
if (err instanceof DashboardError) {
return c.json(
{
message: err.message,
errorCode: err.errorCode,
formErrors: err.formErrors,
},
err.statusCode
);
}
if (err instanceof HTTPException) {
console.log(err);
return c.json(
{
message: err.message,
},
err.status
);
} else {
console.error(err);
return c.json(
{
message:
"Something is wrong in our side. We're working to fix it",
},
500
);
}
});
const port = appEnv.APP_PORT;
console.log(`Server is running on port ${port}`);
serve({
fetch: app.fetch,
port,
});
export type AppType = typeof routes;