Initialer Versionstand des eBay Trackers

This commit is contained in:
2026-08-01 00:37:02 +00:00
commit af754182fa
12 changed files with 1878 additions and 0 deletions

86
src/ebayService.js Normal file
View File

@@ -0,0 +1,86 @@
import axios from 'axios';
import { getEbayToken } from './ebayAuth.js';
// Hilfsfunktion: Aufteilen eines Arrays in kleinere Häppchen (Chunks)
function chunkArray(array, chunkSize) {
const chunks = [];
for (let i = 0; i < array.length; i += chunkSize) {
chunks.push(array.slice(i, i + chunkSize));
}
return chunks;
}
/**
* Durchsucht eBay nach ALLEN Whitelist-Verkäufern in der Datenbank
*/
export async function searchEbayProducts(query, allowedSellers = [], negativeKeywords = []) {
if (!allowedSellers || allowedSellers.length === 0) {
console.log('⚠️ Keine Verkäufer in der Whitelist hinterlegt.');
return [];
}
try {
const token = await getEbayToken();
// 1. Verkäufernamen bereinigen
const validSellers = allowedSellers
.map(s => String(s).trim())
.filter(Boolean);
if (validSellers.length === 0) return [];
// 2. Verkäufer in 25er-Pakete aufteilen
const sellerBatches = chunkArray(validSellers, 25);
let allRawItems = [];
// 3. Jedes 25er-Paket nacheinander bei eBay abfragen
for (const batch of sellerBatches) {
const formattedSellers = batch.map(s => encodeURIComponent(s)).join('|');
const sellerFilterString = `sellers:{${formattedSellers}}`;
const response = await axios.get('https://api.ebay.com/buy/browse/v1/item_summary/search', {
headers: {
'Authorization': `Bearer ${token}`,
'X-EBAY-C-MARKETPLACE-ID': 'EBAY-DE'
},
params: {
q: query,
filter: sellerFilterString,
limit: 50,
sort: 'newlyListed'
}
});
const items = response.data.itemSummaries || [];
allRawItems = allRawItems.concat(items);
}
// 4. Duplikate über die itemId entfernen
const uniqueItemsMap = new Map();
for (const item of allRawItems) {
uniqueItemsMap.set(item.itemId, item);
}
const uniqueItems = Array.from(uniqueItemsMap.values());
// 5. Negativ-Keywords lokal ausfiltern
const filteredItems = uniqueItems.filter(item => {
const titleLower = item.title.toLowerCase();
return !negativeKeywords.some(kw => titleLower.includes(kw.toLowerCase().trim()));
});
return filteredItems.map(item => ({
itemId: item.itemId,
title: item.title,
price: item.price?.value,
currency: item.price?.currency || 'EUR',
sellerUsername: item.seller?.username || 'Unbekannt',
itemUrl: item.itemWebUrl,
imageUrl: item.image?.imageUrl || null
}));
} catch (error) {
const apiError = error.response?.data?.errors?.[0]?.message || error.message;
console.error(`❌ Fehler bei der eBay-Suche für "${query}":`, apiError);
return [];
}
}