204 lines
4.9 KiB
JavaScript
204 lines
4.9 KiB
JavaScript
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
|
||
}
|