150 lines
3.8 KiB
JavaScript
150 lines
3.8 KiB
JavaScript
const { getRedisClient } = require("./client")
|
|
const { recordCacheMiss } = require("./cacheMetrics.service")
|
|
|
|
const SELLERS_KEY = "data:sellers"
|
|
const SELLER_DOMAINS_KEY = "data:sellerdomains"
|
|
|
|
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
|
|
} 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
|
|
} 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
|
|
} 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
|
|
} finally {}
|
|
}
|
|
|
|
module.exports = {
|
|
getSellerById,
|
|
getSellersByIds,
|
|
getSellerIdByDomain,
|
|
setSellerInRedis,
|
|
setSellersInRedis,
|
|
setSellerDomainInRedis,
|
|
removeSellerFromRedis,
|
|
removeSellerDomainFromRedis,
|
|
listSellersFromRedis,
|
|
SELLERS_KEY,
|
|
SELLER_DOMAINS_KEY,
|
|
}
|