HotTRDealsBackend/services/commentLike.service.js
2026-02-04 06:39:10 +00:00

62 lines
2.0 KiB
JavaScript

const { updateCommentLikeInRedisByDeal } = require("./redis/commentCache.service")
const { queueCommentLikeUpdate } = require("./redis/dbSync.service")
const { getDealIdByCommentId, getOrCacheDeal } = require("./redis/dealCache.service")
const commentDB = require("../db/comment.db")
function parseLike(value) {
if (typeof value === "boolean") return value
if (typeof value === "number") return value === 1
if (typeof value === "string") {
const normalized = value.trim().toLowerCase()
if (["true", "1", "yes"].includes(normalized)) return true
if (["false", "0", "no"].includes(normalized)) return false
}
return null
}
async function setCommentLike({ commentId, userId, like }) {
const cid = Number(commentId)
if (!Number.isInteger(cid) || cid <= 0) throw new Error("Gecersiz commentId.")
const shouldLike = parseLike(like)
if (shouldLike === null) throw new Error("Gecersiz like.")
let dealId = await getDealIdByCommentId(cid)
if (!dealId) {
const fallback = await commentDB.findComment(
{ id: cid },
{ select: { id: true, dealId: true, deletedAt: true } }
)
if (!fallback || fallback.deletedAt) throw new Error("Yorum bulunamadi.")
dealId = fallback.dealId
}
const deal = await getOrCacheDeal(dealId, { ttlSeconds: 15 * 60 })
if (!deal) throw new Error("Deal bulunamadi.")
if (deal.status !== "ACTIVE" && deal.status !== "EXPIRED") {
throw new Error("Bu deal icin yorum begenisi acilamaz.")
}
const redisResult = await updateCommentLikeInRedisByDeal({
dealId,
commentId: cid,
userId,
like: shouldLike,
}).catch((err) => {
console.error("Redis comment like update failed:", err?.message || err)
return { liked: shouldLike, delta: 0, likeCount: 0 }
})
queueCommentLikeUpdate({
commentId: cid,
userId,
like: shouldLike,
createdAt: new Date().toISOString(),
}).catch((err) => console.error("DB sync commentLike queue failed:", err?.message || err))
return redisResult
}
module.exports = {
setCommentLike,
}