Skip to content

Commit

Permalink
[refact] 기수 활동시기 테이블 분리 (#133)
Browse files Browse the repository at this point in the history
* [refact] 활동시작시기 테이블 분리 (#130)

* [refact] awards api 수정 (#130)

* [refact] awards api 수정 (#130)

* [chore] spotless 적용
  • Loading branch information
hyunihs authored Aug 7, 2023
1 parent 45bdf92 commit 460ac82
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -24,7 +23,7 @@ public class AwardsController {

@Operation(summary = "수상이력 추가하기")
@PostMapping
public void createAwards(@RequestBody @Valid List<AwardsRequest> awardsRequest) {
public void createAwards(@RequestBody @Valid AwardsRequest awardsRequest) {
log.info("수상이력 추가하기");
awardsService.createAwards(awardsRequest);
}
Expand All @@ -49,7 +48,7 @@ public GenerationAwardsResponse getGenerationAwards(
@PutMapping("/{generation}")
public void updateAwards(
@PathVariable(name = "generation") int generation,
@RequestBody List<AwardsRequest> awardsRequest) {
@RequestBody AwardsRequest awardsRequest) {
log.info("수상이력 수정하기");
awardsService.updateAwards(generation, awardsRequest);
}
Expand Down
21 changes: 3 additions & 18 deletions src/main/java/ceos/backend/domain/awards/domain/Awards.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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();
}
}
40 changes: 40 additions & 0 deletions src/main/java/ceos/backend/domain/awards/domain/StartDate.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<String> content;

@Builder
private AwardsRequest(int generation, String content, LocalDate startDate) {
public AwardsRequest(int generation, LocalDate startDate, List<String> 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<String> content) {
return AwardsRequest.builder()
.generation(generation)
.content(content)
.startDate(startDate)
.content(content)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@


import ceos.backend.domain.awards.domain.Awards;
import java.time.LocalDate;
import lombok.Builder;
import lombok.Getter;

Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,38 @@


import ceos.backend.domain.awards.vo.ProjectInfoVo;
import java.time.LocalDate;
import java.util.List;
import lombok.Builder;
import lombok.Getter;

@Getter
public class GenerationAwardsResponse {
private int generation;
private LocalDate startDate;
private List<AwardsResponse> awards;
private List<ProjectInfoVo> projects;

@Builder
public GenerationAwardsResponse(
int generation, List<AwardsResponse> awards, List<ProjectInfoVo> projects) {
int generation,
LocalDate startDate,
List<AwardsResponse> awards,
List<ProjectInfoVo> projects) {
this.generation = generation;
this.startDate = startDate;
this.awards = awards;
this.projects = projects;
}

public static GenerationAwardsResponse of(
int generation, List<AwardsResponse> awards, List<ProjectInfoVo> projects) {
int generation,
LocalDate startDate,
List<AwardsResponse> awards,
List<ProjectInfoVo> projects) {
return GenerationAwardsResponse.builder()
.generation(generation)
.startDate(startDate)
.awards(awards)
.projects(projects)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<StartDate, Integer> {}
72 changes: 58 additions & 14 deletions src/main/java/ceos/backend/domain/awards/service/AwardsService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<AwardsRequest> awardsRequestList) {
for (AwardsRequest awardsRequest : awardsRequestList) {
Awards awards = Awards.from(awardsRequest);
public void createAwards(AwardsRequest awardsRequest) {
// 활동 시작 시기 저장
StartDate startDate = StartDate.from(awardsRequest);
startDateRepository.save(startDate);

// 수상 내역 저장
List<String> contentList = awardsRequest.getContent();
for (String content : contentList) {
Awards awards = Awards.of(awardsRequest.getGeneration(), content);
awardsRepository.save(awards);
}
}
Expand All @@ -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);
}

Expand All @@ -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<AwardsRequest> 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<String> contentList = awardsRequest.getContent();
for (String content : contentList) {
Awards awards = Awards.of(awardsRequest.getGeneration(), content);
awardsRepository.save(awards);
}
}

@Transactional
Expand Down

0 comments on commit 460ac82

Please sign in to comment.