111 lines
3.5 KiB
JavaScript
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
|