import { NextResponse } from "next/server"; import { Logger } from "@/lib/Logger"; import { botRpc, errorResponse, readJsonBody, requireNumber, requireSession, requireString, } from "@/lib/api"; interface QueueRemoveBody { serverId?: unknown; index?: unknown; encoded?: unknown; } export async function POST(request: Request) { try { const sessionResult = await requireSession(); if (!sessionResult.ok) return sessionResult.response; const userId = sessionResult.session.user.id; const bodyResult = await readJsonBody(request); if (!bodyResult.ok) return bodyResult.response; const serverIdResult = requireString(bodyResult.data.serverId, "serverId"); if (!serverIdResult.ok) return serverIdResult.response; // index 0 도 정상값 const indexResult = requireNumber(bodyResult.data.index, "index", { min: 0, integer: true }); if (!indexResult.ok) return indexResult.response; const { status, body } = await botRpc({ channel: "queue:remove", payload: { action: "queue_remove", serverId: serverIdResult.value, userId, index: indexResult.value, // 인덱스-트랙 일치 검증용(봇이 대상 encoded 불일치 시 거절). 문자열일 때만 전달. encoded: typeof bodyResult.data.encoded === "string" ? bodyResult.data.encoded : undefined, }, timeoutMs: 5000, }); return NextResponse.json(body, { status }); } catch (error) { Logger.error(`queue/remove API error: ${error instanceof Error ? error.message : String(error)}`); return errorResponse("서버 오류가 발생했습니다.", 500); } }