feat: add POST /api/performance/:id/report endpoint
This commit is contained in:
@@ -13,6 +13,7 @@ import {
|
|||||||
performanceSubmitRoutes,
|
performanceSubmitRoutes,
|
||||||
commentsRoutes,
|
commentsRoutes,
|
||||||
savedGamesRoutes,
|
savedGamesRoutes,
|
||||||
|
reportRoutes,
|
||||||
} from "@/lib/api"
|
} from "@/lib/api"
|
||||||
import { steamSearchRoutes } from "@/lib/api/steam-search"
|
import { steamSearchRoutes } from "@/lib/api/steam-search"
|
||||||
import { searchUnifiedRoutes } from "@/lib/api/search-unified"
|
import { searchUnifiedRoutes } from "@/lib/api/search-unified"
|
||||||
@@ -65,6 +66,7 @@ export const app = new Elysia({ prefix: "/api" })
|
|||||||
.use(performanceRoutes)
|
.use(performanceRoutes)
|
||||||
.use(performanceVerifyRoutes)
|
.use(performanceVerifyRoutes)
|
||||||
.use(performanceSubmitRoutes)
|
.use(performanceSubmitRoutes)
|
||||||
|
.use(reportRoutes)
|
||||||
// Comments
|
// Comments
|
||||||
.use(commentsRoutes)
|
.use(commentsRoutes)
|
||||||
// Steam search proxy
|
// Steam search proxy
|
||||||
|
|||||||
@@ -8,3 +8,4 @@ export { commentsRoutes } from "./comments"
|
|||||||
export { gameStatsRoutes } from "./game-stats"
|
export { gameStatsRoutes } from "./game-stats"
|
||||||
export { hardwareStatsRoutes } from "./hardware-stats"
|
export { hardwareStatsRoutes } from "./hardware-stats"
|
||||||
export { savedGamesRoutes } from "./saved-games"
|
export { savedGamesRoutes } from "./saved-games"
|
||||||
|
export { reportRoutes } from "./reports"
|
||||||
|
|||||||
@@ -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()),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user