83 lines
2.5 KiB
JavaScript
83 lines
2.5 KiB
JavaScript
const { Worker } = require("bullmq")
|
|
const { connection } = require("../jobs/dealClassification.queue")
|
|
const { classifyDeal } = require("../services/dealClassification.service")
|
|
const { getDealFromRedis, updateDealInRedis } = require("../services/redis/dealCache.service")
|
|
const { queueDealAiReviewUpdate } = require("../services/redis/dbSync.service")
|
|
const { getSellerById } = require("../services/redis/sellerCache.service")
|
|
const dealDB = require("../db/deal.db")
|
|
|
|
async function handler(job) {
|
|
const { dealId } = job.data
|
|
if (!dealId) throw new Error("dealId missing")
|
|
|
|
let deal = await getDealFromRedis(Number(dealId))
|
|
if (!deal) {
|
|
deal = await dealDB.findDeal(
|
|
{ id: Number(dealId) },
|
|
{
|
|
select: {
|
|
id: true,
|
|
title: true,
|
|
description: true,
|
|
url: true,
|
|
seller: { select: { name: true } },
|
|
customSeller: true,
|
|
sellerId: true,
|
|
},
|
|
}
|
|
)
|
|
}
|
|
if (!deal) throw new Error(`Deal not found: ${dealId}`)
|
|
|
|
let sellerName = deal?.seller?.name ?? null
|
|
if (!sellerName && deal?.sellerId) {
|
|
const seller = await getSellerById(Number(deal.sellerId))
|
|
sellerName = seller?.name ?? null
|
|
}
|
|
if (!sellerName && deal?.customSeller) sellerName = deal.customSeller
|
|
|
|
const ai = await classifyDeal({
|
|
title: deal.title,
|
|
description: deal.description,
|
|
url: deal.url,
|
|
seller: sellerName,
|
|
})
|
|
|
|
const aiReview = {
|
|
bestCategoryId: ai.best_category_id,
|
|
tags: ai.tags || [],
|
|
needsReview: ai.needs_review,
|
|
hasIssue: ai.has_issue,
|
|
issueReason: ai.issue_reason,
|
|
issueType: ai.issue_type,
|
|
}
|
|
|
|
await updateDealInRedis(deal.id, { aiReview }, { updatedAt: new Date() })
|
|
queueDealAiReviewUpdate({
|
|
dealId: deal.id,
|
|
data: aiReview,
|
|
updatedAt: new Date().toISOString(),
|
|
}).catch((err) => console.error("DB sync deal aiReview failed:", err?.message || err))
|
|
|
|
// İstersen auto-set (şimdilik dursun, id mismatch riskini biliyorsun)
|
|
// if (!ai.needs_review && !ai.has_issue) {
|
|
// await dealDB.updateDealById(deal.id, { categoryId: ai.best_category_id })
|
|
// }
|
|
|
|
return { ok: true }
|
|
}
|
|
|
|
function startDealClassificationWorker() {
|
|
const worker = new Worker("deal-classification", handler, {
|
|
connection,
|
|
concurrency: 5,
|
|
})
|
|
|
|
worker.on("completed", (job) => console.log("✅ job completed", job.id))
|
|
worker.on("failed", (job, err) => console.error("❌ job failed", job?.id, err?.message))
|
|
|
|
return worker
|
|
}
|
|
|
|
module.exports = { startDealClassificationWorker }
|