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, }