import type { CommonProductItem, CommonResource } from '@prisma/client'; export type ProductMediaDto = { mainImageUrl: string | null; carouselUrls: string[]; detailImageUrls: string[]; }; type ProductWithCover = CommonProductItem & { coverResource?: { url: string } | null; }; function urlsFromResources(resources: CommonResource[], bizType: 'CAROUSEL' | 'DETAIL') { return resources .filter((r) => r.bizType === bizType && r.url) .sort((a, b) => a.sortOrder - b.sortOrder) .map((r) => r.url); } export function mapProductMedia( product: ProductWithCover, extraResources: CommonResource[] = [], ): ProductMediaDto { const mainImageUrl = product.coverResource?.url ?? null; const carouselFromDb = urlsFromResources(extraResources, 'CAROUSEL'); const detailFromDb = urlsFromResources(extraResources, 'DETAIL'); const detailFromJson = parseDetailContentImages(product.detailContent); const carouselUrls = carouselFromDb.length > 0 ? carouselFromDb : mainImageUrl ? [mainImageUrl] : []; const detailImageUrls = detailFromDb.length > 0 ? detailFromDb : detailFromJson; return { mainImageUrl, carouselUrls, detailImageUrls }; } function parseDetailContentImages(detailContent: unknown): string[] { if (!detailContent || typeof detailContent !== 'object') return []; const record = detailContent as Record; const images = record.images ?? record.detailImages ?? record.detailImageUrls; if (!Array.isArray(images)) return []; return images.filter((item): item is string => typeof item === 'string' && item.length > 0); } export function groupResourcesByProductId(resources: CommonResource[]) { const map = new Map(); for (const resource of resources) { const key = resource.ownerId.toString(); const list = map.get(key) ?? []; list.push(resource); map.set(key, list); } return map; }