From 2f6777ea002ef9b9d7b69eb4aee6ecb87a7fc7c0 Mon Sep 17 00:00:00 2001 From: Suhyeon <70002218+onpyeong@users.noreply.github.com> Date: Tue, 11 Jul 2023 10:49:37 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A7=80=EC=97=AD=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=81=ED=86=A0=ED=81=AC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * modify: 지역으로 공간 조회 RequestBody CityRequestDto로 통일 * feat: 지역으로 북토크 리스트 조회 * fix: @Transitional 추가 * fix: url과 Valid 설정 --- .../sophy/controller/BooktalkController.java | 27 ++++++++++ .../sophy/controller/PlaceController.java | 9 ++-- ...aceRequestDto.java => CityRequestDto.java} | 5 +- .../dto/response/BooktalkResponseDto.java | 37 ++++++++++++++ .../sophy/sophy/exception/SuccessStatus.java | 1 + .../infrastructure/BooktalkRepository.java | 13 +++++ .../sophy/sophy/service/BooktalkService.java | 49 +++++++++++++++++++ .../org/sophy/sophy/service/PlaceService.java | 6 +-- 8 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/sophy/sophy/controller/BooktalkController.java rename src/main/java/org/sophy/sophy/controller/dto/request/{PlaceRequestDto.java => CityRequestDto.java} (61%) create mode 100644 src/main/java/org/sophy/sophy/controller/dto/response/BooktalkResponseDto.java create mode 100644 src/main/java/org/sophy/sophy/infrastructure/BooktalkRepository.java create mode 100644 src/main/java/org/sophy/sophy/service/BooktalkService.java diff --git a/src/main/java/org/sophy/sophy/controller/BooktalkController.java b/src/main/java/org/sophy/sophy/controller/BooktalkController.java new file mode 100644 index 0000000..e68718c --- /dev/null +++ b/src/main/java/org/sophy/sophy/controller/BooktalkController.java @@ -0,0 +1,27 @@ +package org.sophy.sophy.controller; + +import lombok.RequiredArgsConstructor; +import org.sophy.sophy.common.dto.ApiResponseDto; +import org.sophy.sophy.controller.dto.request.CityRequestDto; +import org.sophy.sophy.controller.dto.response.BooktalkResponseDto; +import org.sophy.sophy.exception.SuccessStatus; +import org.sophy.sophy.service.BooktalkService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("booktalk") +public class BooktalkController { + private final BooktalkService booktalkService; + + @GetMapping("/search") + public ApiResponseDto> getPlacesByCity(@Valid @RequestBody CityRequestDto cityRequestDto) { + return ApiResponseDto.success(SuccessStatus.GET_BOOKTALKS_BY_CITY_SUCCESS, booktalkService.getBooktalksByCity(cityRequestDto)); + } +} diff --git a/src/main/java/org/sophy/sophy/controller/PlaceController.java b/src/main/java/org/sophy/sophy/controller/PlaceController.java index 393df01..61a91c3 100644 --- a/src/main/java/org/sophy/sophy/controller/PlaceController.java +++ b/src/main/java/org/sophy/sophy/controller/PlaceController.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import org.sophy.sophy.common.dto.ApiResponseDto; -import org.sophy.sophy.controller.dto.request.PlaceRequestDto; +import org.sophy.sophy.controller.dto.request.CityRequestDto; import org.sophy.sophy.controller.dto.response.PlaceResponseDto; import org.sophy.sophy.exception.SuccessStatus; import org.sophy.sophy.service.PlaceService; @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.validation.Valid; import java.util.List; @RestController @@ -19,8 +20,8 @@ public class PlaceController { private final PlaceService placeService; - @GetMapping - public ApiResponseDto> getPlacesByCity(@RequestBody PlaceRequestDto placeRequestDto) { - return ApiResponseDto.success(SuccessStatus.GET_PLACES_BY_CITY_SUCCESS, placeService.getPlacesByCity(placeRequestDto)); + @GetMapping("/search") + public ApiResponseDto> getPlacesByCity(@Valid @RequestBody CityRequestDto cityRequestDto) { + return ApiResponseDto.success(SuccessStatus.GET_PLACES_BY_CITY_SUCCESS, placeService.getPlacesByCity(cityRequestDto)); } } diff --git a/src/main/java/org/sophy/sophy/controller/dto/request/PlaceRequestDto.java b/src/main/java/org/sophy/sophy/controller/dto/request/CityRequestDto.java similarity index 61% rename from src/main/java/org/sophy/sophy/controller/dto/request/PlaceRequestDto.java rename to src/main/java/org/sophy/sophy/controller/dto/request/CityRequestDto.java index 41489cf..c3bda70 100644 --- a/src/main/java/org/sophy/sophy/controller/dto/request/PlaceRequestDto.java +++ b/src/main/java/org/sophy/sophy/controller/dto/request/CityRequestDto.java @@ -3,7 +3,10 @@ import lombok.Getter; import org.sophy.sophy.domain.City; +import javax.validation.constraints.NotNull; + @Getter -public class PlaceRequestDto { +public class CityRequestDto { + @NotNull private City city; } diff --git a/src/main/java/org/sophy/sophy/controller/dto/response/BooktalkResponseDto.java b/src/main/java/org/sophy/sophy/controller/dto/response/BooktalkResponseDto.java new file mode 100644 index 0000000..471a4fd --- /dev/null +++ b/src/main/java/org/sophy/sophy/controller/dto/response/BooktalkResponseDto.java @@ -0,0 +1,37 @@ +package org.sophy.sophy.controller.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.sophy.sophy.domain.Booktalk; +import org.sophy.sophy.domain.PreliminaryInfo; + +import java.time.LocalDateTime; +import java.util.ArrayList; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class BooktalkResponseDto { + private Long booktalkId; + private Integer preliminaryInfo; + private String title; + private String author; + private LocalDateTime startDate; + private LocalDateTime endDate; + private String place; + private Integer participant; + private Integer maximum; + + public static BooktalkResponseDto of(Booktalk booktalk) { + return new BooktalkResponseDto( + booktalk.getId(), + booktalk.getPreliminaryInfo().ordinal(), + booktalk.getTitle(), + booktalk.getMember().getName(), + booktalk.getStartDate(), + booktalk.getEndDate(), + booktalk.getPlace().getName(), + booktalk.getParticipantList().size(), + booktalk.getMaximum()); + } +} diff --git a/src/main/java/org/sophy/sophy/exception/SuccessStatus.java b/src/main/java/org/sophy/sophy/exception/SuccessStatus.java index 705293d..5c65237 100644 --- a/src/main/java/org/sophy/sophy/exception/SuccessStatus.java +++ b/src/main/java/org/sophy/sophy/exception/SuccessStatus.java @@ -19,6 +19,7 @@ public enum SuccessStatus { PATCH_MYINFO_SUCCESS(HttpStatus.OK, "내 정보를 성공적으로 수정했습니다."), POST_ADDITIONALINFO_SUCCESS(HttpStatus.OK, "내 정보를 성공적으로 추가했습니다."), GET_PLACES_BY_CITY_SUCCESS(HttpStatus.OK, "지역으로 공간 리스트를 성공적으로 불러왔습니다"), + GET_BOOKTALKS_BY_CITY_SUCCESS(HttpStatus.OK, "지역으로 북토크 리스트를 성공적으로 불러왔습니다"), TEST_SUCCESS(HttpStatus.OK, "Test :: OK"), /* * 201 created diff --git a/src/main/java/org/sophy/sophy/infrastructure/BooktalkRepository.java b/src/main/java/org/sophy/sophy/infrastructure/BooktalkRepository.java new file mode 100644 index 0000000..26e9f91 --- /dev/null +++ b/src/main/java/org/sophy/sophy/infrastructure/BooktalkRepository.java @@ -0,0 +1,13 @@ +package org.sophy.sophy.infrastructure; + +import org.sophy.sophy.domain.Booktalk; +import org.sophy.sophy.domain.City; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BooktalkRepository extends JpaRepository { + +} diff --git a/src/main/java/org/sophy/sophy/service/BooktalkService.java b/src/main/java/org/sophy/sophy/service/BooktalkService.java new file mode 100644 index 0000000..e01efe4 --- /dev/null +++ b/src/main/java/org/sophy/sophy/service/BooktalkService.java @@ -0,0 +1,49 @@ +package org.sophy.sophy.service; + +import lombok.RequiredArgsConstructor; +import org.sophy.sophy.controller.dto.request.CityRequestDto; +import org.sophy.sophy.controller.dto.response.BooktalkResponseDto; +import org.sophy.sophy.domain.BooktalkStatus; +import org.sophy.sophy.domain.City; +import org.sophy.sophy.domain.Place; +import org.sophy.sophy.infrastructure.PlaceRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class BooktalkService { + private final PlaceRepository placeRepository; + + @Transactional + public List getBooktalksByCity(CityRequestDto cityRequestDto) { + City city = cityRequestDto.getCity(); + List placeList; + + if (city.equals(City.UIJEONGBU_SI)) { + placeList = placeRepository.findAll(); + } else { + placeList = placeRepository.findAllByCity(city); + } + + List booktalkList = new ArrayList<>(); + placeList.forEach(place -> { + place.getBooktalkList().forEach(booktalk -> { + // 모집중인 북토크만 추가 + if (booktalk.getBooktalkStatus() == BooktalkStatus.RECRUITING) { + booktalkList.add(BooktalkResponseDto.of(booktalk)); + } + } + ); + }); + + // 마감 임박순으로 정렬 + booktalkList.sort(Comparator.comparing(BooktalkResponseDto::getEndDate)); + + return booktalkList; + } +} diff --git a/src/main/java/org/sophy/sophy/service/PlaceService.java b/src/main/java/org/sophy/sophy/service/PlaceService.java index 6799789..1465cdd 100644 --- a/src/main/java/org/sophy/sophy/service/PlaceService.java +++ b/src/main/java/org/sophy/sophy/service/PlaceService.java @@ -1,7 +1,7 @@ package org.sophy.sophy.service; import lombok.RequiredArgsConstructor; -import org.sophy.sophy.controller.dto.request.PlaceRequestDto; +import org.sophy.sophy.controller.dto.request.CityRequestDto; import org.sophy.sophy.controller.dto.response.PlaceResponseDto; import org.sophy.sophy.domain.City; import org.sophy.sophy.infrastructure.PlaceRepository; @@ -15,8 +15,8 @@ public class PlaceService { private final PlaceRepository placeRepository; - public List getPlacesByCity(PlaceRequestDto placeRequestDto) { - City city = placeRequestDto.getCity(); + public List getPlacesByCity(CityRequestDto cityRequestDto) { + City city = cityRequestDto.getCity(); //의정부 시이면 전체 조회 if (city == City.UIJEONGBU_SI) { return placeRepository.findAll().stream()