feat(api): implement product caching mechanism
- Add NODE_ENV=production to .env for environment configuration - Enhance product API route with JSON cache manager for local storage and retrieval - Introduce cache-only mode and detailed logging for better performance and offline support - Update UI to display cache status and storage statistics
This commit is contained in:
1 parent
bddf19e5c8
commit
c173fec668
19 files changed
+9240
-175
No files matched your search
@@ -1,4 +1,5 @@
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
import { jsonCacheManager } from "@/lib/jsonCacheManager";
|
||||
|
||||
const USER_AGENT = "NutriScan/1.0 (https://nutriscan.com.br)";
|
||||
|
||||
@@ -7,6 +8,8 @@ export async function GET(
|
||||
{ params }: { params: { barcode: string } }
|
||||
) {
|
||||
const { barcode } = params;
|
||||
const searchParams = request.nextUrl.searchParams;
|
||||
const cacheOnly = searchParams.get("cache_only") === "true";
|
||||
|
||||
// Validar código de barras
|
||||
const cleanBarcode = barcode.replace(/\D/g, "");
|
||||
@@ -18,6 +21,36 @@ export async function GET(
|
||||
}
|
||||
|
||||
try {
|
||||
console.log(`[API] Iniciando busca de produto: ${cleanBarcode}`);
|
||||
|
||||
// Primeiro, buscar no cache JSON
|
||||
console.log(`[API] Buscando produto ${cleanBarcode} no cache JSON...`);
|
||||
const localProduct = await jsonCacheManager.getProductByCode(cleanBarcode);
|
||||
|
||||
if (localProduct) {
|
||||
console.log(`Produto ${cleanBarcode} encontrado no cache JSON`);
|
||||
return NextResponse.json({
|
||||
...localProduct,
|
||||
fromCache: true,
|
||||
fromAPI: false,
|
||||
});
|
||||
}
|
||||
|
||||
// Se modo cache-only, retornar 404 se não encontrar no cache
|
||||
if (cacheOnly || process.env.NEXT_PUBLIC_CACHE_ONLY_MODE === "true") {
|
||||
console.log(
|
||||
`[Cache-Only Mode] Produto ${cleanBarcode} não encontrado no cache JSON`
|
||||
);
|
||||
return NextResponse.json(
|
||||
{ error: "Produto não encontrado no cache JSON" },
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
// Se não encontrou no cache JSON, buscar na API externa
|
||||
console.log(
|
||||
`Produto ${cleanBarcode} não encontrado no cache JSON, buscando na API externa...`
|
||||
);
|
||||
const response = await fetch(
|
||||
`https://world.openfoodfacts.org/api/v2/product/${cleanBarcode}.json`,
|
||||
{
|
||||
@@ -44,11 +77,30 @@ export async function GET(
|
||||
);
|
||||
}
|
||||
|
||||
return NextResponse.json(data.product);
|
||||
// Salvar produto no cache JSON
|
||||
if (data.product) {
|
||||
console.log(`Salvando produto ${cleanBarcode} no cache JSON...`);
|
||||
const saveResult = await jsonCacheManager.saveProduct(data.product);
|
||||
if (saveResult) {
|
||||
console.log(`Produto ${cleanBarcode} salvo no cache JSON com sucesso`);
|
||||
} else {
|
||||
console.log(`Falha ao salvar produto ${cleanBarcode} no cache JSON`);
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.json({
|
||||
...data.product,
|
||||
fromCache: false,
|
||||
fromAPI: true,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Erro ao buscar produto:", error);
|
||||
console.error("[API] Erro ao buscar produto:", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Erro ao buscar produto" },
|
||||
{
|
||||
error: "Erro interno do servidor",
|
||||
fromCache: false,
|
||||
fromAPI: false,
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user