feat: gate destructive moderation endpoints to moderator+ role

This commit is contained in:
2026-05-16 17:09:07 +08:00
parent 23bbfc0317
commit 92d16273d7
4 changed files with 15 additions and 17 deletions
+4 -7
View File
@@ -6,16 +6,13 @@ import {
user, user,
} from "@/lib/db/schema" } from "@/lib/db/schema"
import { eq, desc, sql, and, ilike } from "drizzle-orm" import { eq, desc, sql, and, ilike } from "drizzle-orm"
import { import { requireModeratorOrAdmin } from "@/lib/auth/guard"
requireContributorOrAdmin,
requireAdmin,
} from "@/lib/auth/guard"
export const adminCommentRoutes = new Elysia({ prefix: "/admin", detail: { tags: ["Admin"] } }) export const adminCommentRoutes = new Elysia({ prefix: "/admin", detail: { tags: ["Admin"] } })
.get( .get(
"/comments", "/comments",
async ({ query, request, set }) => { async ({ query, request, set }) => {
const guard = await requireContributorOrAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -95,7 +92,7 @@ export const adminCommentRoutes = new Elysia({ prefix: "/admin", detail: { tags:
.patch( .patch(
"/comments/:id/remove", "/comments/:id/remove",
async ({ params, request, set }) => { async ({ params, request, set }) => {
const guard = await requireAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -130,7 +127,7 @@ export const adminCommentRoutes = new Elysia({ prefix: "/admin", detail: { tags:
.patch( .patch(
"/comments/:id/restore", "/comments/:id/restore",
async ({ params, request, set }) => { async ({ params, request, set }) => {
const guard = await requireAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
+4 -3
View File
@@ -12,6 +12,7 @@ import { fuzzySearchTerm } from "@/lib/db/search"
import { import {
requireContributorOrAdmin, requireContributorOrAdmin,
requireAdmin, requireAdmin,
requireModeratorOrAdmin,
} from "@/lib/auth/guard" } from "@/lib/auth/guard"
export const adminPerformanceRoutes = new Elysia({ prefix: "/admin", detail: { tags: ["Admin"] } }) export const adminPerformanceRoutes = new Elysia({ prefix: "/admin", detail: { tags: ["Admin"] } })
@@ -188,7 +189,7 @@ export const adminPerformanceRoutes = new Elysia({ prefix: "/admin", detail: { t
.patch( .patch(
"/performance/:id/remove", "/performance/:id/remove",
async ({ params, body, request, set }) => { async ({ params, body, request, set }) => {
const guard = await requireAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -229,7 +230,7 @@ export const adminPerformanceRoutes = new Elysia({ prefix: "/admin", detail: { t
.delete( .delete(
"/performance/:id/hard-delete", "/performance/:id/hard-delete",
async ({ params, request, set }) => { async ({ params, request, set }) => {
const guard = await requireAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -259,7 +260,7 @@ export const adminPerformanceRoutes = new Elysia({ prefix: "/admin", detail: { t
.patch( .patch(
"/performance/:id/restore", "/performance/:id/restore",
async ({ params, request, set }) => { async ({ params, request, set }) => {
const guard = await requireAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
+3 -3
View File
@@ -8,13 +8,13 @@ import {
user, user,
} from "@/lib/db/schema" } from "@/lib/db/schema"
import { eq, desc, sql, and, inArray } from "drizzle-orm" import { eq, desc, sql, and, inArray } from "drizzle-orm"
import { requireContributorOrAdmin } from "@/lib/auth/guard" import { requireModeratorOrAdmin } from "@/lib/auth/guard"
export const adminReportRoutes = new Elysia({ prefix: "/admin", detail: { tags: ["Admin"] } }) export const adminReportRoutes = new Elysia({ prefix: "/admin", detail: { tags: ["Admin"] } })
.get( .get(
"/reports", "/reports",
async ({ query, request, set }) => { async ({ query, request, set }) => {
const guard = await requireContributorOrAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -144,7 +144,7 @@ export const adminReportRoutes = new Elysia({ prefix: "/admin", detail: { tags:
.patch( .patch(
"/reports/:id/status", "/reports/:id/status",
async ({ params, body, request, set }) => { async ({ params, body, request, set }) => {
const guard = await requireContributorOrAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
+4 -4
View File
@@ -2,7 +2,7 @@ import { Elysia, t } from "elysia"
import { db } from "@/lib/db/index" import { db } from "@/lib/db/index"
import { communitySuggestions, games, user, suggestionStatusEnum } from "@/lib/db/schema" import { communitySuggestions, games, user, suggestionStatusEnum } from "@/lib/db/schema"
import { eq, and, desc, sql, ilike } from "drizzle-orm" import { eq, and, desc, sql, ilike } from "drizzle-orm"
import { requireAuth, requireContributorOrAdmin } from "@/lib/auth/guard" import { requireAuth, requireModeratorOrAdmin } from "@/lib/auth/guard"
const DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL const DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL
@@ -65,7 +65,7 @@ export const communitySuggestionRoutes = new Elysia({
.get( .get(
"/admin", "/admin",
async ({ query, request, set }) => { async ({ query, request, set }) => {
const guard = await requireContributorOrAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -247,7 +247,7 @@ export const communitySuggestionRoutes = new Elysia({
.get( .get(
"/pending", "/pending",
async ({ request, set }) => { async ({ request, set }) => {
const guard = await requireContributorOrAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }
@@ -280,7 +280,7 @@ export const communitySuggestionRoutes = new Elysia({
.patch( .patch(
"/:suggestionId/review", "/:suggestionId/review",
async ({ params, body, request, set }) => { async ({ params, body, request, set }) => {
const guard = await requireContributorOrAdmin(request.headers) const guard = await requireModeratorOrAdmin(request.headers)
if (!guard.ok) { if (!guard.ok) {
set.status = guard.status set.status = guard.status
return { error: guard.error } return { error: guard.error }