fix: cache JSON concorrente, validação do sync e timeout nas chamadas ao Open Food Facts
- JsonCacheManager: a leitura inicial concorrente carregava o arquivo duas vezes e a segunda descartava as alterações da primeira; gravações simultâneas escreviam no mesmo arquivo. Agora a leitura é compartilhada e a gravação é enfileirada, via arquivo temporário + rename. - POST /api/cache/sync: aceitava qualquer objeto e usava code como chave do cache (inclusive ausente ou não numérico); agora só grava produtos com code numérico e conta os demais em failed. JSON malformado responde 400 em vez de 500. - GET /api/products/[barcode]: resposta da API sem product virava 200 com corpo vazio; agora responde 404. - Chamadas ao Open Food Facts (busca e produto) passam a ter timeout de 15 s e o User-Agent vem de um único lugar (lib/offSearch).
This commit is contained in:
1 parent
5ee5dcd893
commit
30d7ef701f
7 files changed
+273
-30
No files matched your search
@@ -11,6 +11,8 @@ export const OFF_USER_AGENT = "NutriScan/1.0 (https://nutriscan.com.br)";
|
||||
export const OFF_MAX_PAGE_SIZE = 1000;
|
||||
/** Pausa entre páginas consecutivas, para respeitar o limite de uso da API. */
|
||||
export const OFF_RATE_LIMIT_MS = 200;
|
||||
/** Tempo máximo de espera por página da API. */
|
||||
export const OFF_TIMEOUT_MS = 15000;
|
||||
|
||||
const FIELDS = [
|
||||
"code",
|
||||
@@ -138,6 +140,7 @@ async function fetchOffPage(
|
||||
|
||||
const response = await deps.fetchFn(`${OFF_SEARCH_URL}?${pageParams.toString()}`, {
|
||||
headers: { "User-Agent": OFF_USER_AGENT, Accept: "application/json" },
|
||||
signal: AbortSignal.timeout(OFF_TIMEOUT_MS),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
|
||||
Reference in new issue
Block a user