2026-05-22 12:25:41 +00:00
|
|
|
import { Elysia } from 'elysia';
|
2026-05-22 17:32:57 +00:00
|
|
|
import cors from '@elysiajs/cors';
|
2026-05-22 15:53:48 +00:00
|
|
|
import { env, assertRequiredEnv } from './config/env';
|
2026-05-22 12:25:41 +00:00
|
|
|
import { healthRoutes } from './routes/health';
|
|
|
|
|
import { statusRoutes } from './routes/status';
|
2026-05-22 14:26:13 +00:00
|
|
|
import { diseaseRoutes } from './routes/diseases';
|
|
|
|
|
import { classificationRoutes } from './routes/classifications';
|
2026-05-22 16:08:18 +00:00
|
|
|
import { diagnosisRoutes } from './routes/diagnoses';
|
2026-05-22 14:26:13 +00:00
|
|
|
import { dashboardRoutes } from './routes/dashboard';
|
2026-05-22 15:53:48 +00:00
|
|
|
import { authRoutes } from './routes/auth';
|
2026-05-22 16:23:40 +00:00
|
|
|
import { expertRoutes } from './routes/expert';
|
2026-06-07 18:01:26 +07:00
|
|
|
import { metricsRoutes } from './routes/metrics';
|
|
|
|
|
import { httpRequestCounter, httpRequestDuration, httpRequestsActive } from './lib/telemetry';
|
|
|
|
|
import './types';
|
2026-05-22 15:53:48 +00:00
|
|
|
|
|
|
|
|
assertRequiredEnv();
|
2026-05-22 12:25:41 +00:00
|
|
|
|
2026-05-22 14:26:13 +00:00
|
|
|
const app = new Elysia()
|
2026-05-22 17:32:57 +00:00
|
|
|
.use(cors({
|
2026-06-15 14:32:54 +07:00
|
|
|
origin: env.allowedOrigins,
|
2026-05-22 17:32:57 +00:00
|
|
|
credentials: true,
|
|
|
|
|
}))
|
2026-06-07 18:01:26 +07:00
|
|
|
.use(metricsRoutes)
|
|
|
|
|
.onBeforeHandle(({ request, path }) => {
|
|
|
|
|
httpRequestsActive.inc();
|
|
|
|
|
request.metricsStart = performance.now();
|
|
|
|
|
request.metricsPath = path;
|
|
|
|
|
})
|
|
|
|
|
.onAfterHandle(({ request, set }) => {
|
|
|
|
|
const start = (request as any).metricsStart as number | undefined;
|
|
|
|
|
const path = (request as any).metricsPath as string | undefined;
|
|
|
|
|
if (start && path) {
|
|
|
|
|
const duration = (performance.now() - start) / 1000;
|
|
|
|
|
const method = request.method;
|
|
|
|
|
const status = set.status ?? 200;
|
|
|
|
|
httpRequestCounter.labels(method, path, String(status)).inc();
|
|
|
|
|
httpRequestDuration.labels(method, path).observe(duration);
|
|
|
|
|
}
|
|
|
|
|
httpRequestsActive.dec();
|
|
|
|
|
})
|
2026-05-22 14:26:13 +00:00
|
|
|
.use(healthRoutes)
|
|
|
|
|
.use(statusRoutes)
|
2026-05-22 15:53:48 +00:00
|
|
|
.use(authRoutes)
|
2026-05-22 14:26:13 +00:00
|
|
|
.use(diseaseRoutes)
|
|
|
|
|
.use(classificationRoutes)
|
2026-05-22 16:08:18 +00:00
|
|
|
.use(diagnosisRoutes)
|
2026-05-22 16:23:40 +00:00
|
|
|
.use(expertRoutes)
|
2026-05-22 14:26:13 +00:00
|
|
|
.use(dashboardRoutes)
|
|
|
|
|
.listen(env.port);
|
2026-05-22 12:25:41 +00:00
|
|
|
|
|
|
|
|
console.log(`ZeaVis Edu API running at http://${app.server?.hostname}:${app.server?.port}`);
|
|
|
|
|
|
|
|
|
|
export type App = typeof app;
|