const { Worker } = require("bullmq") const Redis = require("ioredis") const { getRedisConnectionOptions } = require("../services/redis/connection") const TRENDING_DEAL_TTL_SECONDS = 12 * 60 * 60 const TRENDING_DEAL_LIMIT = 1000 const TRENDING_DEAL_WINDOW_DAYS = 2 // Test için burayı 30 yapıp deneyebilirsin function createRedisClient() { return new Redis(getRedisConnectionOptions()) } function parseSearchResults(results = []) { const ids = []; // i=1'den başlıyoruz (results[0] toplam sayıdır), ikişer ikişer atlıyoruz for (let i = 1; i < results.length; i += 2) { const key = results[i]; // Örn: "deals:cache:20" const value = results[i + 1]; // Örn: ["$", "[{\"id\":20,...}]"] try { // Dialect 3 formatında JSON her zaman bir array string'i olarak gelir: [0] = "$", [1] = "[{...}]" // JSON.parse(value[1])[0] diyerek direkt objeye ulaşıyoruz. const [deal] = JSON.parse(value[1]); ids.push(Number(deal.id)); } catch { // Eğer JSON'da bir sorun olursa, ID'yi key'den (deals:cache:20) güvenli bir şekilde çek const idFromKey = key.split(":")[2]; if (idFromKey) ids.push(Number(idFromKey)); } } return ids; } async function buildTrendingDealList() { const redis = createRedisClient() try { const now = Date.now() // windowMs'i tam sayıya yuvarlayalım const windowMs = Math.floor(Number(TRENDING_DEAL_WINDOW_DAYS) * 24 * 60 * 60 * 1000) const cutoffMs = now - windowMs // DEBUG: Zaman aralığını kontrol edelim console.log(`🕒 Şu an: ${new Date(now).toISOString()}`) console.log(`🕒 Cutoff (Eşik): ${new Date(cutoffMs).toISOString()}`) /** * SORGUNUN ANALİZİ: * 1. @status:{ACTIVE} -> Veritabanında 'ACTIVE' (BÜYÜK HARF) olduğundan emin ol. * 2. @createdAtTs:[${cutoffMs} +inf] -> Sayısal aralık. */ const query = `@status:{ACTIVE} @createdAtTs:[${cutoffMs} +inf]` console.log(`🔍 Redis Query: FT.SEARCH idx:deals "${query}" SORTBY score DESC DIALECT 3`) const results = await redis.call( "FT.SEARCH", "idx:deals", query, "SORTBY", "score", "DESC", "LIMIT", "0", String(TRENDING_DEAL_LIMIT), "DIALECT", "3", "RETURN", "1", "$" ) // Redis kaç tane döküman buldu? const totalFound = results[0] || 0 console.log(`📊 Redis Toplam Bulunan: ${totalFound}`) const dealIds = parseSearchResults(results) const runId = String(now) const payload = { id: runId, createdAt: new Date(now).toISOString(), total: dealIds.length, dealIds, } const key = `deals:lists:trending:${runId}` await redis.call("JSON.SET", key, "$", JSON.stringify(payload)) await redis.expire(key, TRENDING_DEAL_TTL_SECONDS) await redis.set("deals:lists:trending:latest", runId, "EX", TRENDING_DEAL_TTL_SECONDS) return { id: runId, total: dealIds.length } } catch (error) { console.error("❌ buildTrendingDealList Hatası:", error.message) throw error } finally { redis.disconnect() } } async function handler() { return buildTrendingDealList() } function startTrendingDealListWorker() { const worker = new Worker("trendingdeal-list", handler, { connection: getRedisConnectionOptions(), concurrency: 1, }) worker.on("completed", (job) => { console.log(`✅ Trending Deal Listesi Bitti. Bulunan ID Sayısı: ${job.returnvalue?.total}`) }) worker.on("failed", (job, err) => { console.error(`❌ Trending Deal Worker Hatası!`, err.message) }) return worker } module.exports = { startTrendingDealListWorker }