From e8b6b4d14859ec0414088a222693f55f02c76699 Mon Sep 17 00:00:00 2001 From: yoojinche Date: Thu, 14 Aug 2025 23:56:44 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BB=EF=B8=8Frefractor:=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/query/DateQueryController.java | 13 +++--- .../domain/date/converter/DateConverter.java | 45 ++++++++++++++----- .../date/dto/response/DateResponseDTO.java | 24 ++++++++-- .../DateCourseBookmarkRepository.java | 12 ++++- .../date/service/query/DateQueryService.java | 4 +- .../service/query/DateQueryServiceImpl.java | 19 ++++++-- 6 files changed, 91 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/controller/query/DateQueryController.java b/src/main/java/org/withtime/be/withtimebe/domain/date/controller/query/DateQueryController.java index c8dd7fb..12beed6 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/controller/query/DateQueryController.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/controller/query/DateQueryController.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import lombok.RequiredArgsConstructor; import org.namul.api.payload.response.DefaultResponse; +import org.springdoc.core.annotations.ParameterObject; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -31,13 +32,13 @@ public class DateQueryController { @ApiResponse(responseCode = "404", description = "DATE_COURSE404_1 : 해당하는 데이트 코스를 찾을 수 없습니다.") }) @SwaggerPageable - @PostMapping("/") + @GetMapping public DefaultResponse findDateCourses( @PageableDefault(page = 0, size = 10) Pageable pageable, - @RequestBody DateRequestDTO.DateCourseSearchCond dateCourseSearchCond + @ParameterObject DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, + @AuthenticatedMember Member member ) { - Page dateCourses = dateQueryService.findDateCourses(dateCourseSearchCond, pageable); - DateResponseDTO.DateCourseList response = DateConverter.createDateCourseList(dateCourses); + DateResponseDTO.DateCourseList response = dateQueryService.findDateCourses(dateCourseSearchCond, pageable, member); return DefaultResponse.ok(response); } @@ -51,11 +52,11 @@ public DefaultResponse findDateCourses( @PostMapping("/bookmarks") public DefaultResponse findDateCourseBookmark( @PageableDefault(page = 0, size = 10) Pageable pageable, - @RequestBody DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, + @ModelAttribute DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, @AuthenticatedMember Member member ){ Page bookmarkedDateCourses = dateQueryService.findDateCourseBookmarks(dateCourseSearchCond, pageable, member); - DateResponseDTO.DateCourseList response = DateConverter.createDateCourseList(bookmarkedDateCourses); + DateResponseDTO.DateCourseList response = DateConverter.createDateCourseList(bookmarkedDateCourses, null, dateCourseSearchCond); return DefaultResponse.ok(response); } } diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/converter/DateConverter.java b/src/main/java/org/withtime/be/withtimebe/domain/date/converter/DateConverter.java index 338b946..5a75a08 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/converter/DateConverter.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/converter/DateConverter.java @@ -10,8 +10,9 @@ import org.withtime.be.withtimebe.domain.member.entity.Member; import java.time.LocalDateTime; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Set; public class DateConverter { @@ -37,12 +38,10 @@ public static DateCourse createDateCourse(DateRequestDTO.SaveDateCourse dateCour .build(); } - // 나중에 생성한 정보를 리턴하는 데 사용,,? 근데 애초에 그 뭐야 - // builder()로 만들 때 잘 만들어주면 안되냐 // List -> DateResponseDTO.DateCourseInfo public static DateResponseDTO.DateCourse createDateCourseInfo(List datePlaces){ List datePlaceDtos = datePlaces.stream() - .map(DateConverter::createDatePlace) + .map(dp -> DateConverter.createDatePlace(dp, null, null)) .toList(); return DateResponseDTO.DateCourse.builder() @@ -51,7 +50,9 @@ public static DateResponseDTO.DateCourse createDateCourseInfo(List da } // DatePlace -> DateResponseDTO.DatePlace - public static DateResponseDTO.DatePlace createDatePlace(DatePlace datePlace) { + public static DateResponseDTO.DatePlace createDatePlace(DatePlace datePlace, + LocalDateTime startTime, + LocalDateTime endTime) { return DateResponseDTO.DatePlace.builder() .name(datePlace.getName()) .image(datePlace.getImage()) @@ -63,28 +64,49 @@ public static DateResponseDTO.DatePlace createDatePlace(DatePlace datePlace) { .roadNameAddress(datePlace.getRoadNameAddress()) .lotNumberAddress(datePlace.getLotNumberAddress()) .placeType(datePlace.getPlaceType()) + .startTime(startTime) + .endTime(endTime) .build(); } // DateResponseDTO.DateCourse -> DateResponseDTO.DateCourse - public static DateResponseDTO.DateCourse createDateCourse(DateCourse dateCourse){ - + public static DateResponseDTO.DateCourse createDateCourse(DateCourse dateCourse, + Set bookmarkedIds, + DateRequestDTO.DateCourseSearchCond cond){ + Boolean bookmarked = null; + if (!bookmarkedIds.isEmpty()) bookmarked = bookmarkedIds.contains(dateCourse.getId()); List datePlaces = dateCourse.getDatePlaceDateCourses().stream() - .map(DatePlaceDateCourse::getDatePlace) - .map(DateConverter::createDatePlace) + .map(dc -> DateConverter.createDatePlace(dc.getDatePlace(), dc.getStartTime(), dc.getEndTime())) .toList(); return DateResponseDTO.DateCourse.builder() .dateCourseId(dateCourse.getId()) .name(dateCourse.getName()) .datePlaces(datePlaces) + .isBookmarked(bookmarked) + .dateCourseSearchCondInfo(createSearchCond(cond)) + .build(); + } + + public static DateResponseDTO.DateCourseSearchCondInfo createSearchCond(DateRequestDTO.DateCourseSearchCond cond){ + return DateResponseDTO.DateCourseSearchCondInfo.builder() + .budget(cond.budget()) + .datePlaces(cond.datePlaces()) + .mealTypes(cond.mealTypes()) + .transportation(cond.transportation()) + .dateDurationTime(cond.dateDurationTime()) + .userPreferredKeywords(cond.userPreferredKeywords()) .build(); } // Page -> DateRequestDTO.DateCourseList - public static DateResponseDTO.DateCourseList createDateCourseList(Page dateCourses){ + public static DateResponseDTO.DateCourseList createDateCourseList(Page dateCourses, Set bookmarkedIds, + DateRequestDTO.DateCourseSearchCond cond){ List dateCourseList = dateCourses.stream() - .map(DateConverter::createDateCourse) + .map(dc ->{ + if (bookmarkedIds != null) return createDateCourse(dc, bookmarkedIds, cond); + return createDateCourse(dc, Collections.emptySet(), cond); + }) .toList(); return DateResponseDTO.DateCourseList.builder() @@ -93,6 +115,7 @@ public static DateResponseDTO.DateCourseList createDateCourseList(Page datePlaces + List datePlaces, + DateCourseSearchCondInfo dateCourseSearchCondInfo, + Boolean isBookmarked ){} @Builder @@ -39,6 +44,17 @@ public record DateCourseList( Integer totalPages, Integer currentPage, Integer currentSize, - Boolean hasNextPage + Boolean hasNextPage, + Long totalCount + ){} + + @Builder + public record DateCourseSearchCondInfo( + DatePriceRange budget, + List datePlaces, + DateTime dateDurationTime, + List mealTypes, + Transportation transportation, + List userPreferredKeywords ){} } diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/repository/DateCourseBookmarkRepository.java b/src/main/java/org/withtime/be/withtimebe/domain/date/repository/DateCourseBookmarkRepository.java index 1d60c00..85d223f 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/repository/DateCourseBookmarkRepository.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/repository/DateCourseBookmarkRepository.java @@ -1,12 +1,22 @@ package org.withtime.be.withtimebe.domain.date.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.withtime.be.withtimebe.domain.date.entity.DateCourse; import org.withtime.be.withtimebe.domain.date.entity.DateCourseBookmark; import org.withtime.be.withtimebe.domain.member.entity.Member; +import java.util.List; import java.util.Optional; public interface DateCourseBookmarkRepository extends JpaRepository { - Optional findByMemberAndDateCourse(Member member, DateCourse dateCourse); + Optional findByMemberAndDateCourse(Member member, DateCourse dateCourse); + + @Query(""" + select b.dateCourse.id + from DateCourseBookmark b + where b.member.id = :memberId + and b.dateCourse.id in :courseIds + """) + List findBookmarkedCourseIds(Long memberId, List courseIds); } diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryService.java b/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryService.java index 5431154..09ed177 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryService.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryService.java @@ -3,10 +3,12 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.withtime.be.withtimebe.domain.date.dto.request.DateRequestDTO; +import org.withtime.be.withtimebe.domain.date.dto.response.DateResponseDTO; import org.withtime.be.withtimebe.domain.date.entity.DateCourse; import org.withtime.be.withtimebe.domain.member.entity.Member; public interface DateQueryService { - public Page findDateCourses(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable); + public DateResponseDTO.DateCourseList findDateCourses(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable, Member member); public Page findDateCourseBookmarks(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable, Member member); + public Boolean checkBookmark(Member member, DateCourse dateCourse); } diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java b/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java index 00e4be5..829d230 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java @@ -7,13 +7,15 @@ import org.springframework.transaction.annotation.Transactional; import org.withtime.be.withtimebe.domain.date.converter.DateConverter; import org.withtime.be.withtimebe.domain.date.dto.request.DateRequestDTO; +import org.withtime.be.withtimebe.domain.date.dto.response.DateResponseDTO; import org.withtime.be.withtimebe.domain.date.entity.DateCourse; -import org.withtime.be.withtimebe.domain.date.entity.DateCourseBookmark; import org.withtime.be.withtimebe.domain.date.repository.DateCourseBookmarkRepository; import org.withtime.be.withtimebe.domain.date.repository.DateCourseRepository; import org.withtime.be.withtimebe.domain.member.entity.Member; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Service @Transactional(readOnly = true) @@ -21,13 +23,24 @@ public class DateQueryServiceImpl implements DateQueryService { private final DateCourseRepository dateCourseRepository; + private final DateCourseBookmarkRepository dateCourseBookmarkRepository; - public Page findDateCourses(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable){ - return dateCourseRepository.searchDateCourseByApplyPage(dateCourseSearchCond, pageable); + public DateResponseDTO.DateCourseList findDateCourses(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable, Member member){ + Page dateCourses = dateCourseRepository.searchDateCourseByApplyPage(dateCourseSearchCond, pageable); + List ids = dateCourses.getContent().stream().map(DateCourse::getId).toList(); + Set bookmarkedIds = + (member != null && !ids.isEmpty()) + ? new HashSet<>(dateCourseBookmarkRepository.findBookmarkedCourseIds(member.getId(), ids)) + : java.util.Collections.emptySet(); + + return DateConverter.createDateCourseList(dateCourses, bookmarkedIds, dateCourseSearchCond); } public Page findDateCourseBookmarks(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable, Member member){ return dateCourseRepository.searchDateCourseBookmarkByMemberAndApplyPage(dateCourseSearchCond, member, pageable); } + public Boolean checkBookmark(Member member, DateCourse dateCourse){ + return dateCourseBookmarkRepository.findByMemberAndDateCourse(member, dateCourse).isPresent(); + } } From b7dcb0af9acefcad350a995c04a88af2893d9877 Mon Sep 17 00:00:00 2001 From: yoojinche Date: Fri, 15 Aug 2025 01:28:26 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E2=99=BB=EF=B8=8Frefractor:=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/date/service/query/DateQueryServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java b/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java index a06ae17..f49b919 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/service/query/DateQueryServiceImpl.java @@ -5,6 +5,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.withtime.be.withtimebe.domain.date.converter.DateConverter; import org.withtime.be.withtimebe.domain.date.dto.request.DateRequestDTO; import org.withtime.be.withtimebe.domain.date.dto.response.DateResponseDTO; import org.withtime.be.withtimebe.domain.date.entity.DateCourse; @@ -41,9 +42,9 @@ public DateResponseDTO.DateCourseList findDateCourses(DateRequestDTO.DateCourseS @LogPlaceCategory @GetPoint(action = PointAction.VIEW_DATE_COURSE) - public Page findDateCourses(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable){ + public Page findDateCourses(DateRequestDTO.DateCourseSearchCond dateCourseSearchCond, Pageable pageable) { return dateCourseRepository.searchDateCourseByApplyPage(dateCourseSearchCond, pageable); - + } @LogPlaceCategory @GetPoint(action = PointAction.VIEW_DATE_COURSE) From df38cd2ba6ca4d15da704f6652a798db18ae8894 Mon Sep 17 00:00:00 2001 From: yoojinche Date: Fri, 15 Aug 2025 01:31:26 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E2=99=BB=EF=B8=8Frefractor:=20=EA=B0=84?= =?UTF-8?q?=EB=8B=A8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../be/withtimebe/domain/date/dto/response/DateResponseDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/withtime/be/withtimebe/domain/date/dto/response/DateResponseDTO.java b/src/main/java/org/withtime/be/withtimebe/domain/date/dto/response/DateResponseDTO.java index f596512..7b6cfbb 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/date/dto/response/DateResponseDTO.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/date/dto/response/DateResponseDTO.java @@ -35,7 +35,7 @@ public record DateCourse( String name, List datePlaces, DateCourseSearchCondInfo dateCourseSearchCondInfo, - Boolean isBookmarked + Boolean isBookmarked, String signature ){}