Files
pagodera/app/api/items/route.ts
T
2025-11-11 03:08:36 -03:00

89 lines
2.4 KiB
TypeScript

import type { NextRequest } from "next/server";
import { buildPublicItemImageUrl } from "@/lib/item-images";
import { type ItemSort, searchItems } from "@/lib/prisma/queries/items";
function parseArray(param: string | null): string[] {
if (!param) return [];
return param
.split(",")
.map((value) => value.trim())
.filter(Boolean);
}
const allowedSorts: ItemSort[] = [
"name",
"level-asc",
"level-desc",
"weight-asc",
"weight-desc",
"category",
"updated-desc",
];
export async function GET(req: NextRequest) {
try {
const { searchParams } = new URL(req.url);
const q = searchParams.get("q") || undefined;
const categories = parseArray(searchParams.get("category"));
const rarities = parseArray(searchParams.get("rarity"));
const server = searchParams.get("server") || undefined;
const sortParamRaw = (searchParams.get("sort") || "name").toLowerCase();
const sortParam = (allowedSorts.find((sort) => sort === sortParamRaw) ||
"name") as ItemSort;
const page = Number(searchParams.get("page") || "1");
const pageSize = Number(searchParams.get("pageSize") || "24");
const { items, total } = await searchItems({
q,
category: categories[0],
rarity: rarities[0],
server,
sort: sortParam,
page,
pageSize,
});
const itemsWithImage = items.map((item) => {
const img = (item.image_url || item.image_local_path || "").toString();
if (/^https?:\/\//i.test(img)) {
return { ...item, image_url: img, image: img };
}
if (img.startsWith("data/")) {
return {
...item,
image_url: img,
image: `/api/images?path=${encodeURIComponent(img)}`,
};
}
const category = item.category || "other";
return {
...item,
image_url: item.image_url,
image: buildPublicItemImageUrl(category, img),
};
});
const totalPages = Math.max(1, Math.ceil(total / Math.max(1, pageSize)));
return Response.json(
{
items: itemsWithImage,
page,
pageSize,
total,
totalPages,
sort: sortParam,
},
{ status: 200 },
);
} catch (error: any) {
console.error("[api/items] Erro:", error?.message, error?.stack);
return Response.json(
{
error: "Falha ao consultar itens",
message: error?.message || "Erro desconhecido",
},
{ status: 500 },
);
}
}