52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
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<QueueRemoveBody>(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);
|
|
}
|
|
}
|