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

85 lines
2.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const badgeDb = require("../db/badge.db")
const userBadgeDb = require("../db/userBadge.db")
const userDb = require("../db/user.db")
function assertPositiveInt(value, name) {
const num = Number(value)
if (!Number.isInteger(num) || num <= 0) throw new Error(`Geçersiz ${name}.`)
return num
}
function normalizeOptionalString(value) {
if (value === undefined) return undefined
if (value === null) return null
const trimmed = String(value).trim()
return trimmed ? trimmed : null
}
async function listBadges() {
return badgeDb.listBadges()
}
async function createBadge({ name, iconUrl, description }) {
const normalizedName = String(name || "").trim()
if (!normalizedName) throw new Error("Badge adı zorunlu.")
return badgeDb.createBadge({
name: normalizedName,
iconUrl: normalizeOptionalString(iconUrl),
description: normalizeOptionalString(description),
})
}
async function updateBadge(badgeId, { name, iconUrl, description }) {
const id = assertPositiveInt(badgeId, "badgeId")
const data = {}
if (name !== undefined) {
const normalizedName = String(name || "").trim()
if (!normalizedName) throw new Error("Badge adı zorunlu.")
data.name = normalizedName
}
if (iconUrl !== undefined) data.iconUrl = normalizeOptionalString(iconUrl)
if (description !== undefined) data.description = normalizeOptionalString(description)
if (!Object.keys(data).length) throw new Error("Güncellenecek alan yok.")
return badgeDb.updateBadge({ id }, data)
}
async function assignBadgeToUser({ userId, badgeId, earnedAt }) {
const uid = assertPositiveInt(userId, "userId")
const bid = assertPositiveInt(badgeId, "badgeId")
const earnedAtDate = earnedAt ? new Date(earnedAt) : new Date()
if (Number.isNaN(earnedAtDate.getTime())) throw new Error("Geçersiz kazanılma tarihi.")
const [user, badge] = await Promise.all([
userDb.findUser({ id: uid }, { select: { id: true } }),
badgeDb.findBadge({ id: bid }, { select: { id: true } }),
])
if (!user) throw new Error("Kullanıcı bulunamadı.")
if (!badge) throw new Error("Badge bulunamadı.")
return userBadgeDb.createUserBadge({
userId: uid,
badgeId: bid,
earnedAt: earnedAtDate,
})
}
async function removeBadgeFromUser({ userId, badgeId }) {
const uid = assertPositiveInt(userId, "userId")
const bid = assertPositiveInt(badgeId, "badgeId")
return userBadgeDb.deleteUserBadge({
userId_badgeId: { userId: uid, badgeId: bid },
})
}
module.exports = {
listBadges,
createBadge,
updateBadge,
assignBadgeToUser,
removeBadgeFromUser,
}