From 6c332f71a20373dee2423f702f365b5cea7e5c35 Mon Sep 17 00:00:00 2001 From: Suhyeon <70002218+onpyeong@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:44:40 +0900 Subject: [PATCH] =?UTF-8?q?=08feat:=20GET=20=EB=A7=88=EA=B0=90=EC=9E=84?= =?UTF-8?q?=EB=B0=95=20=EC=86=8C=ED=94=BC=20=EB=AA=A8=EC=95=84=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=A1=B0=ED=9A=8C=20(#46)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add: BooktalkCreateRequestDto, ResponseDto 추가 * feat: POST 북토크 생성 구현 * add: BooktalkUpdateDto 추가 * modify: Booktalk에 patchBooktalk추가 * feat: PATCH 북토크 수정하기 구현 * fix: 북토크 생성 시 member와 place 연결 * add: BooktalkDeleteResponseDto 추가 * modify: Author와 Booktalk에 deleteBooktalk 추가 * feat: DELETE 북토크 삭제 구현 * feat: GET 북토크 상세조회 구현 * feat: GET 마감임박 북토크 모아보기 조회 구현 --- .../sophy/controller/BooktalkController.java | 13 +++++--- .../response/BooktalkDeadlineUpcomingDto.java | 30 +++++++++++++++++++ .../sophy/sophy/exception/SuccessStatus.java | 1 + .../sophy/sophy/service/BooktalkService.java | 25 +++++++++++++--- 4 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/sophy/sophy/controller/dto/response/BooktalkDeadlineUpcomingDto.java diff --git a/src/main/java/org/sophy/sophy/controller/BooktalkController.java b/src/main/java/org/sophy/sophy/controller/BooktalkController.java index 494e84f..aa24db4 100644 --- a/src/main/java/org/sophy/sophy/controller/BooktalkController.java +++ b/src/main/java/org/sophy/sophy/controller/BooktalkController.java @@ -5,10 +5,7 @@ import org.sophy.sophy.controller.dto.BooktalkUpdateDto; import org.sophy.sophy.controller.dto.request.BooktalkRequestDto; import org.sophy.sophy.controller.dto.request.CityRequestDto; -import org.sophy.sophy.controller.dto.response.BooktalkCreateResponseDto; -import org.sophy.sophy.controller.dto.response.BooktalkDeleteResponseDto; -import org.sophy.sophy.controller.dto.response.BooktalkDetailResponseDto; -import org.sophy.sophy.controller.dto.response.BooktalkResponseDto; +import org.sophy.sophy.controller.dto.response.*; import org.sophy.sophy.exception.SuccessStatus; import org.sophy.sophy.service.BooktalkService; import org.springframework.http.HttpStatus; @@ -42,12 +39,20 @@ public ApiResponseDto deleteBooktalk(@PathVariable("b } @GetMapping("/{booktalkId}/detail") + @ResponseStatus(HttpStatus.OK) public ApiResponseDto getBooktalkDetail(@PathVariable("booktalkId") Long booktalkId) { return ApiResponseDto.success(SuccessStatus.GET_BOOKTALK_DETAIL_SUCCESS, booktalkService.getBooktalkDetail(booktalkId)); } @GetMapping("/search") + @ResponseStatus(HttpStatus.OK) public ApiResponseDto> getPlacesByCity(@Valid @RequestBody CityRequestDto cityRequestDto) { return ApiResponseDto.success(SuccessStatus.GET_BOOKTALKS_BY_CITY_SUCCESS, booktalkService.getBooktalksByCity(cityRequestDto)); } + + @GetMapping("/deadline-upcoming") + @ResponseStatus(HttpStatus.OK) + public ApiResponseDto> getBooktalkDeadlineUpcoming() { + return ApiResponseDto.success(SuccessStatus.GET_BOOKTALKS_DEADLINE_UPCOMING_SUCCESS, booktalkService.getBooktalkDeadlineUpcoming()); + } } diff --git a/src/main/java/org/sophy/sophy/controller/dto/response/BooktalkDeadlineUpcomingDto.java b/src/main/java/org/sophy/sophy/controller/dto/response/BooktalkDeadlineUpcomingDto.java new file mode 100644 index 0000000..92ae512 --- /dev/null +++ b/src/main/java/org/sophy/sophy/controller/dto/response/BooktalkDeadlineUpcomingDto.java @@ -0,0 +1,30 @@ +package org.sophy.sophy.controller.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.sophy.sophy.domain.Booktalk; + +import java.time.LocalDateTime; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class BooktalkDeadlineUpcomingDto { + private Long booktalkId; + private String title; + private LocalDateTime startDate; + private LocalDateTime endDate; + private String PlaceName; + private String PlaceAddress; + + public static BooktalkDeadlineUpcomingDto of(Booktalk booktalk) { + return new BooktalkDeadlineUpcomingDto( + booktalk.getId(), + booktalk.getTitle(), + booktalk.getStartDate(), + booktalk.getEndDate(), + booktalk.getPlace().getName(), + booktalk.getPlace().getAddress() + ); + } +} diff --git a/src/main/java/org/sophy/sophy/exception/SuccessStatus.java b/src/main/java/org/sophy/sophy/exception/SuccessStatus.java index dc7f047..748507a 100644 --- a/src/main/java/org/sophy/sophy/exception/SuccessStatus.java +++ b/src/main/java/org/sophy/sophy/exception/SuccessStatus.java @@ -23,6 +23,7 @@ public enum SuccessStatus { DELETE_BOOKTALK_SUCCESS(HttpStatus.OK, "북토크를 성공적으로 삭제했습니다."), GET_BOOKTALK_DETAIL_SUCCESS(HttpStatus.OK, "북토크 상세정보를 성공적으로 불러왔습니다."), GET_BOOKTALKS_BY_CITY_SUCCESS(HttpStatus.OK, "지역으로 북토크 리스트를 성공적으로 불러왔습니다"), + GET_BOOKTALKS_DEADLINE_UPCOMING_SUCCESS(HttpStatus.OK, "마감임박 소피 북토크 리스트를 성공적으로 불러왔습니다."), GET_MY_BOOKTALKS_SUCCESS(HttpStatus.OK, "예정된 북토크 리스트를 성공적으로 불러왔습니다"), GET_AUTHOR_BOOKTALKS_SUCCESS(HttpStatus.OK, "작가 북토크 리스트를 성공적으로 불러왔습니다"), TEST_SUCCESS(HttpStatus.OK, "Test :: OK"), diff --git a/src/main/java/org/sophy/sophy/service/BooktalkService.java b/src/main/java/org/sophy/sophy/service/BooktalkService.java index cfda16e..30fd4d9 100644 --- a/src/main/java/org/sophy/sophy/service/BooktalkService.java +++ b/src/main/java/org/sophy/sophy/service/BooktalkService.java @@ -4,10 +4,7 @@ import org.sophy.sophy.controller.dto.BooktalkUpdateDto; import org.sophy.sophy.controller.dto.request.BooktalkRequestDto; import org.sophy.sophy.controller.dto.request.CityRequestDto; -import org.sophy.sophy.controller.dto.response.BooktalkCreateResponseDto; -import org.sophy.sophy.controller.dto.response.BooktalkDeleteResponseDto; -import org.sophy.sophy.controller.dto.response.BooktalkDetailResponseDto; -import org.sophy.sophy.controller.dto.response.BooktalkResponseDto; +import org.sophy.sophy.controller.dto.response.*; import org.sophy.sophy.domain.*; import org.sophy.sophy.exception.ErrorStatus; import org.sophy.sophy.exception.model.ForbiddenException; @@ -63,6 +60,26 @@ public BooktalkDetailResponseDto getBooktalkDetail(Long booktalkId) { return BooktalkDetailResponseDto.of(booktalk); } + public List getBooktalkDeadlineUpcoming() { + List placeList = placeRepository.findAll(); + + List booktalkList = new ArrayList<>(); + placeList.forEach(place -> { + place.getBooktalkList().forEach(booktalk -> { + // 모집중인 북토크만 추가 + if (booktalk.getBooktalkStatus() == BooktalkStatus.RECRUITING) { + booktalkList.add(BooktalkDeadlineUpcomingDto.of(booktalk)); + } + } + ); + }); + + // 마감 임박순으로 정렬 + booktalkList.sort(Comparator.comparing(BooktalkDeadlineUpcomingDto::getEndDate)); + + return booktalkList; + } + private Member getMemberById(Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new NotFoundException(ErrorStatus.NOT_FOUND_USER_EXCEPTION, ErrorStatus.NOT_FOUND_USER_EXCEPTION.getMessage()));