package com.hlab.yanalyst.service; import com.hlab.yanalyst.domain.category.CategoryService; import com.hlab.yanalyst.domain.channel.ChannelVideo; import com.hlab.yanalyst.domain.channel.ChannelVideoCurationService; import com.hlab.yanalyst.domain.publish.PublishService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 홈 대시보드용 단일 집계 — 파이프라인(수집→큐레이션→발행) 현황을 한 번에 묶어 반환한다. * 각 도메인 서비스의 집계를 조합만 한다(리포지토리 직접 접근 없음). */ @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class DashboardService { private final ChannelVideoCurationService curationService; private final CategoryService categoryService; private final PublishService publishService; public Map summary() { Map result = new LinkedHashMap<>(); result.put("pipeline", curationService.pipelineStats()); // total, byStatus, bySource, shorts, longForm result.put("categories", categoryService.distribution()); // categories[], uncategorized result.put("publish", publishService.dashboardSummary()); // byStatus, total, recent List outperformers = curationService.findOutperformers(5, BigDecimal.ONE); result.put("outperformers", outperformers); return result; } }