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

158 lines
3.9 KiB
JavaScript

const { getRedisClient } = require("./client")
const { recordCacheMiss } = require("./cacheMetrics.service")
const SELLERS_KEY = "data:sellers"
const SELLER_DOMAINS_KEY = "data:seller:domains"
function createRedisClient() {
return getRedisClient()
}
function normalizeIds(ids = []) {
return Array.from(
new Set(
(Array.isArray(ids) ? ids : [])
.map((id) => Number(id))
.filter((id) => Number.isInteger(id) && id > 0)
)
)
}
async function getSellerById(id) {
const sellerId = Number(id)
if (!Number.isInteger(sellerId) || sellerId <= 0) return null
const redis = createRedisClient()
try {
const raw = await redis.hget(SELLERS_KEY, String(sellerId))
if (!raw) {
await recordCacheMiss({ key: `${SELLERS_KEY}:${sellerId}`, label: "seller" })
}
return raw ? JSON.parse(raw) : null
} catch {
return null
} finally {}
}
async function getSellersByIds(ids = []) {
const normalized = normalizeIds(ids)
if (!normalized.length) return new Map()
const redis = createRedisClient()
try {
const raw = await redis.hmget(SELLERS_KEY, normalized.map(String))
const map = new Map()
raw.forEach((item, idx) => {
if (!item) return
try {
const seller = JSON.parse(item)
map.set(normalized[idx], seller)
} catch {
return
}
})
return map
} catch {
return new Map()
} finally {}
}
async function getSellerIdByDomain(domain) {
const normalized = String(domain || "").trim().toLowerCase()
if (!normalized) return null
const redis = createRedisClient()
try {
const raw = await redis.hget(SELLER_DOMAINS_KEY, normalized)
if (!raw) {
await recordCacheMiss({ key: `${SELLER_DOMAINS_KEY}:${normalized}`, label: "seller-domain" })
}
const id = raw ? Number(raw) : null
return Number.isInteger(id) && id > 0 ? id : null
} catch {
return null
} finally {}
}
async function setSellersInRedis(sellers = []) {
const list = Array.isArray(sellers) ? sellers : []
if (!list.length) return 0
const redis = createRedisClient()
try {
const pipeline = redis.pipeline()
list.forEach((seller) => {
if (!seller?.id) return
pipeline.hset(SELLERS_KEY, String(seller.id), JSON.stringify(seller))
})
await pipeline.exec()
return list.length
} finally {}
}
async function setSellerInRedis(seller) {
if (!seller?.id) return false
await setSellersInRedis([seller])
return true
}
async function setSellerDomainInRedis(domain, sellerId) {
const normalized = String(domain || "").trim().toLowerCase()
const id = Number(sellerId)
if (!normalized || !Number.isInteger(id) || id <= 0) return false
const redis = createRedisClient()
try {
await redis.hset(SELLER_DOMAINS_KEY, normalized, String(id))
return true
} finally {}
}
async function removeSellerFromRedis(sellerId) {
const id = Number(sellerId)
if (!Number.isInteger(id) || id <= 0) return 0
const redis = createRedisClient()
try {
await redis.hdel(SELLERS_KEY, String(id))
return 1
} finally {}
}
async function removeSellerDomainFromRedis(domain) {
const normalized = String(domain || "").trim().toLowerCase()
if (!normalized) return 0
const redis = createRedisClient()
try {
await redis.hdel(SELLER_DOMAINS_KEY, normalized)
return 1
} finally {}
}
async function listSellersFromRedis() {
const redis = createRedisClient()
try {
const raw = await redis.hgetall(SELLERS_KEY)
const list = []
for (const value of Object.values(raw || {})) {
try {
const parsed = JSON.parse(value)
if (parsed && parsed.id) list.push(parsed)
} catch {
continue
}
}
return list
} catch {
return []
} finally {}
}
module.exports = {
getSellerById,
getSellersByIds,
getSellerIdByDomain,
setSellerInRedis,
setSellersInRedis,
setSellerDomainInRedis,
removeSellerFromRedis,
removeSellerDomainFromRedis,
listSellersFromRedis,
SELLERS_KEY,
SELLER_DOMAINS_KEY,
}