60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
// services/user.service.js
|
||
const userDB = require("../db/user.db")
|
||
const dealDB = require("../db/deal.db")
|
||
const commentDB = require("../db/comment.db")
|
||
const dealService = require("./deal.service")
|
||
|
||
async function getUserProfileByUsername(userName) {
|
||
const username = String(userName).trim()
|
||
if (!username) throw new Error("username zorunlu")
|
||
|
||
const user = await userDB.findUser(
|
||
{ username },
|
||
{ select: { id: true, username: true, email: true, avatarUrl: true, createdAt: true } }
|
||
)
|
||
|
||
if (!user) {
|
||
const err = new Error("Kullanıcı bulunamadı.")
|
||
err.statusCode = 404
|
||
throw err
|
||
}
|
||
|
||
const [dealAgg, totalComments, comments] = await Promise.all([
|
||
dealDB.aggregateDeals({ userId: user.id }),
|
||
commentDB.countComments({ userId: user.id }),
|
||
commentDB.findComments(
|
||
{ userId: user.id },
|
||
{
|
||
orderBy: { createdAt: "desc" },
|
||
take: 20,
|
||
include: {
|
||
user: { select: { id: true, username: true, avatarUrl: true } },
|
||
deal: { select: { id: true, title: true } },
|
||
},
|
||
}
|
||
),
|
||
])
|
||
|
||
const userDeals = await dealService.getDeals({
|
||
preset: "USER_PUBLIC",
|
||
targetUserId: user.id,
|
||
viewer: null,
|
||
page: 1,
|
||
limit: 20,
|
||
})
|
||
|
||
const totalDeals = dealAgg?._count?._all ?? 0
|
||
const stats = {
|
||
totalLikes: dealAgg?._sum?.score ?? 0,
|
||
totalComments: totalComments ?? 0,
|
||
totalShares: totalDeals,
|
||
totalDeals,
|
||
}
|
||
|
||
|
||
return { user, stats, deals: userDeals.results, comments }
|
||
|
||
}
|
||
|
||
module.exports = { getUserProfileByUsername }
|