From 75f8073ff1c15e0997f726a183a5924d1ba51a36 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:22:12 +0900 Subject: [PATCH 01/21] =?UTF-8?q?#132=20refactor:=20plan=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/factory/PlanFactory.java | 19 +++++++++++++++++++ .../domain/plan/service/PlanService.java | 11 ++++------- .../domain/plan/validator/PlanValidator.java | 7 +++++++ 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java create mode 100644 src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java diff --git a/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java b/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java new file mode 100644 index 0000000..493a036 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java @@ -0,0 +1,19 @@ +package Journey.Together.domain.plan.factory; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.dto.PlanReq; +import Journey.Together.domain.plan.entity.Plan; +import org.springframework.stereotype.Component; + +@Component +public class PlanFactory { + public Plan createPlan(Member member, PlanReq planReq) { + return Plan.builder() + .member(member) + .title(planReq.title()) + .startDate(planReq.startDate()) + .endDate(planReq.endDate()) + .isPublic(false) + .build(); + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 7c4a214..b7bcd42 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -6,6 +6,7 @@ import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.entity.PlanReviewImage; +import Journey.Together.domain.plan.factory.PlanFactory; import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; @@ -46,6 +47,8 @@ public class PlanService { private final PlanReviewRepository planReviewRepository; private final PlanReviewImageRepository planReviewImageRepository; private final DisabilityPlaceCategoryRepository disabilityPlaceCategoryRepository; + + private final PlanFactory planFactory; private final S3Client s3Client; @Transactional @@ -53,13 +56,7 @@ public void savePlan(Member member, PlanReq planReq){ // Validation memberRepository.findMemberByEmailAndDeletedAtIsNull(member.getEmail()).orElseThrow(()->new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); //Buisness - Plan plan = Plan.builder() - .member(member) - .title(planReq.title()) - .startDate(planReq.startDate()) - .endDate(planReq.endDate()) - .isPublic(false) - .build(); + Plan plan = planFactory.createPlan(member,planReq); planRepository.save(plan); //날짜별 장소 정보 저장 savePlaceByDay(planReq.dailyplace(),member,plan); diff --git a/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java b/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java new file mode 100644 index 0000000..14f0c2b --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java @@ -0,0 +1,7 @@ +package Journey.Together.domain.plan.validator; + +import org.springframework.stereotype.Component; + +@Component +public class PlanValidator { +} From e4345f4d9ebe2b064016ee7c5c01f26dc8c8886c Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:27:01 +0900 Subject: [PATCH 02/21] =?UTF-8?q?#132=20refactor:=20day=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/factory/PlanFactory.java | 13 ++ .../domain/plan/service/PlanService.java | 204 +++++++++--------- 2 files changed, 114 insertions(+), 103 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java b/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java index 493a036..9d1253e 100644 --- a/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java +++ b/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java @@ -1,10 +1,14 @@ package Journey.Together.domain.plan.factory; import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.place.entity.Place; import Journey.Together.domain.plan.dto.PlanReq; +import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; import org.springframework.stereotype.Component; +import java.time.LocalDate; + @Component public class PlanFactory { public Plan createPlan(Member member, PlanReq planReq) { @@ -16,4 +20,13 @@ public Plan createPlan(Member member, PlanReq planReq) { .isPublic(false) .build(); } + + public Day createDay(Member member, Plan plan, Place place, LocalDate date) { + return Day.builder() + .member(member) + .plan(plan) + .place(place) + .date(date) + .build(); + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index b7bcd42..4003192 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -52,34 +52,35 @@ public class PlanService { private final S3Client s3Client; @Transactional - public void savePlan(Member member, PlanReq planReq){ + public void savePlan(Member member, PlanReq planReq) { // Validation - memberRepository.findMemberByEmailAndDeletedAtIsNull(member.getEmail()).orElseThrow(()->new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); + memberRepository.findMemberByEmailAndDeletedAtIsNull(member.getEmail()).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); //Buisness - Plan plan = planFactory.createPlan(member,planReq); + Plan plan = planFactory.createPlan(member, planReq); planRepository.save(plan); //날짜별 장소 정보 저장 - savePlaceByDay(planReq.dailyplace(),member,plan); + savePlaceByDay(planReq.dailyplace(), member, plan); } @Transactional - public void updatePlan(Member member,Long planId,PlanReq planReq){ + public void updatePlan(Member member, Long planId, PlanReq planReq) { // Validation - Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member,planId); - if(plan == null){ + Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); + if (plan == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } //Business - dayRepository.deleteAllByMemberAndPlan(member,plan); + dayRepository.deleteAllByMemberAndPlan(member, plan); - plan.updatePlan(planReq.title(),planReq.startDate(),planReq.endDate()); + plan.updatePlan(planReq.title(), planReq.startDate(), planReq.endDate()); planRepository.save(plan); - savePlaceByDay(planReq.dailyplace(),member,plan); + savePlaceByDay(planReq.dailyplace(), member, plan); } + @Transactional - public PlanRes findPlan(Member member,Long planId) { + public PlanRes findPlan(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); if (plan == null) { @@ -88,37 +89,37 @@ public PlanRes findPlan(Member member,Long planId) { //Buisness String image = getPlaceFirstImage(plan); //Response - return PlanRes.of(plan,image,null,null); + return PlanRes.of(plan, image, null, null); } @Transactional - public void deletePlan(Member member,Long planId){ + public void deletePlan(Member member, Long planId) { // Validation - Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member,planId); - if(plan == null){ + Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); + if (plan == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } PlanReview planReview = planReviewRepository.findPlanReviewByPlanAndDeletedAtIsNull(plan); //Buisness - dayRepository.deleteAllByMemberAndPlan(member,plan); - if(planReview!=null){ - deletePlanReview(member,planReview.getPlanReviewId()); + dayRepository.deleteAllByMemberAndPlan(member, plan); + if (planReview != null) { + deletePlanReview(member, planReview.getPlanReviewId()); } planRepository.deletePlanByPlanId(planId); } @Transactional - public PlanDetailRes findPlanDetail(Member member, Long planId){ + public PlanDetailRes findPlanDetail(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByPlanIdAndDeletedAtIsNull(planId); - if(plan == null){ + if (plan == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } //Buisness boolean isWriter; List dailyLists = new ArrayList<>(); - List dayList = dayRepository.findAllByMemberAndPlanOrderByDateAsc(plan.getMember(),plan); + List dayList = dayRepository.findAllByMemberAndPlanOrderByDateAsc(plan.getMember(), plan); List imageUrls = getPlaceImageList(plan); Map> groupedByDate = dayList.stream() @@ -145,25 +146,25 @@ public PlanDetailRes findPlanDetail(Member member, Long planId){ // 날짜 순으로 정렬 dailyLists.sort(Comparator.comparing(DailyList::getDate)); - if (member ==null){ + if (member == null) { isWriter = false; - }else { + } else { isWriter = plan.getMember().getMemberId().equals(member.getMemberId()); } - String remainDate = isBetween(plan.getStartDate(),plan.getEndDate()); + String remainDate = isBetween(plan.getStartDate(), plan.getEndDate()); //Response - return PlanDetailRes.of(imageUrls,dailyLists,isWriter,plan,remainDate); + return PlanDetailRes.of(imageUrls, dailyLists, isWriter, plan, remainDate); } @Transactional - public Boolean updatePlanIsPublic(Member member,Long planId){ + public Boolean updatePlanIsPublic(Member member, Long planId) { // Validation - Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member,planId,LocalDate.now()); - if(plan == null){ + Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); + if (plan == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } - if(!Objects.equals(plan.getMember().getMemberId(), member.getMemberId())){ + if (!Objects.equals(plan.getMember().getMemberId(), member.getMemberId())) { throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); } @@ -175,13 +176,13 @@ public Boolean updatePlanIsPublic(Member member,Long planId){ } @Transactional - public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewReq,List images){ + public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewReq, List images) { // Validation - Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member,planId,LocalDate.now()); - if(plan == null){ + Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); + if (plan == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } - if(planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan)){ + if (planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan)) { throw new ApplicationException(ErrorCode.ALREADY_EXIST_EXCEPTION); } //Business @@ -193,10 +194,10 @@ public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewR .build(); planReviewRepository.save(planReview); - if(images!=null){ - for(MultipartFile file : images){ + if (images != null) { + for (MultipartFile file : images) { String uuid = UUID.randomUUID().toString(); - String url = s3Client.upload(file,member.getProfileUuid(),uuid); + String url = s3Client.upload(file, member.getProfileUuid(), uuid); PlanReviewImage planReviewImage = PlanReviewImage.builder() .planReview(planReview) .imageUrl(url) @@ -209,32 +210,32 @@ public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewR } @Transactional - public PlanReviewRes findPlanReview(Member member,long planId){ + public PlanReviewRes findPlanReview(Member member, long planId) { // Validation Plan plan = planRepository.findPlanByPlanIdAndDeletedAtIsNull(planId); - if(plan == null){ + if (plan == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } PlanReview planReview = planReviewRepository.findPlanReview(plan); //Buisness boolean isWriter; - if (member ==null){ + if (member == null) { isWriter = false; - }else { + } else { isWriter = plan.getMember().getMemberId().equals(member.getMemberId()); } - String profileUrl = s3Client.baseUrl()+plan.getMember().getProfileUuid()+"/profile_"+plan.getMember().getProfileUuid(); - if(planReview==null){ + String profileUrl = s3Client.baseUrl() + plan.getMember().getProfileUuid() + "/profile_" + plan.getMember().getProfileUuid(); + if (planReview == null) { //리뷰가 없을 경우 - return PlanReviewRes.of(null,null,null,isWriter,false,null,profileUrl,null); - }else { + return PlanReviewRes.of(null, null, null, isWriter, false, null, profileUrl, null); + } else { List imageList = getReviewImageList(planReview); //리뷰가 있고 신고 없을 경우 - if(planReview.getReport()==null){ - return PlanReviewRes.of(planReview.getPlanReviewId(),planReview.getContent(),planReview.getGrade(),isWriter,true,imageList,profileUrl,null); + if (planReview.getReport() == null) { + return PlanReviewRes.of(planReview.getPlanReviewId(), planReview.getContent(), planReview.getGrade(), isWriter, true, imageList, profileUrl, null); } //리뷰가 있고 신고 비승인 - return PlanReviewRes.of(planReview.getPlanReviewId(),planReview.getContent(),planReview.getGrade(),isWriter,true,imageList,profileUrl,planReview.getReport()); + return PlanReviewRes.of(planReview.getPlanReviewId(), planReview.getContent(), planReview.getGrade(), isWriter, true, imageList, profileUrl, planReview.getReport()); } } @@ -243,15 +244,15 @@ public PlanReviewRes findPlanReview(Member member,long planId){ public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq updatePlanReviewReq, List images) { // Validation PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); - if(!Objects.equals(planReview.getPlan().getMember().getMemberId(), member.getMemberId())){ + if (!Objects.equals(planReview.getPlan().getMember().getMemberId(), member.getMemberId())) { throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); } //Business if (images != null) { try { - for(MultipartFile file : images) { + for (MultipartFile file : images) { String uuid = UUID.randomUUID().toString(); - String url = s3Client.upload(file,member.getProfileUuid(),uuid); + String url = s3Client.upload(file, member.getProfileUuid(), uuid); PlanReviewImage planReviewImage = PlanReviewImage.builder() .planReview(planReview) .imageUrl(url) @@ -282,15 +283,15 @@ public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq u } @Transactional - public void deletePlanReview(Member member,Long reviewId){ + public void deletePlanReview(Member member, Long reviewId) { //Vailda PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); - if(!Objects.equals(planReview.getPlan().getMember().getMemberId(), member.getMemberId())){ + if (!Objects.equals(planReview.getPlan().getMember().getMemberId(), member.getMemberId())) { throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); } List planReviewImageList = planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview); - if(planReviewImageList!=null){ - for(PlanReviewImage planReviewImage : planReviewImageList){ + if (planReviewImageList != null) { + for (PlanReviewImage planReviewImage : planReviewImageList) { String filename = planReviewImage.getImageUrl().replace(s3Client.baseUrl(), ""); s3Client.delete(filename); planReviewImageRepository.deletePlanReviewImageByPlanReviewImageId(planReviewImage.getPlanReviewImageId()); @@ -309,19 +310,19 @@ public List findMyPlans(Member member) { .limit(3) .toList(); List myPlanResList = new ArrayList<>(); - for(Plan plan : top3list){ + for (Plan plan : top3list) { String image = getPlaceFirstImage(plan); String remainDate = null; Boolean hasReview = null; - if (LocalDate.now().isAfter(plan.getEndDate())){ + if (LocalDate.now().isAfter(plan.getEndDate())) { hasReview = planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan); - }else if ((LocalDate.now().isEqual(plan.getStartDate()) || LocalDate.now().isAfter(plan.getStartDate())) && (LocalDate.now().isEqual(plan.getEndDate()) || LocalDate.now().isBefore(plan.getEndDate()))){ - remainDate="D-DAY"; - }else if (LocalDate.now().isBefore(plan.getStartDate())){ - Period period = Period.between(LocalDate.now(),plan.getStartDate()); - remainDate="D-"+period.getDays(); + } else if ((LocalDate.now().isEqual(plan.getStartDate()) || LocalDate.now().isAfter(plan.getStartDate())) && (LocalDate.now().isEqual(plan.getEndDate()) || LocalDate.now().isBefore(plan.getEndDate()))) { + remainDate = "D-DAY"; + } else if (LocalDate.now().isBefore(plan.getStartDate())) { + Period period = Period.between(LocalDate.now(), plan.getStartDate()); + remainDate = "D-" + period.getDays(); } - MyPlanRes myPlanRes = MyPlanRes.of(plan,image,remainDate,hasReview); + MyPlanRes myPlanRes = MyPlanRes.of(plan, image, remainDate, hasReview); myPlanResList.add(myPlanRes); } @@ -330,75 +331,70 @@ public List findMyPlans(Member member) { } @Transactional - public PlaceInfoPageRes searchPlace(String word, Pageable page){ + public PlaceInfoPageRes searchPlace(String word, Pageable page) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); - Page placePage = placeRepository.findAllByNameContainsOrderByCreatedAtDesc(word,pageable); + Page placePage = placeRepository.findAllByNameContainsOrderByCreatedAtDesc(word, pageable); List placeInfoList = placePage.getContent().stream() .map(PlaceInfo::of) .collect(Collectors.toList()); - return PlaceInfoPageRes.of(placeInfoList, placePage.getNumber(), placePage.getSize(), placePage.getTotalPages(), placePage.isLast(),placePage.getTotalElements()); + return PlaceInfoPageRes.of(placeInfoList, placePage.getNumber(), placePage.getSize(), placePage.getTotalPages(), placePage.isLast(), placePage.getTotalElements()); } @Transactional - public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compelete){ + public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compelete) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); Page planPage; List planResList; - if(compelete){ - planPage = planRepository.findAllByMemberAndEndDateBeforeAndDeletedAtIsNull(member,LocalDate.now(),pageable); + if (compelete) { + planPage = planRepository.findAllByMemberAndEndDateBeforeAndDeletedAtIsNull(member, LocalDate.now(), pageable); planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan,getPlaceFirstImage(plan),null,planReviewRepository.existsAllByPlanAndReportFilter(plan))) + .map(plan -> PlanRes.of(plan, getPlaceFirstImage(plan), null, planReviewRepository.existsAllByPlanAndReportFilter(plan))) .collect(Collectors.toList()); - }else { - planPage = planRepository.findAllByMemberAndEndDateGreaterThanEqualAndDeletedAtIsNull(member,LocalDate.now(),pageable); + } else { + planPage = planRepository.findAllByMemberAndEndDateGreaterThanEqualAndDeletedAtIsNull(member, LocalDate.now(), pageable); planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan,getPlaceFirstImage(plan),isBetween(plan.getStartDate(),plan.getEndDate()),null)) + .map(plan -> PlanRes.of(plan, getPlaceFirstImage(plan), isBetween(plan.getStartDate(), plan.getEndDate()), null)) .collect(Collectors.toList()); } - return PlanPageRes.of(planResList,planPage.getNumber(),planPage.getSize(),planPage.getTotalPages(),planPage.isLast()); + return PlanPageRes.of(planResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } @Transactional - public OpenPlanPageRes findOpenPlans(Pageable page){ + public OpenPlanPageRes findOpenPlans(Pageable page) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); - Page planPage = planRepository.findOpenPlans(LocalDate.now(),pageable); + Page planPage = planRepository.findOpenPlans(LocalDate.now(), pageable); List openPlanResList = planPage.getContent().stream() - .map(plan -> OpenPlanRes.of(plan, s3Client.baseUrl()+plan.getMember().getProfileUuid()+"/profile_"+plan.getMember().getProfileUuid(),getPlaceFirstImage(plan))) + .map(plan -> OpenPlanRes.of(plan, s3Client.baseUrl() + plan.getMember().getProfileUuid() + "/profile_" + plan.getMember().getProfileUuid(), getPlaceFirstImage(plan))) .collect(Collectors.toList()); - return OpenPlanPageRes.of(openPlanResList,planPage.getNumber(),planPage.getSize(),planPage.getTotalPages(),planPage.isLast()); + return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } - public void savePlaceByDay(List places, Member member,Plan plan){ - for(DailyPlace dailyPlace : places){ - for(Long placeId : dailyPlace.places()){ - Place place = placeRepository.findById(placeId).orElseThrow(()->new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); - Day day = Day.builder() - .member(member) - .plan(plan) - .place(place) - .date(dailyPlace.date()) - .build(); + public void savePlaceByDay(List places, Member member, Plan plan) { + for (DailyPlace dailyPlace : places) { + for (Long placeId : dailyPlace.places()) { + Place place = placeRepository.findById(placeId).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); + Day day = planFactory.createDay(member, plan, place, dailyPlace.date()); dayRepository.save(day); } } } - public String isBetween(LocalDate startDate,LocalDate endDate){ - if ((LocalDate.now().isEqual(startDate) || LocalDate.now().isAfter(startDate) && (LocalDate.now().isEqual(endDate) || LocalDate.now().isBefore(endDate)))){ + public String isBetween(LocalDate startDate, LocalDate endDate) { + if ((LocalDate.now().isEqual(startDate) || LocalDate.now().isAfter(startDate) && (LocalDate.now().isEqual(endDate) || LocalDate.now().isBefore(endDate)))) { return "D-DAY"; - }else if (LocalDate.now().isBefore(startDate)){ - Period period = Period.between(LocalDate.now(),startDate); - return "D-"+ period.getDays(); - } - return null; + } else if (LocalDate.now().isBefore(startDate)) { + Period period = Period.between(LocalDate.now(), startDate); + return "D-" + period.getDays(); + } + return null; } - public String getPlaceFirstImage(Plan plan){ + public String getPlaceFirstImage(Plan plan) { List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); - if(!dayList.isEmpty()){ + if (!dayList.isEmpty()) { String placeImageUrl = dayList.get(0).getPlace().getFirstImg(); - if(placeImageUrl.isEmpty()){ + if (placeImageUrl.isEmpty()) { return null; } return dayList.get(0).getPlace().getFirstImg(); @@ -406,20 +402,22 @@ public String getPlaceFirstImage(Plan plan){ return null; } - public List getPlaceImageList(Plan plan){ + public List getPlaceImageList(Plan plan) { List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); List list = new ArrayList<>(); - if(!dayList.isEmpty()){ - dayList.forEach(day ->{list.add(day.getPlace().getFirstImg());}); - return list; + if (!dayList.isEmpty()) { + dayList.forEach(day -> { + list.add(day.getPlace().getFirstImg()); + }); + return list; } return null; } - public List getReviewImageList(PlanReview planReview){ + public List getReviewImageList(PlanReview planReview) { List list = new ArrayList<>(); List planReviewImageList = planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview); - for(PlanReviewImage planReviewImage : planReviewImageList){ + for (PlanReviewImage planReviewImage : planReviewImageList) { list.add(planReviewImage.getImageUrl()); } return list; From 17bea400f3f95492202096e5dce23345e6a01f34 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:35:07 +0900 Subject: [PATCH 03/21] =?UTF-8?q?#132=20refactor:=20savePlacesByDay?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C,=20PlanPlaceService=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/service/PlanPlaceService.java | 35 +++++++++++++++++++ .../domain/plan/service/PlanService.java | 15 ++------ 2 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java b/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java new file mode 100644 index 0000000..bdde204 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java @@ -0,0 +1,35 @@ +package Journey.Together.domain.plan.service; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.place.entity.Place; +import Journey.Together.domain.place.repository.PlaceRepository; +import Journey.Together.domain.plan.dto.DailyPlace; +import Journey.Together.domain.plan.entity.Day; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.factory.PlanFactory; +import Journey.Together.domain.plan.repository.DayRepository; +import Journey.Together.global.exception.ApplicationException; +import Journey.Together.global.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PlanPlaceService { + private final PlaceRepository placeRepository; + private final DayRepository dayRepository; + private final PlanFactory planFactory; + + public void savePlacesByDay(List places, Member member, Plan plan) { + for (DailyPlace dailyPlace : places) { + for (Long placeId : dailyPlace.places()) { + Place place = placeRepository.findById(placeId) + .orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); + Day day = planFactory.createDay(member, plan, place, dailyPlace.date()); + dayRepository.save(day); + } + } + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 4003192..bd97900 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -48,6 +48,7 @@ public class PlanService { private final PlanReviewImageRepository planReviewImageRepository; private final DisabilityPlaceCategoryRepository disabilityPlaceCategoryRepository; + private final PlanPlaceService planPlaceService; private final PlanFactory planFactory; private final S3Client s3Client; @@ -59,7 +60,7 @@ public void savePlan(Member member, PlanReq planReq) { Plan plan = planFactory.createPlan(member, planReq); planRepository.save(plan); //날짜별 장소 정보 저장 - savePlaceByDay(planReq.dailyplace(), member, plan); + planPlaceService.savePlacesByDay(planReq.dailyplace(), member, plan); } @Transactional @@ -75,7 +76,7 @@ public void updatePlan(Member member, Long planId, PlanReq planReq) { plan.updatePlan(planReq.title(), planReq.startDate(), planReq.endDate()); planRepository.save(plan); - savePlaceByDay(planReq.dailyplace(), member, plan); + planPlaceService.savePlacesByDay(planReq.dailyplace(), member, plan); } @@ -370,16 +371,6 @@ public OpenPlanPageRes findOpenPlans(Pageable page) { return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } - public void savePlaceByDay(List places, Member member, Plan plan) { - for (DailyPlace dailyPlace : places) { - for (Long placeId : dailyPlace.places()) { - Place place = placeRepository.findById(placeId).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); - Day day = planFactory.createDay(member, plan, place, dailyPlace.date()); - dayRepository.save(day); - } - } - } - public String isBetween(LocalDate startDate, LocalDate endDate) { if ((LocalDate.now().isEqual(startDate) || LocalDate.now().isAfter(startDate) && (LocalDate.now().isEqual(endDate) || LocalDate.now().isBefore(endDate)))) { return "D-DAY"; From f9de27b1d84e3ae318762daa05ddaf137da25c61 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:40:05 +0900 Subject: [PATCH 04/21] =?UTF-8?q?#132=20refactor:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=20=EA=B2=80=EC=A6=9D=20memberValidator=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/validator/MemberValidator.java | 17 +++++++++++++++++ .../domain/plan/service/PlanService.java | 4 +++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Journey/Together/domain/member/validator/MemberValidator.java diff --git a/src/main/java/Journey/Together/domain/member/validator/MemberValidator.java b/src/main/java/Journey/Together/domain/member/validator/MemberValidator.java new file mode 100644 index 0000000..3df19e6 --- /dev/null +++ b/src/main/java/Journey/Together/domain/member/validator/MemberValidator.java @@ -0,0 +1,17 @@ +package Journey.Together.domain.member.validator; + +import Journey.Together.domain.member.repository.MemberRepository; +import Journey.Together.global.exception.ApplicationException; +import Journey.Together.global.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MemberValidator { + private final MemberRepository memberRepository; + + public void validateExistsAndActive(String email) { + memberRepository.findMemberByEmailAndDeletedAtIsNull(email).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index bd97900..6f492fc 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -1,5 +1,6 @@ package Journey.Together.domain.plan.service; +import Journey.Together.domain.member.validator.MemberValidator; import Journey.Together.domain.place.entity.PlaceReviewImg; import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.entity.Day; @@ -50,12 +51,13 @@ public class PlanService { private final PlanPlaceService planPlaceService; private final PlanFactory planFactory; + private final MemberValidator memberValidator; private final S3Client s3Client; @Transactional public void savePlan(Member member, PlanReq planReq) { // Validation - memberRepository.findMemberByEmailAndDeletedAtIsNull(member.getEmail()).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION)); + memberValidator.validateExistsAndActive(member.getEmail()); //Buisness Plan plan = planFactory.createPlan(member, planReq); planRepository.save(plan); From aa30e9faa45245d09a30460beba21c554c627360 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:47:43 +0900 Subject: [PATCH 05/21] =?UTF-8?q?#132=20PlanModifier=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1=ED=95=98=EC=97=AC=20plan?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=9E=91=EC=97=85=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/modifier/PlanModifier.java | 27 +++++++++++++++++++ .../domain/plan/service/PlanService.java | 15 +++++------ .../domain/plan/validator/PlanValidator.java | 8 ++++++ 3 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java diff --git a/src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java b/src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java new file mode 100644 index 0000000..47ed3f0 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java @@ -0,0 +1,27 @@ +package Journey.Together.domain.plan.modifier; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.dto.PlanReq; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.repository.DayRepository; +import Journey.Together.domain.plan.repository.PlanRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class PlanModifier { + private final DayRepository dayRepository; + private final PlanRepository planRepository; + + public void modifyPlan(Member member, Plan plan, PlanReq planReq) { + // 기존 Day 삭제 + dayRepository.deleteAllByMemberAndPlan(member, plan); + + // Plan 수정 + plan.updatePlan(planReq.title(), planReq.startDate(), planReq.endDate()); + + // save는 변경 감지 안 될 경우에만 필요 + planRepository.save(plan); + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 6f492fc..61986e1 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -8,6 +8,7 @@ import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.entity.PlanReviewImage; import Journey.Together.domain.plan.factory.PlanFactory; +import Journey.Together.domain.plan.modifier.PlanModifier; import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; @@ -17,6 +18,7 @@ import Journey.Together.domain.place.entity.Place; import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; import Journey.Together.domain.place.repository.PlaceRepository; +import Journey.Together.domain.plan.validator.PlanValidator; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; import Journey.Together.global.util.S3Client; @@ -41,7 +43,6 @@ @Transactional(readOnly = true) @RequiredArgsConstructor public class PlanService { - private final MemberRepository memberRepository; private final PlanRepository planRepository; private final DayRepository dayRepository; private final PlaceRepository placeRepository; @@ -51,7 +52,9 @@ public class PlanService { private final PlanPlaceService planPlaceService; private final PlanFactory planFactory; + private final PlanValidator planValidator; private final MemberValidator memberValidator; + private final PlanModifier planModifier; private final S3Client s3Client; @Transactional @@ -69,17 +72,11 @@ public void savePlan(Member member, PlanReq planReq) { public void updatePlan(Member member, Long planId, PlanReq planReq) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } + planValidator.validateExists(plan); //Business - dayRepository.deleteAllByMemberAndPlan(member, plan); - - plan.updatePlan(planReq.title(), planReq.startDate(), planReq.endDate()); - planRepository.save(plan); + planModifier.modifyPlan(member,plan,planReq); planPlaceService.savePlacesByDay(planReq.dailyplace(), member, plan); - } @Transactional diff --git a/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java b/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java index 14f0c2b..dffb462 100644 --- a/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java +++ b/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java @@ -1,7 +1,15 @@ package Journey.Together.domain.plan.validator; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.global.exception.ApplicationException; +import Journey.Together.global.exception.ErrorCode; import org.springframework.stereotype.Component; @Component public class PlanValidator { + public void validateExists(Plan plan) { + if (plan == null) { + throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); + } + } } From 6c4afe1ed4667830eca908d0617aff227f939408 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:55:26 +0900 Subject: [PATCH 06/21] =?UTF-8?q?#132=20PlanQueryService=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EC=97=AC=20plan=EC=9D=98=20=EC=B2=AB=20=EC=9E=A5?= =?UTF-8?q?=EC=86=8C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/service/PlanService.java | 31 +++++-------------- .../plan/service/query/PlanQueryService.java | 24 ++++++++++++++ 2 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 61986e1..5392b1d 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -1,7 +1,6 @@ package Journey.Together.domain.plan.service; import Journey.Together.domain.member.validator.MemberValidator; -import Journey.Together.domain.place.entity.PlaceReviewImg; import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; @@ -14,17 +13,16 @@ import Journey.Together.domain.plan.repository.PlanReviewImageRepository; import Journey.Together.domain.plan.repository.PlanReviewRepository; import Journey.Together.domain.member.entity.Member; -import Journey.Together.domain.member.repository.MemberRepository; import Journey.Together.domain.place.entity.Place; import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; import Journey.Together.domain.place.repository.PlaceRepository; +import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.validator.PlanValidator; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; import Journey.Together.global.util.S3Client; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.monitor.os.OsStats; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -55,6 +53,7 @@ public class PlanService { private final PlanValidator planValidator; private final MemberValidator memberValidator; private final PlanModifier planModifier; + private final PlanQueryService planQueryService; private final S3Client s3Client; @Transactional @@ -83,11 +82,9 @@ public void updatePlan(Member member, Long planId, PlanReq planReq) { public PlanRes findPlan(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } + planValidator.validateExists(plan); //Buisness - String image = getPlaceFirstImage(plan); + String image = planQueryService.getFirstPlaceImageOfPlan(plan); //Response return PlanRes.of(plan, image, null, null); } @@ -311,7 +308,7 @@ public List findMyPlans(Member member) { .toList(); List myPlanResList = new ArrayList<>(); for (Plan plan : top3list) { - String image = getPlaceFirstImage(plan); + String image = planQueryService.getFirstPlaceImageOfPlan(plan); String remainDate = null; Boolean hasReview = null; if (LocalDate.now().isAfter(plan.getEndDate())) { @@ -348,12 +345,12 @@ public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compele if (compelete) { planPage = planRepository.findAllByMemberAndEndDateBeforeAndDeletedAtIsNull(member, LocalDate.now(), pageable); planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan, getPlaceFirstImage(plan), null, planReviewRepository.existsAllByPlanAndReportFilter(plan))) + .map(plan -> PlanRes.of(plan, planQueryService.getFirstPlaceImageOfPlan(plan), null, planReviewRepository.existsAllByPlanAndReportFilter(plan))) .collect(Collectors.toList()); } else { planPage = planRepository.findAllByMemberAndEndDateGreaterThanEqualAndDeletedAtIsNull(member, LocalDate.now(), pageable); planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan, getPlaceFirstImage(plan), isBetween(plan.getStartDate(), plan.getEndDate()), null)) + .map(plan -> PlanRes.of(plan, planQueryService.getFirstPlaceImageOfPlan(plan), isBetween(plan.getStartDate(), plan.getEndDate()), null)) .collect(Collectors.toList()); } @@ -365,7 +362,7 @@ public OpenPlanPageRes findOpenPlans(Pageable page) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); Page planPage = planRepository.findOpenPlans(LocalDate.now(), pageable); List openPlanResList = planPage.getContent().stream() - .map(plan -> OpenPlanRes.of(plan, s3Client.baseUrl() + plan.getMember().getProfileUuid() + "/profile_" + plan.getMember().getProfileUuid(), getPlaceFirstImage(plan))) + .map(plan -> OpenPlanRes.of(plan, s3Client.baseUrl() + plan.getMember().getProfileUuid() + "/profile_" + plan.getMember().getProfileUuid(), planQueryService.getFirstPlaceImageOfPlan(plan))) .collect(Collectors.toList()); return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } @@ -380,18 +377,6 @@ public String isBetween(LocalDate startDate, LocalDate endDate) { return null; } - public String getPlaceFirstImage(Plan plan) { - List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); - if (!dayList.isEmpty()) { - String placeImageUrl = dayList.get(0).getPlace().getFirstImg(); - if (placeImageUrl.isEmpty()) { - return null; - } - return dayList.get(0).getPlace().getFirstImg(); - } - return null; - } - public List getPlaceImageList(Plan plan) { List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); List list = new ArrayList<>(); diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java new file mode 100644 index 0000000..64d1d38 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java @@ -0,0 +1,24 @@ +package Journey.Together.domain.plan.service.query; + +import Journey.Together.domain.plan.entity.Day; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.repository.DayRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PlanQueryService { + private final DayRepository dayRepository; + + public String getFirstPlaceImageOfPlan(Plan plan) { + List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); + if (!dayList.isEmpty()) { + String placeImageUrl = dayList.get(0).getPlace().getFirstImg(); + return placeImageUrl.isEmpty() ? null : placeImageUrl; + } + return null; + } +} From 91c95687fd6e5e53fb722027ea213d27f18a4d9d Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:03:59 +0900 Subject: [PATCH 07/21] =?UTF-8?q?#132=20PlanDeleter=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EC=97=AC=20plan=EC=9D=98=20day,planreview,plan=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/service/PlanPlaceService.java | 2 +- .../domain/plan/service/PlanService.java | 21 +++++-------- .../plan/service/deleter/PlanDeleter.java | 30 +++++++++++++++++++ .../{ => service}/factory/PlanFactory.java | 2 +- .../{ => service}/modifier/PlanModifier.java | 2 +- .../validator/PlanValidator.java | 2 +- 6 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/deleter/PlanDeleter.java rename src/main/java/Journey/Together/domain/plan/{ => service}/factory/PlanFactory.java (94%) rename src/main/java/Journey/Together/domain/plan/{ => service}/modifier/PlanModifier.java (94%) rename src/main/java/Journey/Together/domain/plan/{ => service}/validator/PlanValidator.java (88%) diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java b/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java index bdde204..cdf540f 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanPlaceService.java @@ -6,7 +6,7 @@ import Journey.Together.domain.plan.dto.DailyPlace; import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; -import Journey.Together.domain.plan.factory.PlanFactory; +import Journey.Together.domain.plan.service.factory.PlanFactory; import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 5392b1d..06ab3db 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -6,8 +6,9 @@ import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.entity.PlanReviewImage; -import Journey.Together.domain.plan.factory.PlanFactory; -import Journey.Together.domain.plan.modifier.PlanModifier; +import Journey.Together.domain.plan.service.deleter.PlanDeleter; +import Journey.Together.domain.plan.service.factory.PlanFactory; +import Journey.Together.domain.plan.service.modifier.PlanModifier; import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; @@ -17,7 +18,7 @@ import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; import Journey.Together.domain.place.repository.PlaceRepository; import Journey.Together.domain.plan.service.query.PlanQueryService; -import Journey.Together.domain.plan.validator.PlanValidator; +import Journey.Together.domain.plan.service.validator.PlanValidator; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; import Journey.Together.global.util.S3Client; @@ -55,6 +56,7 @@ public class PlanService { private final PlanModifier planModifier; private final PlanQueryService planQueryService; private final S3Client s3Client; + private final PlanDeleter planDeleter; @Transactional public void savePlan(Member member, PlanReq planReq) { @@ -93,16 +95,9 @@ public PlanRes findPlan(Member member, Long planId) { public void deletePlan(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } - PlanReview planReview = planReviewRepository.findPlanReviewByPlanAndDeletedAtIsNull(plan); - //Buisness - dayRepository.deleteAllByMemberAndPlan(member, plan); - if (planReview != null) { - deletePlanReview(member, planReview.getPlanReviewId()); - } - planRepository.deletePlanByPlanId(planId); + planValidator.validateExists(plan); + + planDeleter.delete(member, plan); } @Transactional diff --git a/src/main/java/Journey/Together/domain/plan/service/deleter/PlanDeleter.java b/src/main/java/Journey/Together/domain/plan/service/deleter/PlanDeleter.java new file mode 100644 index 0000000..74c10c6 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/deleter/PlanDeleter.java @@ -0,0 +1,30 @@ +package Journey.Together.domain.plan.service.deleter; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.entity.PlanReview; +import Journey.Together.domain.plan.repository.DayRepository; +import Journey.Together.domain.plan.repository.PlanRepository; +import Journey.Together.domain.plan.repository.PlanReviewRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class PlanDeleter { + + private final DayRepository dayRepository; + private final PlanReviewRepository planReviewRepository; + private final PlanRepository planRepository; + + public void delete(Member member, Plan plan) { + dayRepository.deleteAllByMemberAndPlan(member, plan); + + PlanReview planReview = planReviewRepository.findPlanReviewByPlanAndDeletedAtIsNull(plan); + if (planReview != null) { + planReviewRepository.delete(planReview); + } + + planRepository.deletePlanByPlanId(plan.getPlanId()); + } +} diff --git a/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java b/src/main/java/Journey/Together/domain/plan/service/factory/PlanFactory.java similarity index 94% rename from src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java rename to src/main/java/Journey/Together/domain/plan/service/factory/PlanFactory.java index 9d1253e..093a06c 100644 --- a/src/main/java/Journey/Together/domain/plan/factory/PlanFactory.java +++ b/src/main/java/Journey/Together/domain/plan/service/factory/PlanFactory.java @@ -1,4 +1,4 @@ -package Journey.Together.domain.plan.factory; +package Journey.Together.domain.plan.service.factory; import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.place.entity.Place; diff --git a/src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java similarity index 94% rename from src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java rename to src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java index 47ed3f0..1cf14bb 100644 --- a/src/main/java/Journey/Together/domain/plan/modifier/PlanModifier.java +++ b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java @@ -1,4 +1,4 @@ -package Journey.Together.domain.plan.modifier; +package Journey.Together.domain.plan.service.modifier; import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.plan.dto.PlanReq; diff --git a/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java b/src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java similarity index 88% rename from src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java rename to src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java index dffb462..7732ce7 100644 --- a/src/main/java/Journey/Together/domain/plan/validator/PlanValidator.java +++ b/src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java @@ -1,4 +1,4 @@ -package Journey.Together.domain.plan.validator; +package Journey.Together.domain.plan.service.validator; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.global.exception.ApplicationException; From 32ce48a43940533933e7305c18808c06d175e1fb Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:14:36 +0900 Subject: [PATCH 08/21] =?UTF-8?q?#132=20PlanDetailQueryService=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EC=97=AC=20plan=EC=9D=98=20day=EC=99=80=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20day=EC=9D=98=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/service/PlanService.java | 72 +++---------------- .../service/query/PlanDetailQueryService.java | 61 ++++++++++++++++ .../plan/service/query/PlanQueryService.java | 13 ++++ 3 files changed, 85 insertions(+), 61 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 06ab3db..3ba66a7 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -1,22 +1,22 @@ package Journey.Together.domain.plan.service; +import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.member.validator.MemberValidator; +import Journey.Together.domain.place.entity.Place; +import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; +import Journey.Together.domain.place.repository.PlaceRepository; import Journey.Together.domain.plan.dto.*; -import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.entity.PlanReviewImage; -import Journey.Together.domain.plan.service.deleter.PlanDeleter; -import Journey.Together.domain.plan.service.factory.PlanFactory; -import Journey.Together.domain.plan.service.modifier.PlanModifier; import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; import Journey.Together.domain.plan.repository.PlanReviewRepository; -import Journey.Together.domain.member.entity.Member; -import Journey.Together.domain.place.entity.Place; -import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; -import Journey.Together.domain.place.repository.PlaceRepository; +import Journey.Together.domain.plan.service.deleter.PlanDeleter; +import Journey.Together.domain.plan.service.factory.PlanFactory; +import Journey.Together.domain.plan.service.modifier.PlanModifier; +import Journey.Together.domain.plan.service.query.PlanDetailQueryService; import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.service.validator.PlanValidator; import Journey.Together.global.exception.ApplicationException; @@ -57,6 +57,7 @@ public class PlanService { private final PlanQueryService planQueryService; private final S3Client s3Client; private final PlanDeleter planDeleter; + private final PlanDetailQueryService planDetailQueryService; @Transactional public void savePlan(Member member, PlanReq planReq) { @@ -104,49 +105,9 @@ public void deletePlan(Member member, Long planId) { public PlanDetailRes findPlanDetail(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByPlanIdAndDeletedAtIsNull(planId); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } - - //Buisness - boolean isWriter; - List dailyLists = new ArrayList<>(); - List dayList = dayRepository.findAllByMemberAndPlanOrderByDateAsc(plan.getMember(), plan); - List imageUrls = getPlaceImageList(plan); - - Map> groupedByDate = dayList.stream() - .collect(Collectors.groupingBy(Day::getDate)); - - LocalDate startDate = plan.getStartDate(); - LocalDate endDate = plan.getEndDate(); - - // startDate부터 endDate까지의 날짜들을 순회 - for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) { - List days = groupedByDate.get(date); - List dailyPlaceInfoList = new ArrayList<>(); - if (days != null) { - for (Day day : days) { - List disabilityCategoryList = disabilityPlaceCategoryRepository.findDisabilityCategoryIds(day.getPlace().getId()); - DailyPlaceInfo dailyPlaceInfo = DailyPlaceInfo.of(day.getPlace(), disabilityCategoryList); - dailyPlaceInfoList.add(dailyPlaceInfo); - } - } - DailyList dailyList = DailyList.of(date, dailyPlaceInfoList); - dailyLists.add(dailyList); - } - - // 날짜 순으로 정렬 - dailyLists.sort(Comparator.comparing(DailyList::getDate)); - - if (member == null) { - isWriter = false; - } else { - isWriter = plan.getMember().getMemberId().equals(member.getMemberId()); - } - String remainDate = isBetween(plan.getStartDate(), plan.getEndDate()); + planValidator.validateExists(plan); - //Response - return PlanDetailRes.of(imageUrls, dailyLists, isWriter, plan, remainDate); + return planDetailQueryService.getDetail(member, plan); } @Transactional @@ -372,17 +333,6 @@ public String isBetween(LocalDate startDate, LocalDate endDate) { return null; } - public List getPlaceImageList(Plan plan) { - List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); - List list = new ArrayList<>(); - if (!dayList.isEmpty()) { - dayList.forEach(day -> { - list.add(day.getPlace().getFirstImg()); - }); - return list; - } - return null; - } public List getReviewImageList(PlanReview planReview) { List list = new ArrayList<>(); diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java new file mode 100644 index 0000000..4d65f14 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java @@ -0,0 +1,61 @@ +package Journey.Together.domain.plan.service.query; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; +import Journey.Together.domain.plan.dto.DailyList; +import Journey.Together.domain.plan.dto.DailyPlaceInfo; +import Journey.Together.domain.plan.dto.PlanDetailRes; +import Journey.Together.domain.plan.entity.Day; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.repository.DayRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class PlanDetailQueryService { + + private final DayRepository dayRepository; + private final DisabilityPlaceCategoryRepository disabilityPlaceCategoryRepository; + private final PlanQueryService planQueryService; + + public PlanDetailRes getDetail(Member member, Plan plan) { + boolean isWriter = member != null && plan.getMember().getMemberId().equals(member.getMemberId()); + + List dayList = dayRepository.findAllByMemberAndPlanOrderByDateAsc(plan.getMember(), plan); + List imageUrls = planQueryService.getPlaceImageListOfPlan(plan); // 분리된 로직 사용 + + Map> groupedByDate = dayList.stream() + .collect(Collectors.groupingBy(Day::getDate)); + + List dailyLists = new ArrayList<>(); + LocalDate startDate = plan.getStartDate(); + LocalDate endDate = plan.getEndDate(); + + for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) { + List days = groupedByDate.get(date); + List dailyPlaceInfoList = new ArrayList<>(); + if (days != null) { + for (Day day : days) { + List disabilityCategoryList = + disabilityPlaceCategoryRepository.findDisabilityCategoryIds(day.getPlace().getId()); + dailyPlaceInfoList.add(DailyPlaceInfo.of(day.getPlace(), disabilityCategoryList)); + } + } + dailyLists.add(DailyList.of(date, dailyPlaceInfoList)); + } + + dailyLists.sort(Comparator.comparing(DailyList::getDate)); + String remainDate = isBetween(startDate, endDate); + + return PlanDetailRes.of(imageUrls, dailyLists, isWriter, plan, remainDate); + } +} + diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java index 64d1d38..34fd3d3 100644 --- a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; @Service @@ -21,4 +22,16 @@ public String getFirstPlaceImageOfPlan(Plan plan) { } return null; } + + public List getPlaceImageListOfPlan(Plan plan) { + List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); + List list = new ArrayList<>(); + if (!dayList.isEmpty()) { + dayList.forEach(day -> { + list.add(day.getPlace().getFirstImg()); + }); + return list; + } + return null; + } } From f1adac9b6682c093731e45379016b711f92311ed Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:18:34 +0900 Subject: [PATCH 09/21] =?UTF-8?q?#132=20DateUtil=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EB=82=A8=EC=9D=80=20=EA=B8=B0=EA=B0=84=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EC=83=9D=EC=84=B1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/service/PlanService.java | 14 ++----------- .../service/query/PlanDetailQueryService.java | 3 ++- .../Together/domain/plan/util/DateUtil.java | 21 +++++++++++++++++++ 3 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/util/DateUtil.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 3ba66a7..15f0438 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -19,6 +19,7 @@ import Journey.Together.domain.plan.service.query.PlanDetailQueryService; import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.service.validator.PlanValidator; +import Journey.Together.domain.plan.util.DateUtil; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; import Journey.Together.global.util.S3Client; @@ -306,7 +307,7 @@ public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compele } else { planPage = planRepository.findAllByMemberAndEndDateGreaterThanEqualAndDeletedAtIsNull(member, LocalDate.now(), pageable); planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan, planQueryService.getFirstPlaceImageOfPlan(plan), isBetween(plan.getStartDate(), plan.getEndDate()), null)) + .map(plan -> PlanRes.of(plan, planQueryService.getFirstPlaceImageOfPlan(plan), DateUtil.getRemainDateString(plan.getStartDate(), plan.getEndDate()), null)) .collect(Collectors.toList()); } @@ -323,17 +324,6 @@ public OpenPlanPageRes findOpenPlans(Pageable page) { return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } - public String isBetween(LocalDate startDate, LocalDate endDate) { - if ((LocalDate.now().isEqual(startDate) || LocalDate.now().isAfter(startDate) && (LocalDate.now().isEqual(endDate) || LocalDate.now().isBefore(endDate)))) { - return "D-DAY"; - } else if (LocalDate.now().isBefore(startDate)) { - Period period = Period.between(LocalDate.now(), startDate); - return "D-" + period.getDays(); - } - return null; - } - - public List getReviewImageList(PlanReview planReview) { List list = new ArrayList<>(); List planReviewImageList = planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview); diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java index 4d65f14..1e69cda 100644 --- a/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanDetailQueryService.java @@ -8,6 +8,7 @@ import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.repository.DayRepository; +import Journey.Together.domain.plan.util.DateUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -53,7 +54,7 @@ public PlanDetailRes getDetail(Member member, Plan plan) { } dailyLists.sort(Comparator.comparing(DailyList::getDate)); - String remainDate = isBetween(startDate, endDate); + String remainDate = DateUtil.getRemainDateString(startDate, endDate); return PlanDetailRes.of(imageUrls, dailyLists, isWriter, plan, remainDate); } diff --git a/src/main/java/Journey/Together/domain/plan/util/DateUtil.java b/src/main/java/Journey/Together/domain/plan/util/DateUtil.java new file mode 100644 index 0000000..4821522 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/util/DateUtil.java @@ -0,0 +1,21 @@ +package Journey.Together.domain.plan.util; + +import java.time.LocalDate; +import java.time.Period; + +public class DateUtil { + private DateUtil() {} // 인스턴스 생성 방지 + + public static String getRemainDateString(LocalDate startDate, LocalDate endDate) { + LocalDate today = LocalDate.now(); + + if ((today.isEqual(startDate) || today.isAfter(startDate)) + && (today.isEqual(endDate) || today.isBefore(endDate))) { + return "D-DAY"; + } else if (today.isBefore(startDate)) { + Period period = Period.between(today, startDate); + return "D-" + period.getDays(); + } + return null; + } +} From f8c90940a8c88bd146bda08aaae687caa0ab5e55 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:24:27 +0900 Subject: [PATCH 10/21] =?UTF-8?q?#132=20=EC=9D=BC=EC=A0=95=20=EA=B3=B5?= =?UTF-8?q?=EA=B0=9C=20=EC=97=AC=EB=B6=80=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A9=94=EC=86=8C=EB=93=9C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EC=9E=90=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EA=B3=BC=20=EA=B3=B5=EA=B0=9C=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Together/domain/plan/service/PlanService.java | 13 +++---------- .../domain/plan/service/modifier/PlanModifier.java | 5 +++++ .../plan/service/validator/PlanValidator.java | 7 +++++++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 15f0438..d391444 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -115,18 +115,11 @@ public PlanDetailRes findPlanDetail(Member member, Long planId) { public Boolean updatePlanIsPublic(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } - if (!Objects.equals(plan.getMember().getMemberId(), member.getMemberId())) { - throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); - } - - //Business - plan.setIsPublic(!plan.getIsPublic()); + planValidator.validateExists(plan); + planValidator.validateWriter(member,plan); //Response - return plan.getIsPublic(); + return planModifier.togglePublic(plan); } @Transactional diff --git a/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java index 1cf14bb..eddfd09 100644 --- a/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java +++ b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java @@ -24,4 +24,9 @@ public void modifyPlan(Member member, Plan plan, PlanReq planReq) { // save는 변경 감지 안 될 경우에만 필요 planRepository.save(plan); } + + public Boolean togglePublic(Plan plan) { + plan.setIsPublic(!plan.getIsPublic()); + return plan.getIsPublic(); + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java b/src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java index 7732ce7..034a953 100644 --- a/src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java +++ b/src/main/java/Journey/Together/domain/plan/service/validator/PlanValidator.java @@ -1,5 +1,6 @@ package Journey.Together.domain.plan.service.validator; +import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; @@ -12,4 +13,10 @@ public void validateExists(Plan plan) { throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); } } + + public void validateWriter(Member requester, Plan plan) { + if (!requester.getMemberId().equals(plan.getMember().getMemberId())) { + throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); + } + } } From 1e3a14319d9da7fddd37c691a2ccd41d09d81f74 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:31:22 +0900 Subject: [PATCH 11/21] =?UTF-8?q?#132=20PlanReviewVlidator,PlanReviewFacto?= =?UTF-8?q?ry=20=EC=83=9D=EC=84=B1=ED=95=98=EC=97=AC=20planReview=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=B0=8F=20=EC=83=9D=EC=84=B1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/plan/service/PlanService.java | 37 +++++++++---------- .../service/factory/PlanReviewFactory.java | 19 ++++++++++ .../validator/PlanReviewValidator.java | 19 ++++++++++ 3 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewFactory.java create mode 100644 src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index d391444..fe58c2e 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -3,21 +3,21 @@ import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.member.validator.MemberValidator; import Journey.Together.domain.place.entity.Place; -import Journey.Together.domain.place.repository.DisabilityPlaceCategoryRepository; import Journey.Together.domain.place.repository.PlaceRepository; import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.entity.PlanReviewImage; -import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; import Journey.Together.domain.plan.repository.PlanReviewRepository; import Journey.Together.domain.plan.service.deleter.PlanDeleter; import Journey.Together.domain.plan.service.factory.PlanFactory; +import Journey.Together.domain.plan.service.factory.PlanReviewFactory; import Journey.Together.domain.plan.service.modifier.PlanModifier; import Journey.Together.domain.plan.service.query.PlanDetailQueryService; import Journey.Together.domain.plan.service.query.PlanQueryService; +import Journey.Together.domain.plan.service.validator.PlanReviewValidator; import Journey.Together.domain.plan.service.validator.PlanValidator; import Journey.Together.domain.plan.util.DateUtil; import Journey.Together.global.exception.ApplicationException; @@ -44,21 +44,26 @@ @RequiredArgsConstructor public class PlanService { private final PlanRepository planRepository; - private final DayRepository dayRepository; private final PlaceRepository placeRepository; private final PlanReviewRepository planReviewRepository; private final PlanReviewImageRepository planReviewImageRepository; - private final DisabilityPlaceCategoryRepository disabilityPlaceCategoryRepository; private final PlanPlaceService planPlaceService; + private final PlanQueryService planQueryService; + private final PlanDetailQueryService planDetailQueryService; + private final PlanFactory planFactory; + private final PlanReviewFactory planReviewFactory; + private final PlanModifier planModifier; + private final PlanDeleter planDeleter; + private final PlanValidator planValidator; + private final PlanReviewValidator planReviewValidator; private final MemberValidator memberValidator; - private final PlanModifier planModifier; - private final PlanQueryService planQueryService; + private final S3Client s3Client; - private final PlanDeleter planDeleter; - private final PlanDetailQueryService planDetailQueryService; + + @Transactional public void savePlan(Member member, PlanReq planReq) { @@ -126,19 +131,11 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewReq, List images) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } - if (planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan)) { - throw new ApplicationException(ErrorCode.ALREADY_EXIST_EXCEPTION); - } + planValidator.validateExists(plan); + planReviewValidator.validateExists(plan); + //Business - PlanReview planReview = PlanReview.builder() - .member(member) - .grade(planReviewReq.grade()) - .content(planReviewReq.content()) - .plan(plan) - .build(); + PlanReview planReview = planReviewFactory.createPlanReview(member,plan,planReviewReq); planReviewRepository.save(planReview); if (images != null) { diff --git a/src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewFactory.java b/src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewFactory.java new file mode 100644 index 0000000..f02fa71 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewFactory.java @@ -0,0 +1,19 @@ +package Journey.Together.domain.plan.service.factory; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.dto.PlanReviewReq; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.entity.PlanReview; +import org.springframework.stereotype.Component; + +@Component +public class PlanReviewFactory { + public PlanReview createPlanReview(Member member, Plan plan, PlanReviewReq planReviewReq) { + return PlanReview.builder() + .member(member) + .grade(planReviewReq.grade()) + .content(planReviewReq.content()) + .plan(plan) + .build(); + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java b/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java new file mode 100644 index 0000000..abb1991 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java @@ -0,0 +1,19 @@ +package Journey.Together.domain.plan.service.validator; + +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.repository.PlanReviewRepository; +import Journey.Together.global.exception.ApplicationException; +import Journey.Together.global.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class PlanReviewValidator { + private final PlanReviewRepository planReviewRepository; + public void validateExists(Plan plan) { + if (planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan)) { + throw new ApplicationException(ErrorCode.ALREADY_EXIST_EXCEPTION); + } + } +} From 45e2439a547a41091a8c22e37214269711ca8c2f Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:44:54 +0900 Subject: [PATCH 12/21] =?UTF-8?q?#132=20PlanReviewImageService=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EC=97=AC=20planReview=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=EB=93=A4=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/service/PlanReviewImageService.java | 31 +++++++++++++++++++ .../domain/plan/service/PlanService.java | 14 +++------ .../plan/service/modifier/PlanModifier.java | 4 +++ 3 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java new file mode 100644 index 0000000..564cd4d --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java @@ -0,0 +1,31 @@ +package Journey.Together.domain.plan.service; + +import Journey.Together.domain.plan.entity.PlanReview; +import Journey.Together.domain.plan.entity.PlanReviewImage; +import Journey.Together.domain.plan.repository.PlanReviewImageRepository; +import Journey.Together.global.util.S3Client; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class PlanReviewImageService { + private final S3Client s3Client; + private final PlanReviewImageRepository planReviewImageRepository; + + public void uploadAndSaveImages(List images, PlanReview planReview, String profileUuid) { + for (MultipartFile file : images) { + String uuid = UUID.randomUUID().toString(); + String url = s3Client.upload(file, profileUuid, uuid); + PlanReviewImage image = PlanReviewImage.builder() + .planReview(planReview) + .imageUrl(url) + .build(); + planReviewImageRepository.save(image); + } + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index fe58c2e..17ed639 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -49,6 +49,8 @@ public class PlanService { private final PlanReviewImageRepository planReviewImageRepository; private final PlanPlaceService planPlaceService; + private final PlanReviewImageService planReviewImageService; + private final PlanQueryService planQueryService; private final PlanDetailQueryService planDetailQueryService; @@ -139,18 +141,10 @@ public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewR planReviewRepository.save(planReview); if (images != null) { - for (MultipartFile file : images) { - String uuid = UUID.randomUUID().toString(); - String url = s3Client.upload(file, member.getProfileUuid(), uuid); - PlanReviewImage planReviewImage = PlanReviewImage.builder() - .planReview(planReview) - .imageUrl(url) - .build(); - planReviewImageRepository.save(planReviewImage); - } + planReviewImageService.uploadAndSaveImages(images, planReview, member.getProfileUuid()); } - plan.setIsPublic(planReviewReq.isPublic()); + planModifier.updateIsPublic(plan, planReviewReq.isPublic()); } @Transactional diff --git a/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java index eddfd09..c18894e 100644 --- a/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java +++ b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanModifier.java @@ -29,4 +29,8 @@ public Boolean togglePublic(Plan plan) { plan.setIsPublic(!plan.getIsPublic()); return plan.getIsPublic(); } + + public void updateIsPublic(Plan plan, boolean isPublic) { + plan.setIsPublic(isPublic); + } } From ff021025148f7b76ced4f1b7c34f3acdfff2fc5b Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:22:54 +0900 Subject: [PATCH 13/21] =?UTF-8?q?#132=20PlanReview=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EC=97=AC=20PlanService=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/controller/PlanController.java | 7 ++- .../plan/service/PlanReviewImageService.java | 8 +++ .../domain/plan/service/PlanService.java | 40 --------------- .../service/query/PlanReviewQueryService.java | 51 +++++++++++++++++++ .../Together/global/util/S3UrlUtil.java | 15 ++++++ 5 files changed, 79 insertions(+), 42 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/query/PlanReviewQueryService.java create mode 100644 src/main/java/Journey/Together/global/util/S3UrlUtil.java diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index 4ea9568..3eec6b8 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -2,6 +2,7 @@ import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.service.PlanService; +import Journey.Together.domain.plan.service.query.PlanReviewQueryService; import Journey.Together.global.common.ApiResponse; import Journey.Together.global.exception.Success; import Journey.Together.global.security.PrincipalDetails; @@ -21,6 +22,8 @@ @Tag(name = "Plan", description = "일정 관련 API") public class PlanController { private final PlanService planService; + private final PlanReviewQueryService planReviewQueryService; + @PostMapping("") public ApiResponse savePlan(@AuthenticationPrincipal PrincipalDetails principalDetails,@RequestBody PlanReq planReq){ planService.savePlan(principalDetails.getMember(),planReq); @@ -62,7 +65,7 @@ public ApiResponse savePlanReview(@AuthenticationPrincipal PrincipalDetails prin @GetMapping("/review/{plan_id}") public ApiResponse findPlanReview(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable("plan_id")Long planId){ - return ApiResponse.success(Success.GET_REVIEW_SUCCESS,planService.findPlanReview(principalDetails.getMember(),planId)); + return ApiResponse.success(Success.GET_REVIEW_SUCCESS,planReviewQueryService.getReview(principalDetails.getMember(),planId)); } @PatchMapping("/review/{review_id}") @@ -79,7 +82,7 @@ public ApiResponse deletePlanReview(@AuthenticationPrincipal PrincipalDetails pr @GetMapping("/guest/review/{plan_id}") public ApiResponse findPlanReviewGuest(@PathVariable("plan_id")Long planId){ - return ApiResponse.success(Success.GET_REVIEW_SUCCESS,planService.findPlanReview(null,planId)); + return ApiResponse.success(Success.GET_REVIEW_SUCCESS,planReviewQueryService.getReview(null,planId)); } @GetMapping("/open") diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java index 564cd4d..5b69d33 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -28,4 +29,11 @@ public void uploadAndSaveImages(List images, PlanReview planRevie planReviewImageRepository.save(image); } } + + public List getImageUrls(PlanReview planReview) { + return planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview) + .stream() + .map(PlanReviewImage::getImageUrl) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 17ed639..4bb9917 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -147,37 +147,6 @@ public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewR planModifier.updateIsPublic(plan, planReviewReq.isPublic()); } - @Transactional - public PlanReviewRes findPlanReview(Member member, long planId) { - // Validation - Plan plan = planRepository.findPlanByPlanIdAndDeletedAtIsNull(planId); - if (plan == null) { - throw new ApplicationException(ErrorCode.NOT_FOUND_EXCEPTION); - } - PlanReview planReview = planReviewRepository.findPlanReview(plan); - //Buisness - boolean isWriter; - if (member == null) { - isWriter = false; - } else { - isWriter = plan.getMember().getMemberId().equals(member.getMemberId()); - } - String profileUrl = s3Client.baseUrl() + plan.getMember().getProfileUuid() + "/profile_" + plan.getMember().getProfileUuid(); - if (planReview == null) { - //리뷰가 없을 경우 - return PlanReviewRes.of(null, null, null, isWriter, false, null, profileUrl, null); - } else { - List imageList = getReviewImageList(planReview); - //리뷰가 있고 신고 없을 경우 - if (planReview.getReport() == null) { - return PlanReviewRes.of(planReview.getPlanReviewId(), planReview.getContent(), planReview.getGrade(), isWriter, true, imageList, profileUrl, null); - } - //리뷰가 있고 신고 비승인 - return PlanReviewRes.of(planReview.getPlanReviewId(), planReview.getContent(), planReview.getGrade(), isWriter, true, imageList, profileUrl, planReview.getReport()); - } - - } - @Transactional public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq updatePlanReviewReq, List images) { // Validation @@ -307,13 +276,4 @@ public OpenPlanPageRes findOpenPlans(Pageable page) { .collect(Collectors.toList()); return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } - - public List getReviewImageList(PlanReview planReview) { - List list = new ArrayList<>(); - List planReviewImageList = planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview); - for (PlanReviewImage planReviewImage : planReviewImageList) { - list.add(planReviewImage.getImageUrl()); - } - return list; - } } diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanReviewQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanReviewQueryService.java new file mode 100644 index 0000000..297a094 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanReviewQueryService.java @@ -0,0 +1,51 @@ +package Journey.Together.domain.plan.service.query; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.dto.PlanReviewRes; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.entity.PlanReview; +import Journey.Together.domain.plan.repository.PlanRepository; +import Journey.Together.domain.plan.repository.PlanReviewRepository; +import Journey.Together.domain.plan.service.PlanReviewImageService; +import Journey.Together.domain.plan.service.validator.PlanValidator; +import Journey.Together.global.util.S3UrlUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PlanReviewQueryService { + + private final PlanRepository planRepository; + private final PlanReviewRepository planReviewRepository; + private final PlanValidator planValidator; + private final PlanReviewImageService planReviewImageService; + private final S3UrlUtil s3UrlUtil; + + public PlanReviewRes getReview(Member member, long planId) { + Plan plan = planRepository.findPlanByPlanIdAndDeletedAtIsNull(planId); + planValidator.validateExists(plan); + + PlanReview planReview = planReviewRepository.findPlanReview(plan); + boolean isWriter = (member != null) && plan.getMember().getMemberId().equals(member.getMemberId()); + + String profileUrl = s3UrlUtil.generateProfileUrl(plan.getMember().getProfileUuid()); + + if (planReview == null) { + return PlanReviewRes.of(null, null, null, isWriter, false, null, profileUrl, null); + } + + List imageList = planReviewImageService.getImageUrls(planReview); + if (planReview.getReport() == null) { + return PlanReviewRes.of(planReview.getPlanReviewId(), planReview.getContent(), planReview.getGrade(), + isWriter, true, imageList, profileUrl, null); + } + + return PlanReviewRes.of(planReview.getPlanReviewId(), planReview.getContent(), planReview.getGrade(), + isWriter, true, imageList, profileUrl, planReview.getReport()); + } +} + + diff --git a/src/main/java/Journey/Together/global/util/S3UrlUtil.java b/src/main/java/Journey/Together/global/util/S3UrlUtil.java new file mode 100644 index 0000000..4de171d --- /dev/null +++ b/src/main/java/Journey/Together/global/util/S3UrlUtil.java @@ -0,0 +1,15 @@ +package Journey.Together.global.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class S3UrlUtil { + + private final S3Client s3Client; + + public String generateProfileUrl(String profileUuid) { + return s3Client.baseUrl() + profileUuid + "/profile_" + profileUuid; + } +} \ No newline at end of file From 02670ad7de0287918bda725a9f98fed15cdf6c94 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:26:01 +0900 Subject: [PATCH 14/21] =?UTF-8?q?#132=20PlanReviewImageFactory=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EC=97=AC=20=EB=A6=AC=EB=B7=B0=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=83=9D=EC=84=B1=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Together/domain/plan/service/PlanService.java | 7 +++---- .../service/factory/PlanReviewImageFactory.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewImageFactory.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 4bb9917..9a79c0d 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -14,6 +14,7 @@ import Journey.Together.domain.plan.service.deleter.PlanDeleter; import Journey.Together.domain.plan.service.factory.PlanFactory; import Journey.Together.domain.plan.service.factory.PlanReviewFactory; +import Journey.Together.domain.plan.service.factory.PlanReviewImageFactory; import Journey.Together.domain.plan.service.modifier.PlanModifier; import Journey.Together.domain.plan.service.query.PlanDetailQueryService; import Journey.Together.domain.plan.service.query.PlanQueryService; @@ -56,6 +57,7 @@ public class PlanService { private final PlanFactory planFactory; private final PlanReviewFactory planReviewFactory; + private final PlanReviewImageFactory planReviewImageFactory; private final PlanModifier planModifier; private final PlanDeleter planDeleter; @@ -160,10 +162,7 @@ public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq u for (MultipartFile file : images) { String uuid = UUID.randomUUID().toString(); String url = s3Client.upload(file, member.getProfileUuid(), uuid); - PlanReviewImage planReviewImage = PlanReviewImage.builder() - .planReview(planReview) - .imageUrl(url) - .build(); + PlanReviewImage planReviewImage = planReviewImageFactory.createPlanReviewImage(planReview,url); planReviewImageRepository.save(planReviewImage); } } catch (RuntimeException e) { diff --git a/src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewImageFactory.java b/src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewImageFactory.java new file mode 100644 index 0000000..3c3fa6e --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/factory/PlanReviewImageFactory.java @@ -0,0 +1,15 @@ +package Journey.Together.domain.plan.service.factory; + +import Journey.Together.domain.plan.entity.PlanReview; +import Journey.Together.domain.plan.entity.PlanReviewImage; +import org.springframework.stereotype.Component; + +@Component +public class PlanReviewImageFactory { + public PlanReviewImage createPlanReviewImage(PlanReview planReview, String url) { + return PlanReviewImage.builder() + .planReview(planReview) + .imageUrl(url) + .build(); + } +} From c9dcdc0dd0b7b990722d8fcd5aeebabbffc930d4 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:40:18 +0900 Subject: [PATCH 15/21] =?UTF-8?q?#132=20PlanReview=20update=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20planService=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/service/PlanReviewImageService.java | 15 +++-- .../plan/service/PlanReviewService.java | 2 + .../domain/plan/service/PlanService.java | 61 +++++++------------ .../service/modifier/PlanReviewModifier.java | 18 ++++++ .../validator/PlanReviewValidator.java | 8 +++ 5 files changed, 60 insertions(+), 44 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java create mode 100644 src/main/java/Journey/Together/domain/plan/service/modifier/PlanReviewModifier.java diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java index 5b69d33..496b82c 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java @@ -3,8 +3,10 @@ import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.entity.PlanReviewImage; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; +import Journey.Together.domain.plan.service.factory.PlanReviewImageFactory; import Journey.Together.global.util.S3Client; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -17,15 +19,13 @@ public class PlanReviewImageService { private final S3Client s3Client; private final PlanReviewImageRepository planReviewImageRepository; + private final PlanReviewImageFactory planReviewImageFactory; public void uploadAndSaveImages(List images, PlanReview planReview, String profileUuid) { for (MultipartFile file : images) { String uuid = UUID.randomUUID().toString(); String url = s3Client.upload(file, profileUuid, uuid); - PlanReviewImage image = PlanReviewImage.builder() - .planReview(planReview) - .imageUrl(url) - .build(); + PlanReviewImage image = planReviewImageFactory.createPlanReviewImage(planReview,url); planReviewImageRepository.save(image); } } @@ -36,4 +36,11 @@ public List getImageUrls(PlanReview planReview) { .map(PlanReviewImage::getImageUrl) .collect(Collectors.toList()); } + + public void deleteImages(List deleteImgUrls) { + for (String url : deleteImgUrls) { + planReviewImageRepository.deletePlanReviewImageByImageUrl(url); + s3Client.delete(StringUtils.substringAfter(url, "com/")); + } + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java new file mode 100644 index 0000000..3051189 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java @@ -0,0 +1,2 @@ +package Journey.Together.domain.plan;public class PlanReviewService { +} diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 9a79c0d..ccd3005 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -14,8 +14,8 @@ import Journey.Together.domain.plan.service.deleter.PlanDeleter; import Journey.Together.domain.plan.service.factory.PlanFactory; import Journey.Together.domain.plan.service.factory.PlanReviewFactory; -import Journey.Together.domain.plan.service.factory.PlanReviewImageFactory; import Journey.Together.domain.plan.service.modifier.PlanModifier; +import Journey.Together.domain.plan.service.modifier.PlanReviewModifier; import Journey.Together.domain.plan.service.query.PlanDetailQueryService; import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.service.validator.PlanReviewValidator; @@ -25,7 +25,6 @@ import Journey.Together.global.exception.ErrorCode; import Journey.Together.global.util.S3Client; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -37,7 +36,10 @@ import java.time.LocalDate; import java.time.Period; import java.time.temporal.ChronoUnit; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; @Service @@ -57,8 +59,8 @@ public class PlanService { private final PlanFactory planFactory; private final PlanReviewFactory planReviewFactory; - private final PlanReviewImageFactory planReviewImageFactory; private final PlanModifier planModifier; + private final PlanReviewModifier planReviewModifier; private final PlanDeleter planDeleter; private final PlanValidator planValidator; @@ -68,7 +70,6 @@ public class PlanService { private final S3Client s3Client; - @Transactional public void savePlan(Member member, PlanReq planReq) { // Validation @@ -86,7 +87,7 @@ public void updatePlan(Member member, Long planId, PlanReq planReq) { Plan plan = planRepository.findPlanByMemberAndPlanIdAndDeletedAtIsNull(member, planId); planValidator.validateExists(plan); //Business - planModifier.modifyPlan(member,plan,planReq); + planModifier.modifyPlan(member, plan, planReq); planPlaceService.savePlacesByDay(planReq.dailyplace(), member, plan); } @@ -125,7 +126,7 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { // Validation Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); planValidator.validateExists(plan); - planValidator.validateWriter(member,plan); + planValidator.validateWriter(member, plan); //Response return planModifier.togglePublic(plan); @@ -139,7 +140,7 @@ public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewR planReviewValidator.validateExists(plan); //Business - PlanReview planReview = planReviewFactory.createPlanReview(member,plan,planReviewReq); + PlanReview planReview = planReviewFactory.createPlanReview(member, plan, planReviewReq); planReviewRepository.save(planReview); if (images != null) { @@ -150,42 +151,22 @@ public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewR } @Transactional - public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq updatePlanReviewReq, List images) { - // Validation + public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq req, List images) { PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); - if (!Objects.equals(planReview.getPlan().getMember().getMemberId(), member.getMemberId())) { - throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); - } - //Business - if (images != null) { - try { - for (MultipartFile file : images) { - String uuid = UUID.randomUUID().toString(); - String url = s3Client.upload(file, member.getProfileUuid(), uuid); - PlanReviewImage planReviewImage = planReviewImageFactory.createPlanReviewImage(planReview,url); - planReviewImageRepository.save(planReviewImage); - } - } catch (RuntimeException e) { - throw new RuntimeException(e.getMessage()); - } + planReviewValidator.validateWriter(member, planReview); + + // 이미지 업로드 + if (images != null && !images.isEmpty()) { + planReviewImageService.uploadAndSaveImages(images, planReview, member.getProfileUuid()); } - if (updatePlanReviewReq != null) { - if (updatePlanReviewReq.grade() != null) { - planReview.setGrade(updatePlanReviewReq.grade()); - } - if (updatePlanReviewReq.content() != null) { - planReview.setContent(updatePlanReviewReq.content()); - } - if (updatePlanReviewReq.deleteImgUrls() != null) { - updatePlanReviewReq.deleteImgUrls().forEach( - deleteImg -> { - planReviewImageRepository.deletePlanReviewImageByImageUrl(deleteImg); - s3Client.delete(StringUtils.substringAfter(deleteImg, "com/")); - } - ); - } + + // 이미지 삭제 + if (req.deleteImgUrls() != null) { + planReviewImageService.deleteImages(req.deleteImgUrls()); } + // 내용 수정 + planReviewModifier.update(planReview, req); } @Transactional diff --git a/src/main/java/Journey/Together/domain/plan/service/modifier/PlanReviewModifier.java b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanReviewModifier.java new file mode 100644 index 0000000..81be4e3 --- /dev/null +++ b/src/main/java/Journey/Together/domain/plan/service/modifier/PlanReviewModifier.java @@ -0,0 +1,18 @@ +package Journey.Together.domain.plan.service.modifier; + +import Journey.Together.domain.plan.dto.UpdatePlanReviewReq; +import Journey.Together.domain.plan.entity.PlanReview; +import org.springframework.stereotype.Component; + +@Component +public class PlanReviewModifier { + + public void update(PlanReview review, UpdatePlanReviewReq req) { + if (req.grade() != null) { + review.setGrade(req.grade()); + } + if (req.content() != null) { + review.setContent(req.content()); + } + } +} diff --git a/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java b/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java index abb1991..cc2d436 100644 --- a/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java +++ b/src/main/java/Journey/Together/domain/plan/service/validator/PlanReviewValidator.java @@ -1,6 +1,8 @@ package Journey.Together.domain.plan.service.validator; +import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.entity.PlanReview; import Journey.Together.domain.plan.repository.PlanReviewRepository; import Journey.Together.global.exception.ApplicationException; import Journey.Together.global.exception.ErrorCode; @@ -16,4 +18,10 @@ public void validateExists(Plan plan) { throw new ApplicationException(ErrorCode.ALREADY_EXIST_EXCEPTION); } } + + public void validateWriter(Member member, PlanReview planReview) { + if (!planReview.getPlan().getMember().getMemberId().equals(member.getMemberId())) { + throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); + } + } } From 65b8eeebb232058390ac9acf668ecb74893886c8 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:40:57 +0900 Subject: [PATCH 16/21] =?UTF-8?q?#132=20PlanReview=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20PlanReviewService=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/controller/PlanController.java | 6 +- .../plan/service/PlanReviewService.java | 71 ++++++++++++++++++- .../domain/plan/service/PlanService.java | 40 ----------- 3 files changed, 74 insertions(+), 43 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index 3eec6b8..7494b1b 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -1,6 +1,7 @@ package Journey.Together.domain.plan.controller; import Journey.Together.domain.plan.dto.*; +import Journey.Together.domain.plan.service.PlanReviewService; import Journey.Together.domain.plan.service.PlanService; import Journey.Together.domain.plan.service.query.PlanReviewQueryService; import Journey.Together.global.common.ApiResponse; @@ -23,6 +24,7 @@ public class PlanController { private final PlanService planService; private final PlanReviewQueryService planReviewQueryService; + private final PlanReviewService planReviewService; @PostMapping("") public ApiResponse savePlan(@AuthenticationPrincipal PrincipalDetails principalDetails,@RequestBody PlanReq planReq){ @@ -59,7 +61,7 @@ public ApiResponse searchPlace(@RequestParam String word, @Pag @PostMapping("/review/{plan_id}") public ApiResponse savePlanReview(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable("plan_id")Long planId, @RequestPart(required = false) List images, @RequestPart PlanReviewReq planReviewReq){ - planService.savePlanReview(principalDetails.getMember(),planId,planReviewReq,images); + planReviewService.savePlanReview(principalDetails.getMember(),planId,planReviewReq,images); return ApiResponse.success(Success.CREATE_REVIEW_SUCCESS); } @@ -70,7 +72,7 @@ public ApiResponse findPlanReview(@AuthenticationPrincipal Princi @PatchMapping("/review/{review_id}") public ApiResponse updatePlanReview(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable("review_id")Long reviewId, @RequestPart(required = false) List images, @RequestPart(required = false) UpdatePlanReviewReq planReviewReq){ - planService.updatePlanReview(principalDetails.getMember(),reviewId,planReviewReq,images); + planReviewService.updatePlanReview(principalDetails.getMember(),reviewId,planReviewReq,images); return ApiResponse.success(Success.UPDATE_REVIEW_SUCCESS); } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java index 3051189..cbaa347 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java @@ -1,2 +1,71 @@ -package Journey.Together.domain.plan;public class PlanReviewService { +package Journey.Together.domain.plan.service; + +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.dto.PlanReviewReq; +import Journey.Together.domain.plan.dto.UpdatePlanReviewReq; +import Journey.Together.domain.plan.entity.Plan; +import Journey.Together.domain.plan.entity.PlanReview; +import Journey.Together.domain.plan.repository.PlanRepository; +import Journey.Together.domain.plan.repository.PlanReviewRepository; +import Journey.Together.domain.plan.service.factory.PlanReviewFactory; +import Journey.Together.domain.plan.service.modifier.PlanModifier; +import Journey.Together.domain.plan.service.modifier.PlanReviewModifier; +import Journey.Together.domain.plan.service.validator.PlanReviewValidator; +import Journey.Together.domain.plan.service.validator.PlanValidator; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDate; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PlanReviewService { + private final PlanRepository planRepository; + private final PlanReviewRepository planReviewRepository; + private final PlanReviewImageService planReviewImageService; + private final PlanReviewModifier planReviewModifier; + private final PlanModifier planModifier; + private final PlanReviewValidator planReviewValidator; + private final PlanValidator planValidator; + private final PlanReviewFactory planReviewFactory; + + @Transactional + public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewReq, List images) { + // Validation + Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); + planValidator.validateExists(plan); + planReviewValidator.validateExists(plan); + + //Business + PlanReview planReview = planReviewFactory.createPlanReview(member, plan, planReviewReq); + planReviewRepository.save(planReview); + + if (images != null) { + planReviewImageService.uploadAndSaveImages(images, planReview, member.getProfileUuid()); + } + + planModifier.updateIsPublic(plan, planReviewReq.isPublic()); + } + + @Transactional + public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq req, List images) { + PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); + planReviewValidator.validateWriter(member, planReview); + + // 이미지 업로드 + if (images != null && !images.isEmpty()) { + planReviewImageService.uploadAndSaveImages(images, planReview, member.getProfileUuid()); + } + + // 이미지 삭제 + if (req.deleteImgUrls() != null) { + planReviewImageService.deleteImages(req.deleteImgUrls()); + } + + // 내용 수정 + planReviewModifier.update(planReview, req); + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index ccd3005..df7330c 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -15,7 +15,6 @@ import Journey.Together.domain.plan.service.factory.PlanFactory; import Journey.Together.domain.plan.service.factory.PlanReviewFactory; import Journey.Together.domain.plan.service.modifier.PlanModifier; -import Journey.Together.domain.plan.service.modifier.PlanReviewModifier; import Journey.Together.domain.plan.service.query.PlanDetailQueryService; import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.service.validator.PlanReviewValidator; @@ -31,7 +30,6 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; import java.time.Period; @@ -60,7 +58,6 @@ public class PlanService { private final PlanFactory planFactory; private final PlanReviewFactory planReviewFactory; private final PlanModifier planModifier; - private final PlanReviewModifier planReviewModifier; private final PlanDeleter planDeleter; private final PlanValidator planValidator; @@ -132,43 +129,6 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { return planModifier.togglePublic(plan); } - @Transactional - public void savePlanReview(Member member, Long planId, PlanReviewReq planReviewReq, List images) { - // Validation - Plan plan = planRepository.findPlanByMemberAndPlanIdAndEndDateIsBeforeAndDeletedAtIsNull(member, planId, LocalDate.now()); - planValidator.validateExists(plan); - planReviewValidator.validateExists(plan); - - //Business - PlanReview planReview = planReviewFactory.createPlanReview(member, plan, planReviewReq); - planReviewRepository.save(planReview); - - if (images != null) { - planReviewImageService.uploadAndSaveImages(images, planReview, member.getProfileUuid()); - } - - planModifier.updateIsPublic(plan, planReviewReq.isPublic()); - } - - @Transactional - public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq req, List images) { - PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); - planReviewValidator.validateWriter(member, planReview); - - // 이미지 업로드 - if (images != null && !images.isEmpty()) { - planReviewImageService.uploadAndSaveImages(images, planReview, member.getProfileUuid()); - } - - // 이미지 삭제 - if (req.deleteImgUrls() != null) { - planReviewImageService.deleteImages(req.deleteImgUrls()); - } - - // 내용 수정 - planReviewModifier.update(planReview, req); - } - @Transactional public void deletePlanReview(Member member, Long reviewId) { //Vailda From 520d657d8792f86b101c9b72a5cb579d5941b879 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:45:06 +0900 Subject: [PATCH 17/21] =?UTF-8?q?#132=20PlanReview=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20PlanService=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/controller/PlanController.java | 2 +- .../plan/service/PlanReviewImageService.java | 10 ++++++++ .../plan/service/PlanReviewService.java | 10 ++++++++ .../domain/plan/service/PlanService.java | 23 ------------------- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index 7494b1b..f101ba5 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -78,7 +78,7 @@ public ApiResponse updatePlanReview(@AuthenticationPrincipal PrincipalDetails pr @DeleteMapping("/review/{review_id}") public ApiResponse deletePlanReview(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable("review_id")Long reviewId){ - planService.deletePlanReview(principalDetails.getMember(),reviewId); + planReviewService.deletePlanReview(principalDetails.getMember(),reviewId); return ApiResponse.success(Success.DELETE_PLAN_REVIEW_SUCCESS); } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java index 496b82c..a3eb2ba 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewImageService.java @@ -43,4 +43,14 @@ public void deleteImages(List deleteImgUrls) { s3Client.delete(StringUtils.substringAfter(url, "com/")); } } + + public void deleteAllImages(PlanReview planReview) { + List images = planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview); + + for (PlanReviewImage image : images) { + String filename = image.getImageUrl().replace(s3Client.baseUrl(), ""); + s3Client.delete(filename); // S3에서 이미지 삭제 + planReviewImageRepository.deletePlanReviewImageByPlanReviewImageId(image.getPlanReviewImageId()); + } + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java b/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java index cbaa347..d908257 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanReviewService.java @@ -68,4 +68,14 @@ public void updatePlanReview(Member member, Long reviewId, UpdatePlanReviewReq r // 내용 수정 planReviewModifier.update(planReview, req); } + + @Transactional + public void deletePlanReview(Member member, Long reviewId) { + PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); + planReviewValidator.validateWriter(member, planReview); + + planReviewImageService.deleteAllImages(planReview); // 이미지 삭제 책임 위임 + + planReviewRepository.deletePlanReviewByPlanReviewId(planReview.getPlanReviewId()); + } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index df7330c..8b4abd7 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -6,8 +6,6 @@ import Journey.Together.domain.place.repository.PlaceRepository; import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.entity.Plan; -import Journey.Together.domain.plan.entity.PlanReview; -import Journey.Together.domain.plan.entity.PlanReviewImage; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; import Journey.Together.domain.plan.repository.PlanReviewRepository; @@ -20,8 +18,6 @@ import Journey.Together.domain.plan.service.validator.PlanReviewValidator; import Journey.Together.domain.plan.service.validator.PlanValidator; import Journey.Together.domain.plan.util.DateUtil; -import Journey.Together.global.exception.ApplicationException; -import Journey.Together.global.exception.ErrorCode; import Journey.Together.global.util.S3Client; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -37,7 +33,6 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; @Service @@ -129,24 +124,6 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { return planModifier.togglePublic(plan); } - @Transactional - public void deletePlanReview(Member member, Long reviewId) { - //Vailda - PlanReview planReview = planReviewRepository.findPlanReviewByPlanReviewIdAndDeletedAtIsNull(reviewId); - if (!Objects.equals(planReview.getPlan().getMember().getMemberId(), member.getMemberId())) { - throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); - } - List planReviewImageList = planReviewImageRepository.findAllByPlanReviewAndDeletedAtIsNull(planReview); - if (planReviewImageList != null) { - for (PlanReviewImage planReviewImage : planReviewImageList) { - String filename = planReviewImage.getImageUrl().replace(s3Client.baseUrl(), ""); - s3Client.delete(filename); - planReviewImageRepository.deletePlanReviewImageByPlanReviewImageId(planReviewImage.getPlanReviewImageId()); - } - } - planReviewRepository.deletePlanReviewByPlanReviewId(planReview.getPlanReviewId()); - } - @Transactional public List findMyPlans(Member member) { //Vaildation From 3fc12fad6b8ddcef2626d30147eb627124617849 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:00:55 +0900 Subject: [PATCH 18/21] =?UTF-8?q?#132=20=EB=82=B4=20=EC=9D=BC=EC=A0=95=20?= =?UTF-8?q?=EA=B0=80=EC=9E=A5=20=EC=B5=9C=EC=8B=A0=203=EA=B0=9C=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F?= =?UTF-8?q?=20PlanService=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/controller/PlanController.java | 4 +- .../domain/plan/service/PlanService.java | 34 ----------------- .../plan/service/query/PlanQueryService.java | 38 +++++++++++++++++++ 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index f101ba5..f61b70b 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -3,6 +3,7 @@ import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.service.PlanReviewService; import Journey.Together.domain.plan.service.PlanService; +import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.service.query.PlanReviewQueryService; import Journey.Together.global.common.ApiResponse; import Journey.Together.global.exception.Success; @@ -25,6 +26,7 @@ public class PlanController { private final PlanService planService; private final PlanReviewQueryService planReviewQueryService; private final PlanReviewService planReviewService; + private final PlanQueryService planQueryService; @PostMapping("") public ApiResponse savePlan(@AuthenticationPrincipal PrincipalDetails principalDetails,@RequestBody PlanReq planReq){ @@ -104,7 +106,7 @@ public ApiResponse findPalnDetailInfo(@PathVariable("plan_id")Lon @GetMapping("/my") public ApiResponse> findMyPlans(@AuthenticationPrincipal PrincipalDetails principalDetails) { - return ApiResponse.success(Success.GET_MYPLAN_SUCCESS,planService.findMyPlans(principalDetails.getMember())); + return ApiResponse.success(Success.GET_MYPLAN_SUCCESS,planQueryService.findMyPlans(principalDetails.getMember())); } @GetMapping("/my/not-complete") diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 8b4abd7..80b2520 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -28,10 +28,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.time.Period; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -124,36 +120,6 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { return planModifier.togglePublic(plan); } - @Transactional - public List findMyPlans(Member member) { - //Vaildation - List list = planRepository.findAllByMemberAndDeletedAtIsNull(member); - //Business - List top3list = list.stream() - .sorted(Comparator.comparingLong(plan -> Math.abs(ChronoUnit.DAYS.between(LocalDate.now(), plan.getStartDate())))) - .limit(3) - .toList(); - List myPlanResList = new ArrayList<>(); - for (Plan plan : top3list) { - String image = planQueryService.getFirstPlaceImageOfPlan(plan); - String remainDate = null; - Boolean hasReview = null; - if (LocalDate.now().isAfter(plan.getEndDate())) { - hasReview = planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan); - } else if ((LocalDate.now().isEqual(plan.getStartDate()) || LocalDate.now().isAfter(plan.getStartDate())) && (LocalDate.now().isEqual(plan.getEndDate()) || LocalDate.now().isBefore(plan.getEndDate()))) { - remainDate = "D-DAY"; - } else if (LocalDate.now().isBefore(plan.getStartDate())) { - Period period = Period.between(LocalDate.now(), plan.getStartDate()); - remainDate = "D-" + period.getDays(); - } - MyPlanRes myPlanRes = MyPlanRes.of(plan, image, remainDate, hasReview); - myPlanResList.add(myPlanRes); - } - - //Response - return myPlanResList; - } - @Transactional public PlaceInfoPageRes searchPlace(String word, Pageable page) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java index 34fd3d3..e11a53c 100644 --- a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java @@ -1,18 +1,30 @@ package Journey.Together.domain.plan.service.query; +import Journey.Together.domain.member.entity.Member; +import Journey.Together.domain.plan.dto.MyPlanRes; import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.repository.DayRepository; +import Journey.Together.domain.plan.repository.PlanRepository; +import Journey.Together.domain.plan.repository.PlanReviewRepository; +import Journey.Together.domain.plan.util.DateUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class PlanQueryService { private final DayRepository dayRepository; + private final PlanRepository planRepository; + private final PlanReviewRepository planReviewRepository; public String getFirstPlaceImageOfPlan(Plan plan) { List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); @@ -34,4 +46,30 @@ public List getPlaceImageListOfPlan(Plan plan) { } return null; } + + @Transactional(readOnly = true) + public List findMyPlans(Member member) { + List plans = planRepository.findAllByMemberAndDeletedAtIsNull(member); + + List top3 = plans.stream() + .sorted(Comparator.comparingLong(plan -> + Math.abs(ChronoUnit.DAYS.between(LocalDate.now(), plan.getStartDate())))) + .limit(3) + .toList(); + + return top3.stream() + .map(plan -> { + String image = getFirstPlaceImageOfPlan(plan); + String remainDate = DateUtil.getRemainDateString(plan.getStartDate(), plan.getEndDate()); + Boolean hasReview = null; + + if (LocalDate.now().isAfter(plan.getEndDate())) { + hasReview = planReviewRepository.existsAllByPlanAndDeletedAtIsNull(plan); + } + + return MyPlanRes.of(plan, image, remainDate, hasReview); + }) + .collect(Collectors.toList()); + } + } From 29cf605f8e04b6bf7506482041c2761df61aab35 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:05:51 +0900 Subject: [PATCH 19/21] =?UTF-8?q?PlaceQueryService=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EC=9E=A5=EC=86=8C=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20?= =?UTF-8?q?PlanService=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/query/PlaceQueryService.java | 42 +++++++++++++++++++ .../plan/controller/PlanController.java | 4 +- .../domain/plan/service/PlanService.java | 11 ----- 3 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 src/main/java/Journey/Together/domain/place/service/query/PlaceQueryService.java diff --git a/src/main/java/Journey/Together/domain/place/service/query/PlaceQueryService.java b/src/main/java/Journey/Together/domain/place/service/query/PlaceQueryService.java new file mode 100644 index 0000000..d1e74dc --- /dev/null +++ b/src/main/java/Journey/Together/domain/place/service/query/PlaceQueryService.java @@ -0,0 +1,42 @@ +package Journey.Together.domain.place.service.query; + +import Journey.Together.domain.place.entity.Place; +import Journey.Together.domain.place.repository.PlaceRepository; +import Journey.Together.domain.plan.dto.PlaceInfo; +import Journey.Together.domain.plan.dto.PlaceInfoPageRes; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class PlaceQueryService { + + private final PlaceRepository placeRepository; + + @Transactional(readOnly = true) + public PlaceInfoPageRes searchPlace(String word, Pageable page) { + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); + Page placePage = placeRepository.findAllByNameContainsOrderByCreatedAtDesc(word, pageable); + List placeInfoList = placePage.getContent().stream() + .map(PlaceInfo::of) + .collect(Collectors.toList()); + + return PlaceInfoPageRes.of( + placeInfoList, + placePage.getNumber(), + placePage.getSize(), + placePage.getTotalPages(), + placePage.isLast(), + placePage.getTotalElements() + ); + } +} + diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index f61b70b..b671c5c 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -1,5 +1,6 @@ package Journey.Together.domain.plan.controller; +import Journey.Together.domain.place.service.query.PlaceQueryService; import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.service.PlanReviewService; import Journey.Together.domain.plan.service.PlanService; @@ -27,6 +28,7 @@ public class PlanController { private final PlanReviewQueryService planReviewQueryService; private final PlanReviewService planReviewService; private final PlanQueryService planQueryService; + private final PlaceQueryService placeQueryService; @PostMapping("") public ApiResponse savePlan(@AuthenticationPrincipal PrincipalDetails principalDetails,@RequestBody PlanReq planReq){ @@ -58,7 +60,7 @@ public ApiResponse updatePlanIsPublic(@AuthenticationPrincipal PrincipalDetails @GetMapping("/search") public ApiResponse searchPlace(@RequestParam String word, @PageableDefault(size = 6,page = 0) Pageable pageable){ - return ApiResponse.success(Success.SEARCH_SUCCESS,planService.searchPlace(word,pageable)); + return ApiResponse.success(Success.SEARCH_SUCCESS,placeQueryService.searchPlace(word,pageable)); } @PostMapping("/review/{plan_id}") diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 80b2520..0c91a05 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -2,7 +2,6 @@ import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.member.validator.MemberValidator; -import Journey.Together.domain.place.entity.Place; import Journey.Together.domain.place.repository.PlaceRepository; import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.entity.Plan; @@ -120,16 +119,6 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { return planModifier.togglePublic(plan); } - @Transactional - public PlaceInfoPageRes searchPlace(String word, Pageable page) { - Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); - Page placePage = placeRepository.findAllByNameContainsOrderByCreatedAtDesc(word, pageable); - List placeInfoList = placePage.getContent().stream() - .map(PlaceInfo::of) - .collect(Collectors.toList()); - return PlaceInfoPageRes.of(placeInfoList, placePage.getNumber(), placePage.getSize(), placePage.getTotalPages(), placePage.isLast(), placePage.getTotalElements()); - } - @Transactional public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compelete) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); From 2865f2d860f68c8cb4e48f381a945819a079efad Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:16:32 +0900 Subject: [PATCH 20/21] =?UTF-8?q?#132=20=EC=99=84=EB=A3=8C=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=82=B4=20=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20PlanServi?= =?UTF-8?q?ce=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/controller/PlanController.java | 4 +-- .../domain/plan/service/PlanService.java | 21 --------------- .../plan/service/query/PlanQueryService.java | 26 +++++++++++++++++++ 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index b671c5c..0175c85 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -113,11 +113,11 @@ public ApiResponse> findMyPlans(@AuthenticationPrincipal Princip @GetMapping("/my/not-complete") public ApiResponse findNotComplete(@AuthenticationPrincipal PrincipalDetails principalDetails,@PageableDefault(size = 6,page = 0) Pageable pageable){ - return ApiResponse.success(Success.SEARCH_SUCCESS,planService.findIsCompelete(principalDetails.getMember(),pageable,false)); + return ApiResponse.success(Success.SEARCH_SUCCESS,planQueryService.findIsCompelete(principalDetails.getMember(),pageable,false)); } @GetMapping("/my/complete") public ApiResponse findComplete(@AuthenticationPrincipal PrincipalDetails principalDetails,@PageableDefault(size = 6) Pageable pageable){ - return ApiResponse.success(Success.SEARCH_SUCCESS,planService.findIsCompelete(principalDetails.getMember(),pageable,true)); + return ApiResponse.success(Success.SEARCH_SUCCESS,planQueryService.findIsCompelete(principalDetails.getMember(),pageable,true)); } } diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 0c91a05..7ccbdd7 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -16,7 +16,6 @@ import Journey.Together.domain.plan.service.query.PlanQueryService; import Journey.Together.domain.plan.service.validator.PlanReviewValidator; import Journey.Together.domain.plan.service.validator.PlanValidator; -import Journey.Together.domain.plan.util.DateUtil; import Journey.Together.global.util.S3Client; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -119,26 +118,6 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { return planModifier.togglePublic(plan); } - @Transactional - public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compelete) { - Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); - Page planPage; - List planResList; - if (compelete) { - planPage = planRepository.findAllByMemberAndEndDateBeforeAndDeletedAtIsNull(member, LocalDate.now(), pageable); - planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan, planQueryService.getFirstPlaceImageOfPlan(plan), null, planReviewRepository.existsAllByPlanAndReportFilter(plan))) - .collect(Collectors.toList()); - } else { - planPage = planRepository.findAllByMemberAndEndDateGreaterThanEqualAndDeletedAtIsNull(member, LocalDate.now(), pageable); - planResList = planPage.getContent().stream() - .map(plan -> PlanRes.of(plan, planQueryService.getFirstPlaceImageOfPlan(plan), DateUtil.getRemainDateString(plan.getStartDate(), plan.getEndDate()), null)) - .collect(Collectors.toList()); - } - - return PlanPageRes.of(planResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); - } - @Transactional public OpenPlanPageRes findOpenPlans(Pageable page) { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java index e11a53c..d92b4bc 100644 --- a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java @@ -2,6 +2,8 @@ import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.plan.dto.MyPlanRes; +import Journey.Together.domain.plan.dto.PlanPageRes; +import Journey.Together.domain.plan.dto.PlanRes; import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.repository.DayRepository; @@ -9,6 +11,10 @@ import Journey.Together.domain.plan.repository.PlanReviewRepository; import Journey.Together.domain.plan.util.DateUtil; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -72,4 +78,24 @@ public List findMyPlans(Member member) { .collect(Collectors.toList()); } + @Transactional + public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compelete) { + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); + Page planPage; + List planResList; + if (compelete) { + planPage = planRepository.findAllByMemberAndEndDateBeforeAndDeletedAtIsNull(member, LocalDate.now(), pageable); + planResList = planPage.getContent().stream() + .map(plan -> PlanRes.of(plan, getFirstPlaceImageOfPlan(plan), null, planReviewRepository.existsAllByPlanAndReportFilter(plan))) + .collect(Collectors.toList()); + } else { + planPage = planRepository.findAllByMemberAndEndDateGreaterThanEqualAndDeletedAtIsNull(member, LocalDate.now(), pageable); + planResList = planPage.getContent().stream() + .map(plan -> PlanRes.of(plan, getFirstPlaceImageOfPlan(plan), DateUtil.getRemainDateString(plan.getStartDate(), plan.getEndDate()), null)) + .collect(Collectors.toList()); + } + + return PlanPageRes.of(planResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); + } + } From e0aa15cc79c92e83acaf061226de25e5ac7aa074 Mon Sep 17 00:00:00 2001 From: sycuuui <102959791+sycuuui@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:20:29 +0900 Subject: [PATCH 21/21] =?UTF-8?q?#132=20=EA=B3=B5=EA=B0=9C=20=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20PlanServi?= =?UTF-8?q?ce=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/controller/PlanController.java | 2 +- .../domain/plan/service/PlanService.java | 20 +++---------------- .../plan/service/query/PlanQueryService.java | 16 ++++++++++++--- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java index 0175c85..fe5f1ef 100644 --- a/src/main/java/Journey/Together/domain/plan/controller/PlanController.java +++ b/src/main/java/Journey/Together/domain/plan/controller/PlanController.java @@ -93,7 +93,7 @@ public ApiResponse findPlanReviewGuest(@PathVariable("plan_id")Lo @GetMapping("/open") public ApiResponse findOpenPlans(@PageableDefault(size = 6) Pageable pageable){ - return ApiResponse.success(Success.SEARCH_SUCCESS,planService.findOpenPlans(pageable)); + return ApiResponse.success(Success.SEARCH_SUCCESS,planQueryService.findOpenPlans(pageable)); } @GetMapping("/detail/{plan_id}") diff --git a/src/main/java/Journey/Together/domain/plan/service/PlanService.java b/src/main/java/Journey/Together/domain/plan/service/PlanService.java index 7ccbdd7..76b0975 100644 --- a/src/main/java/Journey/Together/domain/plan/service/PlanService.java +++ b/src/main/java/Journey/Together/domain/plan/service/PlanService.java @@ -3,7 +3,9 @@ import Journey.Together.domain.member.entity.Member; import Journey.Together.domain.member.validator.MemberValidator; import Journey.Together.domain.place.repository.PlaceRepository; -import Journey.Together.domain.plan.dto.*; +import Journey.Together.domain.plan.dto.PlanDetailRes; +import Journey.Together.domain.plan.dto.PlanReq; +import Journey.Together.domain.plan.dto.PlanRes; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewImageRepository; @@ -18,16 +20,10 @@ import Journey.Together.domain.plan.service.validator.PlanValidator; import Journey.Together.global.util.S3Client; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.List; -import java.util.stream.Collectors; @Service @Transactional(readOnly = true) @@ -117,14 +113,4 @@ public Boolean updatePlanIsPublic(Member member, Long planId) { //Response return planModifier.togglePublic(plan); } - - @Transactional - public OpenPlanPageRes findOpenPlans(Pageable page) { - Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); - Page planPage = planRepository.findOpenPlans(LocalDate.now(), pageable); - List openPlanResList = planPage.getContent().stream() - .map(plan -> OpenPlanRes.of(plan, s3Client.baseUrl() + plan.getMember().getProfileUuid() + "/profile_" + plan.getMember().getProfileUuid(), planQueryService.getFirstPlaceImageOfPlan(plan))) - .collect(Collectors.toList()); - return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); - } } diff --git a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java index d92b4bc..e032c35 100644 --- a/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java +++ b/src/main/java/Journey/Together/domain/plan/service/query/PlanQueryService.java @@ -1,15 +1,14 @@ package Journey.Together.domain.plan.service.query; import Journey.Together.domain.member.entity.Member; -import Journey.Together.domain.plan.dto.MyPlanRes; -import Journey.Together.domain.plan.dto.PlanPageRes; -import Journey.Together.domain.plan.dto.PlanRes; +import Journey.Together.domain.plan.dto.*; import Journey.Together.domain.plan.entity.Day; import Journey.Together.domain.plan.entity.Plan; import Journey.Together.domain.plan.repository.DayRepository; import Journey.Together.domain.plan.repository.PlanRepository; import Journey.Together.domain.plan.repository.PlanReviewRepository; import Journey.Together.domain.plan.util.DateUtil; +import Journey.Together.global.util.S3UrlUtil; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -31,6 +30,7 @@ public class PlanQueryService { private final DayRepository dayRepository; private final PlanRepository planRepository; private final PlanReviewRepository planReviewRepository; + private final S3UrlUtil s3UrlUtil; public String getFirstPlaceImageOfPlan(Plan plan) { List dayList = dayRepository.findByPlanOrderByCreatedAtDesc(plan); @@ -98,4 +98,14 @@ public PlanPageRes findIsCompelete(Member member, Pageable page, Boolean compele return PlanPageRes.of(planResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); } + @Transactional + public OpenPlanPageRes findOpenPlans(Pageable page) { + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.by("createdAt").descending()); + Page planPage = planRepository.findOpenPlans(LocalDate.now(), pageable); + List openPlanResList = planPage.getContent().stream() + .map(plan -> OpenPlanRes.of(plan, s3UrlUtil.generateProfileUrl(plan.getMember().getProfileUuid()), getFirstPlaceImageOfPlan(plan))) + .collect(Collectors.toList()); + return OpenPlanPageRes.of(openPlanResList, planPage.getNumber(), planPage.getSize(), planPage.getTotalPages(), planPage.isLast()); + } + }