Files
music_bot_v2/page/src/app/api/queue/remove/route.ts

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);
}
}