62 lines
2.0 KiB
JavaScript
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,
|
|
}
|