Files
web/apps/redis-api/src/index.ts
Joakim Jäderberg 3af994b0a9 Merged in feat/redis-api-send-logs (pull request #2290)
feature: send logs to Sentry for Redis-Api

* feature: send logs to Sentry for Redis-Api


Approved-by: Linus Flood
2025-06-19 08:28:53 +00:00

68 lines
1.9 KiB
TypeScript

import "@/server/sentry.server.config";
import serverTiming from "@elysiajs/server-timing";
import { swagger } from "@elysiajs/swagger";
import * as Sentry from "@sentry/bun";
import { Elysia } from "elysia";
import { env } from "@/env";
import { AuthenticationError } from "@/errors/AuthenticationError";
import { ModelValidationError } from "@/errors/ModelValidationError";
import { apiRoutes } from "@/routes/api";
import { healthRoutes } from "@/routes/health";
import { setupShutdown } from "@/shutdown";
import { baseLogger } from "@/utils/logger";
setupShutdown();
const app = new Elysia()
.use(serverTiming())
.error("AUTHENTICATION_ERROR", AuthenticationError)
.error("MODEL_VALIDATION_ERROR", ModelValidationError)
.onError(({ code, error, set }) => {
switch (code) {
case "MODEL_VALIDATION_ERROR":
set.status = 400;
return getErrorReturn(error);
case "AUTHENTICATION_ERROR":
set.status = 401;
return getErrorReturn(error);
case "NOT_FOUND":
set.status = 404;
return getErrorReturn(error);
case "INTERNAL_SERVER_ERROR":
set.status = 500;
baseLogger.error("Internal server error", error);
Sentry.captureException(error);
return getErrorReturn(error);
}
});
if (env.IS_DEV) {
app.use(
swagger({
documentation: {
info: {
title: "Redis API",
version: "1.0.0",
},
},
}),
);
}
app.use(apiRoutes);
app.use(healthRoutes);
app.listen(env.PORT, (server) => {
baseLogger.debug(`🦊 REDISAPI@${env.VERSION} running on ${server.url}`);
});
function getErrorReturn(error: Error) {
return {
status: "error",
message: error.toString(),
};
}