import { NextResponse } from "next/server"; import { Redis } from "@/lib/Redis"; import { Logger } from "@/lib/Logger"; import { requireSession } from "@/lib/api"; interface DiscordGuild { id: string; name: string; icon: string | null; owner: boolean; permissions: string; } export async function GET() { const sessionResult = await requireSession(); if (!sessionResult.ok) return sessionResult.response; const accessToken = sessionResult.session.accessToken; if (!accessToken) { return NextResponse.json({ success: false, error: "Discord 액세스 토큰이 없습니다." }, { status: 401 }); } try { // 1. 디스코드 API에서 유저가 속한 서버 목록 가져오기 const userGuildsRes = await fetch("https://discord.com/api/users/@me/guilds", { headers: { Authorization: `Bearer ${accessToken}` }, }); if (!userGuildsRes.ok) { Logger.warn(`Discord guilds API ${userGuildsRes.status} ${userGuildsRes.statusText}`); return NextResponse.json( { success: false, error: "Discord 서버 목록을 가져오지 못했습니다." }, { status: 502 }, ); } const userGuildsRaw: unknown = await userGuildsRes.json(); const userGuilds: DiscordGuild[] = Array.isArray(userGuildsRaw) ? (userGuildsRaw as DiscordGuild[]) : []; // 2. Redis에서 봇이 속한 서버 목록(화이트리스트) 가져오기 const botGuildsData = await Redis.get("bot-guilds"); let botGuildIds: string[] = []; if (botGuildsData) { try { const parsed = JSON.parse(botGuildsData); if (Array.isArray(parsed)) botGuildIds = parsed.filter((v): v is string => typeof v === "string"); } catch { Logger.warn("Redis bot-guilds JSON 파싱 실패"); } } // 3. 🌟 두 목록을 비교해서 봇이 있는 서버만 필터링! const filteredGuilds = userGuilds.filter((guild) => botGuildIds.includes(guild.id)); return NextResponse.json(filteredGuilds); } catch (error) { Logger.error(`서버 필터링 에러: ${error instanceof Error ? error.message : String(error)}`); return NextResponse.json({ success: false, error: "서버 목록을 가져오지 못했습니다." }, { status: 500 }); } }