HotTRDealsBackend/adapters/responses/dealDetail.adapter.js
2026-01-25 17:50:56 +00:00

123 lines
3.3 KiB
JavaScript

// adapters/responses/dealDetail.adapter.js
const {mapBreadcrumbToResponse} =require( "./breadCrumb.adapter")
const formatDateAsString = (value) =>
value instanceof Date ? value.toISOString() : value ?? null
const requiredIsoString = (value, fieldName) => {
if (value instanceof Date) return value.toISOString()
if (typeof value === "string" && value.length) return value
throw new Error(`${fieldName} is missing (undefined/null)`)
}
function mapNoticeToResponse(notice) {
if (!notice) return null
return {
id: notice.id,
title: notice.title,
dealId: notice.dealId,
body: notice.body ?? null,
severity: notice.severity,
isActive: notice.isActive,
createdBy: notice.createdBy,
createdAt: requiredIsoString(notice.createdAt, "notice.createdAt"),
updatedAt: requiredIsoString(notice.updatedAt, "notice.updatedAt"),
}
}
// minimal similardeal -> response
function mapSimilarDealItem(d) {
if (!d) return null
return {
id: d.id,
title: d.title,
price: d.price ?? null,
score: Number.isFinite(d.score) ? d.score : 0,
imageUrl: d.imageUrl || "",
sellerName: d.sellerName || "Bilinmiyor",
createdAt: formatDateAsString(d.createdAt), // SimilarDealSchema: nullable OK
// url: d.url ?? null,
}
}
function mapDealToDealDetailResponse(deal) {
if (!deal) return null
const firstNotice = Array.isArray(deal.notices) ? deal.notices[0] : null
if (!deal.user) throw new Error("deal.user is missing (include user in query)")
return {
id: deal.id,
title: deal.title,
description: deal.description || "",
url: deal.url ?? null,
price: deal.price ?? null,
score: Number.isFinite(deal.score) ? deal.score : 0,
commentsCount: deal._count?.comments ?? 0,
status: deal.status,
saleType: deal.saletype, // ✅ FIX: saletype değil
affiliateType: deal.affiliateType,
createdAt: requiredIsoString(deal.createdAt, "deal.createdAt"),
updatedAt: requiredIsoString(deal.updatedAt, "deal.updatedAt"),
user: {
id: deal.user.id,
username: deal.user.username,
avatarUrl: deal.user.avatarUrl ?? null,
},
// ✅ FIX: SellerSummarySchema genelde id ister -> custom seller için -1
seller: deal.seller
? {
id: deal.seller.id,
name: deal.seller.name,
url: deal.seller.url ?? null,
}
: {
id: -1,
name: deal.customSeller || "Bilinmiyor",
url: null,
},
images: (deal.images || []).map((img) => ({
id: img.id,
imageUrl: img.imageUrl,
order: img.order,
})),
comments: (deal.comments || []).map((comment) => {
if (!comment.user)
throw new Error("comment.user is missing (include comments.user in query)")
return {
id: comment.id,
text: comment.text,
createdAt: requiredIsoString(comment.createdAt, "comment.createdAt"),
user: {
id: comment.user.id,
username: comment.user.username,
avatarUrl: comment.user.avatarUrl ?? null,
},
}
}),
breadcrumb: mapBreadcrumbToResponse(deal.breadcrumb),
notice: mapNoticeToResponse(firstNotice),
similarDeals: Array.isArray(deal.similarDeals)
? deal.similarDeals.map(mapSimilarDealItem).filter(Boolean)
: [],
}
}
module.exports = {
mapDealToDealDetailResponse,
}