From 460ac82d49ebe7b1f5ea9e936b5374722b0f2ace Mon Sep 17 00:00:00 2001 From: JeongHyun Lee <86969518+hyunihs@users.noreply.github.com> Date: Mon, 7 Aug 2023 14:43:22 +0900 Subject: [PATCH] =?UTF-8?q?[refact]=20=EA=B8=B0=EC=88=98=20=ED=99=9C?= =?UTF-8?q?=EB=8F=99=EC=8B=9C=EA=B8=B0=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [refact] 활동시작시기 테이블 분리 (#130) * [refact] awards api 수정 (#130) * [refact] awards api 수정 (#130) * [chore] spotless 적용 --- .../domain/awards/AwardsController.java | 5 +- .../backend/domain/awards/domain/Awards.java | 21 +----- .../domain/awards/domain/StartDate.java | 40 +++++++++++ .../awards/dto/request/AwardsRequest.java | 19 ++--- .../awards/dto/response/AwardsResponse.java | 11 +-- .../response/GenerationAwardsResponse.java | 14 +++- .../awards/exception/AwardsErrorCode.java | 3 +- .../awards/exception/StartDateNotFound.java | 12 ++++ .../repository/StartDateRepository.java | 7 ++ .../domain/awards/service/AwardsService.java | 72 +++++++++++++++---- 10 files changed, 148 insertions(+), 56 deletions(-) create mode 100644 src/main/java/ceos/backend/domain/awards/domain/StartDate.java create mode 100644 src/main/java/ceos/backend/domain/awards/exception/StartDateNotFound.java create mode 100644 src/main/java/ceos/backend/domain/awards/repository/StartDateRepository.java diff --git a/src/main/java/ceos/backend/domain/awards/AwardsController.java b/src/main/java/ceos/backend/domain/awards/AwardsController.java index 51acc6de..f10186fc 100644 --- a/src/main/java/ceos/backend/domain/awards/AwardsController.java +++ b/src/main/java/ceos/backend/domain/awards/AwardsController.java @@ -8,7 +8,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -24,7 +23,7 @@ public class AwardsController { @Operation(summary = "수상이력 추가하기") @PostMapping - public void createAwards(@RequestBody @Valid List awardsRequest) { + public void createAwards(@RequestBody @Valid AwardsRequest awardsRequest) { log.info("수상이력 추가하기"); awardsService.createAwards(awardsRequest); } @@ -49,7 +48,7 @@ public GenerationAwardsResponse getGenerationAwards( @PutMapping("/{generation}") public void updateAwards( @PathVariable(name = "generation") int generation, - @RequestBody List awardsRequest) { + @RequestBody AwardsRequest awardsRequest) { log.info("수상이력 수정하기"); awardsService.updateAwards(generation, awardsRequest); } diff --git a/src/main/java/ceos/backend/domain/awards/domain/Awards.java b/src/main/java/ceos/backend/domain/awards/domain/Awards.java index 376e5c95..02701ba1 100644 --- a/src/main/java/ceos/backend/domain/awards/domain/Awards.java +++ b/src/main/java/ceos/backend/domain/awards/domain/Awards.java @@ -1,11 +1,9 @@ package ceos.backend.domain.awards.domain; -import ceos.backend.domain.awards.dto.request.AwardsRequest; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import java.time.LocalDate; import lombok.*; @Getter @@ -24,28 +22,15 @@ public class Awards { @Size(max = 100) private String content; - @NotNull private LocalDate startDate; - // 생성자 @Builder - private Awards(int generation, String content, LocalDate startDate) { + private Awards(int generation, String content) { this.generation = generation; this.content = content; - this.startDate = startDate; } // 정적 팩토리 메서드 - public static Awards from(AwardsRequest awardsRequest) { - return Awards.builder() - .generation(awardsRequest.getGeneration()) - .content(awardsRequest.getContent()) - .startDate(awardsRequest.getStartDate()) - .build(); - } - - public void updateAward(AwardsRequest awardsRequest) { - this.generation = awardsRequest.getGeneration(); - this.content = awardsRequest.getContent(); - this.startDate = awardsRequest.getStartDate(); + public static Awards of(int generation, String content) { + return Awards.builder().generation(generation).content(content).build(); } } diff --git a/src/main/java/ceos/backend/domain/awards/domain/StartDate.java b/src/main/java/ceos/backend/domain/awards/domain/StartDate.java new file mode 100644 index 00000000..f755bee4 --- /dev/null +++ b/src/main/java/ceos/backend/domain/awards/domain/StartDate.java @@ -0,0 +1,40 @@ +package ceos.backend.domain.awards.domain; + + +import ceos.backend.domain.awards.dto.request.AwardsRequest; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import java.time.LocalDate; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class StartDate { + + @Id private int generation; + + @NotNull private LocalDate startDate; + + // 생성자 + @Builder + public StartDate(int generation, LocalDate startDate) { + this.generation = generation; + this.startDate = startDate; + } + + // 정적 팩토리 메서드 + public static StartDate from(AwardsRequest awardsRequest) { + return StartDate.builder() + .generation(awardsRequest.getGeneration()) + .startDate(awardsRequest.getStartDate()) + .build(); + } + + public void updateStartDate(LocalDate startDate) { + this.startDate = startDate; + } +} diff --git a/src/main/java/ceos/backend/domain/awards/dto/request/AwardsRequest.java b/src/main/java/ceos/backend/domain/awards/dto/request/AwardsRequest.java index e3f53599..60791f5b 100644 --- a/src/main/java/ceos/backend/domain/awards/dto/request/AwardsRequest.java +++ b/src/main/java/ceos/backend/domain/awards/dto/request/AwardsRequest.java @@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import java.time.LocalDate; +import java.util.List; import lombok.Builder; import lombok.Getter; @@ -16,28 +17,28 @@ public class AwardsRequest { @Valid private int generation; - @Schema(defaultValue = "2023 예비창업패키지 최종선정", description = "수상 기록") - @NotEmpty(message = "수상 기록을 입력해주세요") - @Valid - private String content; - @Schema(description = "활동 시작 시기") @NotNull(message = "활동 시작 시기를 입력해주세요") @Valid private LocalDate startDate; + @Schema(description = "수상 기록 리스트") + @NotEmpty(message = "수상 기록을 입력해주세요") + @Valid + private List content; + @Builder - private AwardsRequest(int generation, String content, LocalDate startDate) { + public AwardsRequest(int generation, LocalDate startDate, List content) { this.generation = generation; - this.content = content; this.startDate = startDate; + this.content = content; } - public static AwardsRequest of(int generation, String content, LocalDate startDate) { + public static AwardsRequest of(int generation, LocalDate startDate, List content) { return AwardsRequest.builder() .generation(generation) - .content(content) .startDate(startDate) + .content(content) .build(); } } diff --git a/src/main/java/ceos/backend/domain/awards/dto/response/AwardsResponse.java b/src/main/java/ceos/backend/domain/awards/dto/response/AwardsResponse.java index 0f6111ee..aaa2ba9a 100644 --- a/src/main/java/ceos/backend/domain/awards/dto/response/AwardsResponse.java +++ b/src/main/java/ceos/backend/domain/awards/dto/response/AwardsResponse.java @@ -2,7 +2,6 @@ import ceos.backend.domain.awards.domain.Awards; -import java.time.LocalDate; import lombok.Builder; import lombok.Getter; @@ -11,20 +10,14 @@ public class AwardsResponse { private Long id; private String content; - private LocalDate startDate; @Builder - private AwardsResponse(Long id, String content, LocalDate startDate) { + private AwardsResponse(Long id, String content) { this.id = id; this.content = content; - this.startDate = startDate; } public static AwardsResponse to(Awards awards) { - return AwardsResponse.builder() - .id(awards.getId()) - .content(awards.getContent()) - .startDate(awards.getStartDate()) - .build(); + return AwardsResponse.builder().id(awards.getId()).content(awards.getContent()).build(); } } diff --git a/src/main/java/ceos/backend/domain/awards/dto/response/GenerationAwardsResponse.java b/src/main/java/ceos/backend/domain/awards/dto/response/GenerationAwardsResponse.java index 80b8c0fb..f68cece3 100644 --- a/src/main/java/ceos/backend/domain/awards/dto/response/GenerationAwardsResponse.java +++ b/src/main/java/ceos/backend/domain/awards/dto/response/GenerationAwardsResponse.java @@ -2,6 +2,7 @@ import ceos.backend.domain.awards.vo.ProjectInfoVo; +import java.time.LocalDate; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -9,21 +10,30 @@ @Getter public class GenerationAwardsResponse { private int generation; + private LocalDate startDate; private List awards; private List projects; @Builder public GenerationAwardsResponse( - int generation, List awards, List projects) { + int generation, + LocalDate startDate, + List awards, + List projects) { this.generation = generation; + this.startDate = startDate; this.awards = awards; this.projects = projects; } public static GenerationAwardsResponse of( - int generation, List awards, List projects) { + int generation, + LocalDate startDate, + List awards, + List projects) { return GenerationAwardsResponse.builder() .generation(generation) + .startDate(startDate) .awards(awards) .projects(projects) .build(); diff --git a/src/main/java/ceos/backend/domain/awards/exception/AwardsErrorCode.java b/src/main/java/ceos/backend/domain/awards/exception/AwardsErrorCode.java index 7210486f..3637ca86 100644 --- a/src/main/java/ceos/backend/domain/awards/exception/AwardsErrorCode.java +++ b/src/main/java/ceos/backend/domain/awards/exception/AwardsErrorCode.java @@ -11,7 +11,8 @@ @Getter @AllArgsConstructor public enum AwardsErrorCode implements BaseErrorCode { - AWARD_NOT_FOUND(BAD_REQUEST, "AWARD_404_1", "해당 수상이력이 존재하지 않습니다"); + AWARD_NOT_FOUND(BAD_REQUEST, "AWARD_404_1", "해당 수상이력이 존재하지 않습니다"), + START_DATE_NOT_FOUND(BAD_REQUEST, "AWARD_404_2", "해당 기수의 활동 시작 시기 정보가 존재하지 않습니다"); private HttpStatus status; private String code; diff --git a/src/main/java/ceos/backend/domain/awards/exception/StartDateNotFound.java b/src/main/java/ceos/backend/domain/awards/exception/StartDateNotFound.java new file mode 100644 index 00000000..7c4e0c86 --- /dev/null +++ b/src/main/java/ceos/backend/domain/awards/exception/StartDateNotFound.java @@ -0,0 +1,12 @@ +package ceos.backend.domain.awards.exception; + + +import ceos.backend.global.error.BaseErrorException; + +public class StartDateNotFound extends BaseErrorException { + public static final StartDateNotFound EXCEPTION = new StartDateNotFound(); + + private StartDateNotFound() { + super(AwardsErrorCode.START_DATE_NOT_FOUND); + } +} diff --git a/src/main/java/ceos/backend/domain/awards/repository/StartDateRepository.java b/src/main/java/ceos/backend/domain/awards/repository/StartDateRepository.java new file mode 100644 index 00000000..1055ecad --- /dev/null +++ b/src/main/java/ceos/backend/domain/awards/repository/StartDateRepository.java @@ -0,0 +1,7 @@ +package ceos.backend.domain.awards.repository; + + +import ceos.backend.domain.awards.domain.StartDate; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface StartDateRepository extends JpaRepository {} diff --git a/src/main/java/ceos/backend/domain/awards/service/AwardsService.java b/src/main/java/ceos/backend/domain/awards/service/AwardsService.java index 1e370e0b..0f1bf4d3 100644 --- a/src/main/java/ceos/backend/domain/awards/service/AwardsService.java +++ b/src/main/java/ceos/backend/domain/awards/service/AwardsService.java @@ -2,13 +2,17 @@ import ceos.backend.domain.awards.domain.Awards; +import ceos.backend.domain.awards.domain.StartDate; import ceos.backend.domain.awards.dto.request.AwardsRequest; import ceos.backend.domain.awards.dto.response.AllAwardsResponse; import ceos.backend.domain.awards.dto.response.GenerationAwardsResponse; +import ceos.backend.domain.awards.exception.StartDateNotFound; import ceos.backend.domain.awards.helper.AwardsHelper; import ceos.backend.domain.awards.repository.AwardsRepository; +import ceos.backend.domain.awards.repository.StartDateRepository; import ceos.backend.domain.project.repository.ProjectRepository; import ceos.backend.global.common.dto.PageInfo; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; @@ -22,13 +26,20 @@ public class AwardsService { private final AwardsRepository awardsRepository; + private final StartDateRepository startDateRepository; private final ProjectRepository projectRepository; private final AwardsHelper awardsHelper; @Transactional - public void createAwards(List awardsRequestList) { - for (AwardsRequest awardsRequest : awardsRequestList) { - Awards awards = Awards.from(awardsRequest); + public void createAwards(AwardsRequest awardsRequest) { + // 활동 시작 시기 저장 + StartDate startDate = StartDate.from(awardsRequest); + startDateRepository.save(startDate); + + // 수상 내역 저장 + List contentList = awardsRequest.getContent(); + for (String content : contentList) { + Awards awards = Awards.of(awardsRequest.getGeneration(), content); awardsRepository.save(awards); } } @@ -39,9 +50,20 @@ public AllAwardsResponse getAllAwards(int pageNum, int limit) { int maxGeneration = projectRepository.findMaxGeneration(); for (int i = maxGeneration; i > 0; i--) { + LocalDate startDate = + startDateRepository + .findById(i) + .orElseThrow( + () -> { + throw StartDateNotFound.EXCEPTION; + }) + .getStartDate(); GenerationAwardsResponse generationAwardsResponse = GenerationAwardsResponse.of( - i, awardsHelper.getAwardsDto(i), awardsHelper.getProjectVo(i)); + i, + startDate, + awardsHelper.getAwardsDto(i), + awardsHelper.getProjectVo(i)); generationAwardsResponses.add(generationAwardsResponse); } @@ -63,20 +85,42 @@ public AllAwardsResponse getAllAwards(int pageNum, int limit) { @Transactional(readOnly = true) public GenerationAwardsResponse getGenerationAwards(int generation) { - GenerationAwardsResponse generationAwardsResponse = - GenerationAwardsResponse.of( - generation, - awardsHelper.getAwardsDto(generation), - awardsHelper.getProjectVo(generation)); - return generationAwardsResponse; + LocalDate startDate = + startDateRepository + .findById(generation) + .orElseThrow( + () -> { + throw StartDateNotFound.EXCEPTION; + }) + .getStartDate(); + return GenerationAwardsResponse.of( + generation, + startDate, + awardsHelper.getAwardsDto(generation), + awardsHelper.getProjectVo(generation)); } @Transactional - public void updateAwards(int generation, List awardsRequestList) { - // 기존 데이터 삭제 + public void updateAwards(int generation, AwardsRequest awardsRequest) { + // 기존 수상내역 데이터 삭제 deleteAwards(generation); - // 수정된 데이터 넣기 - createAwards(awardsRequestList); + + // 활동시작시기 업데이트 + StartDate startDate = + startDateRepository + .findById(generation) + .orElseThrow( + () -> { + throw StartDateNotFound.EXCEPTION; + }); + startDate.updateStartDate(awardsRequest.getStartDate()); + + // 수상 내역 저장 + List contentList = awardsRequest.getContent(); + for (String content : contentList) { + Awards awards = Awards.of(awardsRequest.getGeneration(), content); + awardsRepository.save(awards); + } } @Transactional