188 lines
4.2 KiB
JavaScript
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,
|
|
}
|