diff --git a/src/app/api/auction/route.ts b/src/app/api/auction/route.ts index 1cf66fb..5374fa2 100644 --- a/src/app/api/auction/route.ts +++ b/src/app/api/auction/route.ts @@ -15,29 +15,57 @@ export async function GET(request: Request) { const auctionItemCategory = searchParams.get("auction_item_category"); const itemName = searchParams.get("item_name"); - let url = `${NXOPEN_API_URL}/mabinogi/v1/auction/list?`; - if (auctionItemCategory) { - url += `auction_item_category=${auctionItemCategory}&`; - } - if (itemName) { - url += `item_name=${encodeURIComponent(itemName)}`; - } + let allItems: any[] = []; + let nextCursor: string | null = ""; + + try { + do { + let url = `${NXOPEN_API_URL}/mabinogi/v1/auction/list?`; + if (auctionItemCategory) { + url += `auction_item_category=${auctionItemCategory}&`; + } + if (itemName) { + url += `item_name=${encodeURIComponent(itemName)}&`; + } + if (nextCursor) { + url += `cursor=${nextCursor}`; + } + + const response = await fetch(url, { + headers: { + "Content-Type": "application/json", + "x-nxopen-api-key": NXOPEN_API_KEY || "", + }, + }); - const response = await fetch(url, { - headers: { - "Content-Type": "application/json", - "x-nxopen-api-key": NXOPEN_API_KEY || "", - }, - }); + if (!response.ok) { + console.error(await response.json()); + return NextResponse.json( + { error: "Failed to fetch data" }, + { status: 500 } + ); + } - if (!response.ok) { - console.error(await response.json()); + const data = await response.json(); + + // 결과 데이터 누적 + if (data.auction_item.length > 0) { + allItems = [...allItems, ...data.auction_item]; + } + + // 다음 페이지를 위한 cursor 업데이트 + nextCursor = data.next_cursor; + } while (nextCursor !== null); + + // 전체 데이터 반환 + return NextResponse.json({ + items: allItems, + }); + } catch (error) { + console.error("Error fetching auction data:", error); return NextResponse.json( { error: "Failed to fetch data" }, { status: 500 } ); } - - const data = await response.json(); - return NextResponse.json(data); } diff --git a/src/app/auction/page.tsx b/src/app/auction/page.tsx index 8856c30..41f610b 100644 --- a/src/app/auction/page.tsx +++ b/src/app/auction/page.tsx @@ -67,11 +67,11 @@ export default function AuctionPage() { } const data = await response.json(); - data.auction_item.sort( + data.items.sort( (a: any, b: any) => a.auction_price_per_unit - b.auction_price_per_unit ); - setFilteredItems(data.auction_item); + setFilteredItems(data.items); setErrorMessage(null); } catch (error) { console.error("API 호출 중 오류가 발생했습니다:", error); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 060de18..305358d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,13 +2,34 @@ import "@/styles/globals.css"; import { Analytics } from "@vercel/analytics/next"; import { SpeedInsights } from "@vercel/speed-insights/next"; +import { Metadata } from "next"; import Footer from "@/components/footer"; import { Providers } from "@/components/providers"; import Topbar from "@/components/topbar"; -import { metadata as defaultMetadata } from "@/constant/metadata"; -export const metadata = defaultMetadata; +export const metadata: Metadata = { + title: "마비노기 경매장 - 실시간 아이템 시세 검색 | Erinn.me", + description: + "마비노기 경매장의 실시간 아이템 시세를 검색하고 가격을 비교해보세요. 카테고리별 검색과 아이템 이름 검색을 지원합니다. 실시간 가격 정보와 아이템 옵션을 확인할 수 있습니다.", + keywords: + "마비노기, 경매장, 아이템 시세, 마비노기 경매장, 마비노기 시세, 마비노기 아이템, Erinn.me", + openGraph: { + title: "마비노기 경매장 - 실시간 아이템 시세 검색 | Erinn.me", + description: + "마비노기 경매장의 실시간 아이템 시세를 검색하고 가격을 비교해보세요. 카테고리별 검색과 아이템 이름 검색을 지원합니다.", + type: "website", + locale: "ko_KR", + siteName: "Erinn.me", + }, + robots: { + index: true, + follow: true, + }, + alternates: { + canonical: "https://erinn.me", + }, +}; export default function RootLayout({ children, @@ -16,7 +37,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( - +