diff --git a/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanJpa.java b/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanJpa.java index ce461cc3..a9c339e0 100644 --- a/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanJpa.java +++ b/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanJpa.java @@ -22,6 +22,13 @@ public BusinessPlan getOrThrow(Long id) { ); } + @Override + public BusinessPlan getOrThrowWithAllSubSections(Long id) { + return businessPlanRepository.findByIdWithAllSubSections(id).orElseThrow( + () -> new BusinessPlanException(BusinessPlanErrorType.BUSINESS_PLAN_NOT_FOUND) + ); + } + @Override public BusinessPlan save(BusinessPlan businessPlan) { return businessPlanRepository.save(businessPlan); diff --git a/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanRepository.java b/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanRepository.java index 10beb7a6..390e4653 100644 --- a/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanRepository.java +++ b/src/main/java/starlight/adapter/businessplan/persistence/BusinessPlanRepository.java @@ -16,10 +16,33 @@ public interface BusinessPlanRepository extends JpaRepository findById(Long id); @Query(""" - SELECT bp - FROM BusinessPlan bp - WHERE bp.memberId = :memberId - ORDER BY COALESCE(bp.modifiedAt, bp.createdAt) DESC, bp.id DESC - """) + SELECT bp + FROM BusinessPlan bp + WHERE bp.memberId = :memberId + ORDER BY COALESCE(bp.modifiedAt, bp.createdAt) DESC, bp.id DESC + """) Page findAllByMemberIdOrderedByLastSavedAt(@Param("memberId") Long memberId, Pageable pageable); + + @Query(""" + SELECT DISTINCT bp + FROM BusinessPlan bp + LEFT JOIN FETCH bp.overview o + LEFT JOIN FETCH o.overviewBasic + LEFT JOIN FETCH bp.problemRecognition pr + LEFT JOIN FETCH pr.problemBackground + LEFT JOIN FETCH pr.problemPurpose + LEFT JOIN FETCH pr.problemMarket + LEFT JOIN FETCH bp.feasibility f + LEFT JOIN FETCH f.feasibilityStrategy + LEFT JOIN FETCH f.feasibilityMarket + LEFT JOIN FETCH bp.growthTactic gt + LEFT JOIN FETCH gt.growthModel + LEFT JOIN FETCH gt.growthFunding + LEFT JOIN FETCH gt.growthEntry + LEFT JOIN FETCH bp.teamCompetence tc + LEFT JOIN FETCH tc.teamFounder + LEFT JOIN FETCH tc.teamMembers + WHERE bp.id = :id + """) + Optional findByIdWithAllSubSections(@Param("id") Long id); } diff --git a/src/main/java/starlight/application/businessplan/BusinessPlanServiceImpl.java b/src/main/java/starlight/application/businessplan/BusinessPlanServiceImpl.java index ba5247fa..b7d5a4ce 100644 --- a/src/main/java/starlight/application/businessplan/BusinessPlanServiceImpl.java +++ b/src/main/java/starlight/application/businessplan/BusinessPlanServiceImpl.java @@ -72,7 +72,10 @@ public BusinessPlanResponse.Result getBusinessPlanInfo(Long planId, Long memberI @Override @Transactional(readOnly = true) public BusinessPlanResponse.Detail getBusinessPlanDetail(Long planId, Long memberId) { - BusinessPlan plan = getOwnedBusinessPlanOrThrow(planId, memberId); + BusinessPlan plan = businessPlanQuery.getOrThrowWithAllSubSections(planId); + if (!plan.isOwnedBy(memberId)) { + throw new BusinessPlanException(BusinessPlanErrorType.UNAUTHORIZED_ACCESS); + } List subSectionDetailList = Arrays.stream(SubSectionType.values()) .map(type -> getSectionByPlanAndType(plan, type.getSectionType()).getSubSectionByType(type)) diff --git a/src/main/java/starlight/application/businessplan/required/BusinessPlanQuery.java b/src/main/java/starlight/application/businessplan/required/BusinessPlanQuery.java index 1fe30fa9..785cc04c 100644 --- a/src/main/java/starlight/application/businessplan/required/BusinessPlanQuery.java +++ b/src/main/java/starlight/application/businessplan/required/BusinessPlanQuery.java @@ -8,6 +8,8 @@ public interface BusinessPlanQuery { BusinessPlan getOrThrow(Long id); + BusinessPlan getOrThrowWithAllSubSections(Long id); + BusinessPlan save(BusinessPlan businessPlan); void delete(BusinessPlan businessPlan); diff --git a/src/test/java/starlight/application/businessplan/BusinessPlanServiceImplUnitTest.java b/src/test/java/starlight/application/businessplan/BusinessPlanServiceImplUnitTest.java index 4c579585..2507c705 100644 --- a/src/test/java/starlight/application/businessplan/BusinessPlanServiceImplUnitTest.java +++ b/src/test/java/starlight/application/businessplan/BusinessPlanServiceImplUnitTest.java @@ -337,7 +337,7 @@ void getBusinessPlanSubSections_returnsExistingSubSectionList() { List.of(false, false, false, false, false)); plan.getProblemRecognition().putSubSection(problem); - when(businessPlanQuery.getOrThrow(1L)).thenReturn(plan); + when(businessPlanQuery.getOrThrowWithAllSubSections(1L)).thenReturn(plan); BusinessPlanResponse.Detail detail = sut.getBusinessPlanDetail(1L, 10L); @@ -355,7 +355,7 @@ void getBusinessPlanSubSections_returnsExistingSubSectionList() { void getBusinessPlanDetail_unauthorized_throws() { BusinessPlan plan = mock(BusinessPlan.class); when(plan.isOwnedBy(10L)).thenReturn(false); - when(businessPlanQuery.getOrThrow(1L)).thenReturn(plan); + when(businessPlanQuery.getOrThrowWithAllSubSections(1L)).thenReturn(plan); org.junit.jupiter.api.Assertions.assertThrows(BusinessPlanException.class, () -> sut.getBusinessPlanDetail(1L, 10L));