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

73 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require("express");
const categoryService = require("../services/category.service"); // Kategori servisi
const router = express.Router();
const optionalAuth = require("../middleware/optionalAuth")
const { mapCategoryToCategoryDetailsResponse }=require("../adapters/responses/categoryDetails.adapter")
const { mapDealToDealDetailResponse } = require("../adapters/responses/dealDetail.adapter")
const { mapPaginatedDealsToDealCardResponse } = require("../adapters/responses/dealCard.adapter")
const { getClientIp } = require("../utils/requestInfo")
const { queueDealImpressions } = require("../services/redis/dealAnalytics.service")
router.get("/:slug", async (req, res) => {
const { slug } = req.params; // URL parametresinden slug alıyoruz
try {
const { category, breadcrumb } = await categoryService.findCategoryBySlug(slug); // Servisten kategori ve breadcrumb bilgilerini alıyoruz
if (!category) {
return res.status(404).json({ error: "Kategori bulunamadı" });
}
const response = mapCategoryToCategoryDetailsResponse(category, breadcrumb); // Adapter ile veriyi dönüştürüyoruz
res.json(response);
} catch (err) {
res.status(500).json({ error: "Kategori detayları alınırken bir hata oluştu", message: err.message });
}
});
const buildViewer = (req) =>
req.auth ? { userId: req.auth.userId, role: req.auth.role } : null
router.get("/:slug/deals", optionalAuth, async (req, res) => {
const { slug } = req.params;
const { page = 1, limit = 10, ...filters } = req.query;
try {
const { category } = await categoryService.findCategoryBySlug(slug);
if (!category) {
return res.status(404).json({ error: "Kategori bulunamadı" });
}
// Kategorinin fırsatlarını alıyoruz
const payload = await categoryService.getDealsByCategoryId(category.id, {
page,
limit,
filters,
viewer: buildViewer(req),
});
const response = mapPaginatedDealsToDealCardResponse(payload)
const dealIds = payload?.results?.map((deal) => deal.id) || []
queueDealImpressions({
dealIds,
userId: req.auth?.userId ?? null,
ip: getClientIp(req),
}).catch((err) => console.error("Deal impression queue failed:", err?.message || err))
res.json({
page: response.page,
total: response.total,
totalPages: response.totalPages,
results: response.results,
minPrice: payload?.minPrice ?? null,
maxPrice: payload?.maxPrice ?? null,
})
} catch (err) {
res.status(500).json({ error: "Kategoriye ait fırsatlar alınırken bir hata oluştu", message: err.message });
}
});
module.exports = router;