HotTRDealsBackend/db/deal.db.js
2026-01-25 17:50:56 +00:00

204 lines
4.9 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 prisma = require("./client")
function getDb(db) {
return db || prisma
}
const DEAL_CARD_INCLUDE = {
user: { select: { id: true, username: true, avatarUrl: true } },
seller: { select: { id: true, name: true, url: true } },
images: {
orderBy: { order: "asc" },
take: 1,
select: { imageUrl: true },
},
}
async function getDealCards({ where = {}, skip = 0, take = 10, orderBy = [{ createdAt: "desc" }] }) {
try {
// Prisma sorgusunu çalıştırıyoruz ve genelleştirilmiş formatta alıyoruz
return await prisma.deal.findMany({
where,
skip,
take,
orderBy,
include: DEAL_CARD_INCLUDE, // Her zaman bu alanları dahil ediyoruz
})
} catch (err) {
throw new Error(`Fırsatlar alınırken bir hata oluştu: ${err.message}`)
}
}
/**
* Sayfalama ve diğer parametrelerle deal'leri çeker
*
* @param {object} params - where, skip, take, orderBy parametreleri
* @returns {object} - Deal card'leri ve toplam sayıyı döner
*/
async function getPaginatedDealCards({ where = {}, page = 1, limit = 10, orderBy = [{ createdAt: "desc" }] }) {
const pagination = clampPagination({ page, limit })
// Deal card verilerini ve toplam sayıyı alıyoruz
const [deals, total] = await Promise.all([
getDealCards({
where,
skip: pagination.skip,
take: pagination.limit,
orderBy,
}),
countDeals(where), // Total count almak için
])
return {
page: pagination.page,
total,
totalPages: Math.ceil(total / pagination.limit),
results: deals, // Burada raw data döndürülüyor, map'lemiyoruz
}
}
async function findDeals(where = {}, options = {}) {
return prisma.deal.findMany({
where,
include: options.include || undefined,
select: options.select || undefined,
orderBy: options.orderBy || { createdAt: "desc" },
skip: options.skip || 0,
take: options.take || undefined,
})
}
async function findSimilarCandidatesByCategory(categoryId, excludeDealId, { take = 80 } = {}) {
const safeTake = Math.min(Math.max(Number(take) || 80, 1), 200)
return prisma.deal.findMany({
where: {
id: { not: Number(excludeDealId) },
status: "ACTIVE",
categoryId: Number(categoryId),
},
orderBy: [{ score: "desc" }, { createdAt: "desc" }],
take: safeTake,
include: {
seller: { select: { id: true, name: true, url: true } },
images: { take: 1, orderBy: { order: "asc" }, select: { imageUrl: true } },
},
})
}
async function findSimilarCandidatesBySeller(sellerId, excludeDealId, { take = 30 } = {}) {
const safeTake = Math.min(Math.max(Number(take) || 30, 1), 200)
return prisma.deal.findMany({
where: {
id: { not: Number(excludeDealId) },
status: "ACTIVE",
sellerId: Number(sellerId),
},
orderBy: [{ score: "desc" }, { createdAt: "desc" }],
take: safeTake,
include: {
seller: { select: { id: true, name: true, url: true } },
images: { take: 1, orderBy: { order: "asc" }, select: { imageUrl: true } },
},
})
}
async function findDeal(where, options = {}, db) {
const p = getDb(db)
return p.deal.findUnique({
where,
include: options.include || undefined,
select: options.select || undefined,
})
}
async function createDeal(data, options = {}) {
return prisma.deal.create({
data,
include: options.include || undefined,
select: options.select || undefined,
})
}
async function updateDeal(where, data, options = {}, db) {
const p = getDb(db)
return p.deal.update({
where,
data,
include: options.include || undefined,
select: options.select || undefined,
})
}
async function countDeals(where = {}) {
return prisma.deal.count({ where })
}
async function findVotes(where = {}, options = {}) {
return prisma.dealVote.findMany({
where,
include: options.include || undefined,
select: options.select || undefined,
})
}
async function createVote(data, options = {}) {
return prisma.dealVote.create({
data,
include: options.include || undefined,
select: options.select || undefined,
})
}
async function updateVote(where, data, options = {}) {
return prisma.dealVote.update({
where,
data,
include: options.include || undefined,
select: options.select || undefined,
})
}
async function countVotes(where = {}) {
return prisma.dealVote.count({ where })
}
async function getDealWithImages(dealId) {
return prisma.deal.findUnique({
where: { id: dealId },
include: { images: { orderBy: { order: "asc" } } },
});
}
async function aggregateDeals(where = {}, db) {
const p = getDb(db)
return p.deal.aggregate({
where,
_count: { _all: true },
_sum: { score: true },
})
}
module.exports = {
findDeals,
aggregateDeals,
getDealWithImages,
findDeal,
createDeal,
updateDeal,
countDeals,
findVotes,
createVote,
updateVote,
countVotes,
findSimilarCandidatesByCategory,
findSimilarCandidatesBySeller,
getDealCards,
getPaginatedDealCards
}