96 lines
2.3 KiB
TypeScript
96 lines
2.3 KiB
TypeScript
import { Elysia } from "elysia"
|
|
import { auth } from "@/lib/auth"
|
|
import { rateLimit } from "@/lib/auth/rate-limit"
|
|
import {
|
|
healthRoutes,
|
|
userRoutes,
|
|
gamesRoutes,
|
|
gameVersionsRoutes,
|
|
hardwareRoutes,
|
|
performanceRoutes,
|
|
performanceVerifyRoutes,
|
|
presetsRoutes,
|
|
presetUpvoteRoutes,
|
|
presetSettingsRoutes,
|
|
commentsRoutes,
|
|
savedGamesRoutes,
|
|
} from "@/lib/api"
|
|
import { steamSearchRoutes } from "@/lib/api/steam-search"
|
|
import { searchUnifiedRoutes } from "@/lib/api/search-unified"
|
|
import { gameStubRoutes } from "@/lib/api/game-stub"
|
|
import { gameStatsRoutes } from "@/lib/api/game-stats"
|
|
|
|
const betterAuth = new Elysia({ name: "better-auth" })
|
|
.mount(auth.handler)
|
|
.macro({
|
|
auth: {
|
|
async resolve({ status, request: { headers } }) {
|
|
const session = await auth.api.getSession({
|
|
headers,
|
|
})
|
|
|
|
if (!session) return status(401)
|
|
|
|
return {
|
|
user: session.user,
|
|
session: session.session,
|
|
}
|
|
},
|
|
},
|
|
})
|
|
|
|
export const app = new Elysia({ prefix: "/api" })
|
|
.onError(({ code, error, set, request }) => {
|
|
console.error(
|
|
`[API Error] ${code} ${request.url}`,
|
|
error instanceof Error ? error.message : error,
|
|
)
|
|
set.status = code === "NOT_FOUND" ? 404 : 500
|
|
return {
|
|
error: code === "NOT_FOUND" ? "Not found" : "Internal server error",
|
|
}
|
|
})
|
|
.use(rateLimit(60, 100))
|
|
.use(betterAuth)
|
|
// Health
|
|
.use(healthRoutes)
|
|
// Users
|
|
.use(userRoutes)
|
|
// Games + Versions
|
|
.use(gamesRoutes)
|
|
.use(gameVersionsRoutes)
|
|
// Hardware
|
|
.use(hardwareRoutes)
|
|
// Performance
|
|
.use(performanceRoutes)
|
|
.use(performanceVerifyRoutes)
|
|
// Presets
|
|
.use(presetsRoutes)
|
|
.use(presetUpvoteRoutes)
|
|
.use(presetSettingsRoutes)
|
|
// Comments
|
|
.use(commentsRoutes)
|
|
// Steam search proxy
|
|
.use(steamSearchRoutes)
|
|
// Unified search
|
|
.use(searchUnifiedRoutes)
|
|
// Game stub creation
|
|
.use(gameStubRoutes)
|
|
// Game stats aggregation
|
|
.use(gameStatsRoutes)
|
|
// Saved games
|
|
.use(savedGamesRoutes)
|
|
// Root
|
|
.get("/", () => ({
|
|
name: "DeckyVault API",
|
|
version: "2026.0.1",
|
|
}))
|
|
|
|
export const GET = app.fetch
|
|
export const POST = app.fetch
|
|
export const PUT = app.fetch
|
|
export const DELETE = app.fetch
|
|
export const PATCH = app.fetch
|
|
|
|
export type App = typeof app
|