feat: add POST /api/performance/:id/report endpoint

This commit is contained in:
2026-04-27 15:34:17 +08:00
parent b94c29da61
commit 27cd5e3321
3 changed files with 64 additions and 0 deletions
+2
View File
@@ -13,6 +13,7 @@ import {
performanceSubmitRoutes,
commentsRoutes,
savedGamesRoutes,
reportRoutes,
} from "@/lib/api"
import { steamSearchRoutes } from "@/lib/api/steam-search"
import { searchUnifiedRoutes } from "@/lib/api/search-unified"
@@ -65,6 +66,7 @@ export const app = new Elysia({ prefix: "/api" })
.use(performanceRoutes)
.use(performanceVerifyRoutes)
.use(performanceSubmitRoutes)
.use(reportRoutes)
// Comments
.use(commentsRoutes)
// Steam search proxy
+1
View File
@@ -8,3 +8,4 @@ export { commentsRoutes } from "./comments"
export { gameStatsRoutes } from "./game-stats"
export { hardwareStatsRoutes } from "./hardware-stats"
export { savedGamesRoutes } from "./saved-games"
export { reportRoutes } from "./reports"
+61
View File
@@ -0,0 +1,61 @@
import { Elysia, t } from "elysia"
import { db } from "@/lib/db/index"
import { reports } from "@/lib/db/schema"
import { eq, and } from "drizzle-orm"
import { requireRole } from "@/lib/auth/guard"
export const reportRoutes = new Elysia({ prefix: "/performance" }).post(
"/:id/report",
async ({ params, body, request, set }) => {
const guard = await requireRole(request.headers, [
"user",
"contributor",
"admin",
])
if (!guard.ok) {
set.status = guard.status
return { error: guard.error }
}
// Check if user already reported this entry
const [existing] = await db
.select()
.from(reports)
.where(
and(
eq(reports.entryId, params.id),
eq(reports.reporterId, guard.user.id),
),
)
.limit(1)
if (existing) {
set.status = 409
return { error: "You have already reported this entry" }
}
const [created] = await db
.insert(reports)
.values({
entryId: params.id,
reporterId: guard.user.id,
reason: body.reason,
details: body.details ?? null,
})
.returning()
return created
},
{
params: t.Object({ id: t.String() }),
body: t.Object({
reason: t.Union([
t.Literal("inaccurate"),
t.Literal("spam"),
t.Literal("inappropriate"),
t.Literal("other"),
]),
details: t.Optional(t.String()),
}),
},
)