feat/parapharmacy-baby-products #31

Open
Ichitux wants to merge 24 commits from feat/parapharmacy-baby-products into main
Showing only changes of commit 452a835b64 - Show all commits
+27 -2
View File
@@ -3,8 +3,10 @@ import redisClient from './redis-client.js';
const OFF_API_BASE = 'https://world.openfoodfacts.org';
const CACHE_TTL = 3600;
const MAX_RETRIES = 2;
const RETRY_DELAY_MS = 1000;
// Open Food Facts authentication (optional, improves rate limits)
// Open Food Facts authentication (required for reliable access)
const OFF_USERNAME = process.env.OFF_USERNAME;
const OFF_PASSWORD = process.env.OFF_PASSWORD;
@@ -18,6 +20,10 @@ function getOffAuth() {
return null;
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export function transformOFFProduct(offProduct) {
if (!offProduct || !offProduct._id || !offProduct.product_name) {
return null;
@@ -68,6 +74,10 @@ export async function searchBabyProducts(query) {
console.log(`Fetching from OFF API: ${searchTerm}`);
const auth = getOffAuth();
let lastError;
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
try {
const response = await axios.get(`${OFF_API_BASE}/cgi/search.pl`, {
params: {
search_terms: searchTerm,
@@ -83,7 +93,11 @@ export async function searchBabyProducts(query) {
// Check if response is actually JSON (OFF sometimes returns HTML on error)
if (typeof response.data === 'string' || !response.data.products) {
console.warn(`[OFF] Invalid response for "${searchTerm}": API may be down`);
console.warn(`[OFF] Invalid response for "${searchTerm}" (attempt ${attempt + 1}): API may be down`);
if (attempt < MAX_RETRIES) {
await sleep(RETRY_DELAY_MS * (attempt + 1));
continue;
}
return [];
}
@@ -103,6 +117,17 @@ export async function searchBabyProducts(query) {
console.log(`[OFF] No products found for "${searchTerm}", not caching empty result`);
}
return products;
} catch (err) {
lastError = err;
console.warn(`[OFF] Request failed for "${searchTerm}" (attempt ${attempt + 1}): ${err.message}`);
if (attempt < MAX_RETRIES) {
await sleep(RETRY_DELAY_MS * (attempt + 1));
}
}
}
console.error(`[OFF] All retries failed for "${searchTerm}": ${lastError?.message}`);
return [];
} catch (error) {
console.error('Error searching baby products from OFF:', error.message);
return [];