HotTRDealsBackend/routes/user.routes.js
2026-02-04 06:39:10 +00:00

111 lines
3.5 KiB
JavaScript

// routes/user.js
const express = require("express")
const router = express.Router()
const { validate } = require("../middleware/validate.middleware")
const optionalAuth = require("../middleware/optionalAuth")
const userService = require("../services/user.service")
const userProfileAdapter = require("../adapters/responses/userProfile.adapter")
const commentAdapter = require("../adapters/responses/comment.adapter")
const { mapPaginatedDealsToDealCardResponse } = require("../adapters/responses/dealCard.adapter")
const { endpoints } = require("@shared/contracts")
const {
getUserProfileFromRedis,
setUserProfileInRedis,
} = require("../services/redis/userProfileCache.service")
const { users } = endpoints
const PROFILE_PAGE_SIZE = 15
const PROFILE_CACHE_TTL_SECONDS = 60
function parsePage(value) {
const num = Number(value)
if (!Number.isInteger(num) || num < 1) return 1
return num
}
router.get(
"/:userName",
validate(users.userProfileRequestSchema, "params", "validatedUserProfile"),
async (req, res) => {
try {
const { userName } = req.validatedUserProfile
const cached = await getUserProfileFromRedis(userName)
if (cached) return res.json(cached)
const data = await userService.getUserProfileByUsername(userName)
const response = users.userProfileResponseSchema.parse(
userProfileAdapter.mapUserProfileToResponse(data)
)
const payload = {
...response,
dealsPagination: data.dealsPagination,
commentsPagination: data.commentsPagination,
}
await setUserProfileInRedis(userName, payload, { ttlSeconds: PROFILE_CACHE_TTL_SECONDS })
res.json(payload)
} catch (err) {
console.error(err)
const status = err.statusCode || 500
res.status(status).json({
message: err.message || "Profil bilgileri alinamadi.",
})
}
}
)
router.get(
"/:userName/comments",
validate(users.userProfileRequestSchema, "params", "validatedUserProfile"),
async (req, res) => {
try {
const { userName } = req.validatedUserProfile
const page = parsePage(req.query.page)
const payload = await userService.getUserCommentsByUsername(userName, {
page,
limit: PROFILE_PAGE_SIZE,
})
const mapped = payload.results.map(commentAdapter.mapCommentToUserCommentResponse)
res.json({
page: payload.page,
total: payload.total,
totalPages: payload.totalPages,
limit: payload.limit,
results: mapped,
})
} catch (err) {
console.error(err)
const status = err.statusCode || 500
res.status(status).json({
message: err.message || "Kullanici yorumlari alinamadi.",
})
}
}
)
router.get(
"/:userName/deals",
optionalAuth,
validate(users.userProfileRequestSchema, "params", "validatedUserProfile"),
async (req, res) => {
try {
const { userName } = req.validatedUserProfile
const page = parsePage(req.query.page)
const payload = await userService.getUserDealsByUsername(userName, {
page,
limit: PROFILE_PAGE_SIZE,
viewer: req.auth ? { userId: req.auth.userId, role: req.auth.role } : null,
})
const response = mapPaginatedDealsToDealCardResponse(payload)
res.json(response)
} catch (err) {
console.error(err)
const status = err.statusCode || 500
res.status(status).json({
message: err.message || "Kullanici deal'lari alinamadi.",
})
}
}
)
module.exports = router