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

101 lines
3.2 KiB
JavaScript

const express = require("express")
const requireAuth = require("../middleware/requireAuth.js")
const requireNotRestricted = require("../middleware/requireNotRestricted")
const optionalAuth = require("../middleware/optionalAuth")
const { validate } = require("../middleware/validate.middleware")
const { endpoints } = require("@shared/contracts")
const { createComment, deleteComment } = require("../services/comment.service")
const { enqueueAuditFromRequest, buildAuditMeta } = require("../services/audit.service")
const { AUDIT_ACTIONS } = require("../services/auditActions")
const dealCommentAdapter = require("../adapters/responses/comment.adapter")
const commentService = require("../services/comment.service")
const router = express.Router()
const { comments } = endpoints
router.get(
"/:dealId",
optionalAuth,
validate(comments.commentListRequestSchema, "params", "validatedDealId"),
async (req, res) => {
try {
const { dealId } = req.validatedDealId
const { parentId, page, limit, sort } = req.query
const payload = await commentService.getCommentsByDealId(dealId, {
parentId,
page,
limit,
sort,
viewer: req.auth ? { userId: req.auth.userId } : null,
})
const mapped = dealCommentAdapter.mapCommentsToDealCommentResponse(payload.results)
res.json(
comments.commentListResponseSchema.parse({
page: payload.page,
total: payload.total,
totalPages: payload.totalPages,
results: mapped,
})
)
} catch (err) {
res.status(400).json({ error: err.message })
}
}
)
router.post(
"/",
requireAuth,
requireNotRestricted({ checkMute: true, checkSuspend: true }),
validate(comments.commentCreateRequestSchema, "body", "validatedCommentPayload"),
async (req, res) => {
try {
const { dealId, text, parentId } = req.validatedCommentPayload
const userId = req.auth.userId
const comment = await createComment({ dealId, userId, text, parentId })
const mapped = dealCommentAdapter.mapCommentToDealCommentResponse(comment)
enqueueAuditFromRequest(
req,
AUDIT_ACTIONS.COMMENT.CREATE,
buildAuditMeta({
entityType: "COMMENT",
entityId: comment.id,
extra: { dealId, parentId: parentId ?? null },
})
)
res.json(comments.commentCreateResponseSchema.parse(mapped))
} catch (err) {
res.status(500).json({ error: err.message || "Sunucu hatasi" })
}
}
)
router.delete(
"/:id",
requireAuth,
validate(comments.commentDeleteRequestSchema, "params", "validatedDeleteComment"),
async (req, res) => {
try {
const { id } = req.validatedDeleteComment
const result = await deleteComment(id, req.auth.userId)
enqueueAuditFromRequest(
req,
AUDIT_ACTIONS.COMMENT.DELETE,
buildAuditMeta({
entityType: "COMMENT",
entityId: Number(id),
})
)
res.json(comments.commentDeleteResponseSchema.parse(result))
} catch (err) {
const status = err.message?.includes("yetkin") ? 403 : 404
res.status(status).json({ error: err.message })
}
}
)
module.exports = router