HotTRDealsBackend/services/deal/deal.service.js
2026-01-20 12:16:14 +00:00

188 lines
4.2 KiB
JavaScript

const dealDB = require("../../db/deal.db")
const { mapDealToDealCardResponse } = require("../../adapters/responses/dealCard.adapter")
const { mapDealToDealDetailResponse } = require("../../adapters/responses/dealDetail.adapter")
const {
findCompanyFromLink,
} = require("../seller/seller.service")
async function searchDeals(query, page = 1, limit = 10) {
const skip = (page - 1) * limit
const where = {
OR: [
{ title: { contains: query, mode: "insensitive" } },
{ description: { contains: query, mode: "insensitive" } },
],
}
const [deals, total] = await Promise.all([
dealDB.findDeals(where, {
skip,
take: limit,
orderBy: { createdAt: "desc" },
include: {
company:{select:{name:true}},
user: { select: {id:true,username: true } },
images: {
orderBy: { order: "asc" },
take: 1,
select: { imageUrl: true },
},
},
}),
dealDB.countDeals(where),
])
return {
page,
total,
totalPages: Math.ceil(total / limit),
results: deals.map(mapDealToDealCardResponse),
}
}
async function getAllDeals(page = 1, limit = 10) {
const skip = (page - 1) * limit
const [deals, total] = await Promise.all([
dealDB.findDeals({}, {
skip,
take: limit,
orderBy: { createdAt: "desc" },
include: {
company:{select:{name:true}},
user: { select: { id:true,username: true } },
images: {
orderBy: { order: "asc" },
take: 1,
select: { imageUrl: true },
},
},
}),
dealDB.countDeals(),
])
return {
page,
total,
totalPages: Math.ceil(total / limit),
results: deals.map(mapDealToDealCardResponse),
}
}
async function getDealById(id) {
const deal=await dealDB.findDeal(
{ id: Number(id) },
{
include: {
company:{
select: {
name:true,
url:true
},
},
user: {
select: {
id: true,
username: true,
avatarUrl: true,
},
},
company: {
select: {
id: true,
name: true,
},
},
images: {
orderBy: { order: "asc" },
select: {
id: true,
imageUrl: true,
order: true,
},
},
comments: {
orderBy: { createdAt: "desc" },
select: {
id: true,
text: true,
createdAt: true,
user: {
select: {
id: true,
username: true,
avatarUrl: true,
},
},
},
},
_count: {
select: {
comments: true,
},
},
},
}
)
return mapDealToDealDetailResponse(deal)
}
async function createDeal(dealCreateData) {
// 🔴 SADECE link varsa bak
if (dealCreateData.url) {
const company = await findCompanyFromLink(
dealCreateData.url
)
if (company) {
dealCreateData.company = {
connect: { id: company.id },
}
dealCreateData.customCompany = null
}
}
return dealDB.createDeal(dealCreateData, {
include: { images: true },
})
}
async function voteDeal(dealId, userId, voteType) {
if (!dealId || !userId || !voteType) throw new Error("Eksik veri")
const existingVote = await dealDB.findVotes({ dealId, userId })
const vote = existingVote[0]
if (vote) {
await dealDB.updateVote({ id: vote.id }, { voteType })
} else {
await dealDB.createVote({ dealId, userId, voteType })
}
const upvotes = await dealDB.countVotes({ dealId, voteType: "UP" })
const downvotes = await dealDB.countVotes({ dealId, voteType: "DOWN" })
const score = upvotes - downvotes
await dealDB.updateDeal({ id: dealId }, { score })
return score
}
async function getVotes(dealId) {
const upvotes = await dealDB.countVotes({ dealId: Number(dealId), voteType: "UP" })
const downvotes = await dealDB.countVotes({ dealId: Number(dealId), voteType: "DOWN" })
return { upvotes, downvotes, score: upvotes - downvotes }
}
module.exports = {
getAllDeals,
getDealById,
createDeal,
voteDeal,
getVotes,
searchDeals,
}