123 lines
3.3 KiB
JavaScript
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,
|
|
}
|