import { NextResponse } from 'next/server'; import { isChzzkOAuthConfigured } from '@/lib/auth/mode'; import { createOAuthState, OAUTH_STATE_COOKIE, authCookieOptions, } from '@/lib/auth/session'; import { buildChzzkLoginUrl } from '@/lib/chzzk/oauth'; export const runtime = 'nodejs'; /** * 치지직 로그인 시작. * 쿼리로 치즈 설정을 넘기면 콜백에서 바로 룸 입장에 사용한다. */ export async function GET(request: Request) { if (!isChzzkOAuthConfigured()) { return NextResponse.json( { error: '치지직 OAuth가 설정되지 않았습니다. CHZZK_CLIENT_ID / CHZZK_CLIENT_SECRET / CHZZK_REDIRECT_URI 를 확인해 주세요.', }, { status: 503 }, ); } const url = new URL(request.url); const cheesePerDice = Number(url.searchParams.get('cheesePerDice') || 1000); const multiplyByCheese = url.searchParams.get('multiplyByCheese') !== '0'; const maxMultiplier = Number(url.searchParams.get('maxMultiplier') || 0); const resetDiceQueue = url.searchParams.get('resetDiceQueue') === '1'; const { state, sealed } = createOAuthState({ cheesePerDice: Number.isFinite(cheesePerDice) ? cheesePerDice : 1000, multiplyByCheese, maxMultiplier: Number.isFinite(maxMultiplier) ? maxMultiplier : 0, resetDiceQueue, }); const res = NextResponse.redirect(buildChzzkLoginUrl(state)); res.cookies.set(OAUTH_STATE_COOKIE, sealed, { ...authCookieOptions(600), maxAge: 600, }); return res; }