HotTRDealsBackend/services/redis/badgeCache.service.js
2026-02-07 22:42:02 +00:00

78 lines
1.7 KiB
JavaScript

const { getRedisClient } = require("./client")
const badgeDb = require("../../db/badge.db")
const BADGES_KEY = "data:badges"
function createRedisClient() {
return getRedisClient()
}
function normalizeBadge(badge) {
if (!badge?.id) return null
return {
id: badge.id,
name: badge.name,
iconUrl: badge.iconUrl ?? null,
description: badge.description ?? null,
}
}
async function setBadgesInRedis(badges = []) {
const items = (Array.isArray(badges) ? badges : [])
.map(normalizeBadge)
.filter(Boolean)
if (!items.length) return 0
const redis = createRedisClient()
try {
const pipeline = redis.pipeline()
items.forEach((badge) => {
pipeline.hset(BADGES_KEY, String(badge.id), JSON.stringify(badge))
})
await pipeline.exec()
return items.length
} finally {}
}
async function setBadgeInRedis(badge) {
const payload = normalizeBadge(badge)
if (!payload) return false
await setBadgesInRedis([payload])
return true
}
async function getBadgesFromRedis() {
const redis = createRedisClient()
try {
const raw = await redis.hvals(BADGES_KEY)
if (!raw?.length) return []
const badges = []
raw.forEach((item) => {
try {
const parsed = JSON.parse(item)
if (parsed?.id) badges.push(parsed)
} catch {
return
}
})
return badges
} catch {
return []
} finally {}
}
async function ensureBadgesCached() {
const cached = await getBadgesFromRedis()
if (cached.length) return cached
const badges = await badgeDb.listBadges()
if (badges.length) await setBadgesInRedis(badges)
return badges
}
module.exports = {
BADGES_KEY,
getBadgesFromRedis,
setBadgesInRedis,
setBadgeInRedis,
ensureBadgesCached,
}