import Elysia, { t } from "elysia"; import Swagger from "@elysiajs/swagger"; import html from "./index.html"; import { apiAuth } from "./server/middlewares/apiAuth"; import Auth from "./server/routes/auth_route"; import ApiKeyRoute from "./server/routes/apikey_route"; import type { User } from "generated/prisma"; import { LandingPage } from "./Landing"; import { renderToReadableStream } from "react-dom/server"; import { cors } from "@elysiajs/cors"; import packageJson from "./../package.json"; import Configs from "./server/routes/configs_route"; import { prisma } from "./server/lib/prisma"; const PORT = process.env.PORT || 3000; const Docs = new Elysia().use( Swagger({ path: "/docs", specPath: "/spec", exclude: ["/docs", "/spec"], documentation: { info: { title: packageJson.name, version: packageJson.version, description: "API documentation for " + packageJson.name, contact: { name: "Malik Kurosaki", email: "kurosakiblackangel@gmail.com", url: "https://github.com/malikkurosaki", }, license: { name: "MIT", url: "https://github.com/malikkurosaki/" + packageJson.name + "/blob/main/LICENSE", }, }, servers: [ { url: process.env.BASE_URL || "http://localhost:3000", description: process.env.BASE_URL ? "Production server" : "Local development server", }, ], }, }), ); const ApiUser = new Elysia({ prefix: "/user", }).get( "/find", (ctx) => { const { user } = ctx as any; return { user: user as User, }; }, { detail: { description: "Get the current user information", summary: "Retrieve authenticated user details", tags: ["User"], }, }, ); const Api = new Elysia({ prefix: "/api", }) .use(Configs) .use(apiAuth) .use(ApiKeyRoute) .use(ApiUser); const app = new Elysia() .use(cors()) .use(Api) .use(Docs) .use(Auth) .get("/get-allow-register", async () => { const configs = await prisma.configs.findUnique({ where: { id: "1" } }) return { allowRegister: configs?.allowRegister } }, { detail: { description: "Get allow register", summary: "get allow register", }, }) .get( "/assets/:name", (ctx) => { try { const file = Bun.file(`public/${encodeURIComponent(ctx.params.name)}`); return new Response(file); } catch (error) { return new Response("File not found", { status: 404 }); } }, { detail: { description: "Serve static asset files", summary: "Get a static asset by name", tags: ["Static Assets"], }, }, ) .get( "/", async () => { const stream = await renderToReadableStream(); return new Response(stream, { headers: { "Content-Type": "text/html" }, }); }, { detail: { description: "Landing page for " + packageJson.name, summary: "Get the main landing page", tags: ["General"], }, }, ) .get("/*", html) .listen(PORT, () => { console.log(`Server running at http://localhost:${PORT}`); }); export type ServerApp = typeof app;