import cors from "@elysia/cors"; import openapi from "@elysia/openapi"; import config from "@stealth-developers/config"; import { getUser } from "@stealth-developers/db"; import { Elysia, t } from "elysia"; import { authPlugin } from "./lib/auth"; import { getLinkedActors } from "./lib/db"; import { sanitiseActors, sanitiseUser } from "./lib/sanitise"; import { ActorWithGuildSchema, ErrorSchema, UserSchema } from "./lib/schemas"; import * as routes from "./routes"; const app = new Elysia() .use(openapi()) .use(cors()) .use(authPlugin) .onError(({ error, set, request }) => { set.status = 500; console.error(request.url, error); if (error instanceof Error) return { message: error.message ?? "Internal Server Error" }; return { message: "Unknown Error" }; }) .use(routes.authRoutes) .group("/api", (app) => app .resolve(({ session, status }) => { if (!session) return status(401, { message: "unauthorized" }); return { session }; }) .get( "/me", async ({ session }) => { const [user, actors] = await Promise.all([ getUser(session.userId), getLinkedActors(session.userId), ]); return { user: user ? sanitiseUser(user) : null, actors: sanitiseActors(actors, false), }; }, { response: { 200: t.Object({ user: t.Nullable(UserSchema), actors: t.Array(ActorWithGuildSchema), }), 401: ErrorSchema, 500: ErrorSchema, }, tags: ["auth"], }, ) .use(routes.guildRoutes), ) .listen(config.api.port); console.log(`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`); export type App = typeof app; export * from "./lib/schemas";