// app/api/table/material-groups/infinite/route.ts import { NextRequest, NextResponse } from "next/server"; import { getMaterialGroupsInfinite, type GetMaterialGroupsInfiniteInput } from "@/lib/material-groups/services"; // URL 파라미터를 GetMaterialGroupsInfiniteInput으로 변환하는 헬퍼 함수 function parseUrlParamsToInfiniteInput(searchParams: URLSearchParams): GetMaterialGroupsInfiniteInput { const cursor = searchParams.get("cursor") || undefined; const limit = parseInt(searchParams.get("limit") || "50"); // 고급 필터링 관련 const search = searchParams.get("search") || ""; const joinOperator = searchParams.get("joinOperator") || "and"; // 필터 파라미터 파싱 let filters: any[] = []; const filtersParam = searchParams.get("filters"); if (filtersParam) { try { filters = JSON.parse(filtersParam); } catch (e) { console.warn("Invalid filters parameter:", e); filters = []; } } // 정렬 파라미터 파싱 let sort: Array<{ id: string; desc: boolean }> = [{ id: "materialGroupCode", desc: false }]; const sortParam = searchParams.get("sort"); if (sortParam) { try { sort = JSON.parse(sortParam); } catch (e) { console.warn("Invalid sort parameter:", e); // 기본 정렬 sort = [{ id: "materialGroupCode", desc: false }]; } } else { // 정렬이 없으면 기본 정렬 sort = [{ id: "materialGroupCode", desc: false }]; } return { // 무한 스크롤 관련 limit, // 고급 필터링 search, filters, joinOperator: joinOperator as "and" | "or", // 정렬 sort, }; } export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); console.log("=== Material Groups Infinite API ==="); console.log("Raw searchParams:", Object.fromEntries(searchParams.entries())); // URL 파라미터 파싱 const input = parseUrlParamsToInfiniteInput(searchParams); console.log("Parsed input:", input); // 데이터 조회 const result = await getMaterialGroupsInfinite(input); console.log("Query result count:", result.data.length); // 응답 구성 const response = { items: result.data, hasNextPage: false, // 무한 스크롤에서는 모든 데이터를 한번에 로드 nextCursor: null, total: result.data.length, }; return NextResponse.json(response); } catch (error) { console.error("Material Groups infinite API error:", error); return NextResponse.json( { error: "Internal server error", items: [], hasNextPage: false, nextCursor: null, total: 0, }, { status: 500 } ); } }