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