summaryrefslogtreecommitdiff
path: root/app/api/table/materials/infinite/route.ts
blob: c4be1d0e3907c6e6686c9e174d2515bdccf80987 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// app/api/table/materials/infinite/route.ts
import { NextRequest, NextResponse } from "next/server";
import { getMaterialsInfinite, type GetMaterialsInfiniteInput } from "@/lib/material/services";

// URL 파라미터를 GetMaterialsInfiniteInput으로 변환하는 헬퍼 함수
function parseUrlParamsToInfiniteInput(searchParams: URLSearchParams): GetMaterialsInfiniteInput {
  
  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: "createdAt", desc: true }];
  const sortParam = searchParams.get("sort");
  if (sortParam) {
    try {
      sort = JSON.parse(sortParam);
    } catch (e) {
      console.warn("Invalid sort parameter:", e);
      // 기본 정렬
      sort = [{ id: "createdAt", desc: true }];
    }
  } else {
    // 정렬이 없으면 기본 정렬
    sort = [{ id: "createdAt", desc: true }];
  }

  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("=== Materials Infinite API ===");
    console.log("Raw searchParams:", Object.fromEntries(searchParams.entries()));

    // URL 파라미터 파싱
    const input = parseUrlParamsToInfiniteInput(searchParams);
    console.log("Parsed input:", input);

    // 데이터 조회
    const result = await getMaterialsInfinite(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("Materials infinite API error:", error);
    return NextResponse.json(
      { 
        error: "Internal server error",
        items: [],
        hasNextPage: false,
        nextCursor: null,
        total: 0,
      },
      { status: 500 }
    );
  }
}