85 lines
2.5 KiB
JavaScript
85 lines
2.5 KiB
JavaScript
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,
|
||
}
|