From e45848c48054a6797e349ca0e80932c1f1d20f7a Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Sun, 2 Feb 2025 21:02:31 +0900 Subject: [PATCH 01/44] feat:create & patch burndown api --- .../example/prdoit/config/BacklogEnum.java | 1 + .../prdoit/controller/ProjectController.java | 41 ++++++++ .../dto/project/backlog/BacklogDeleteDto.java | 2 + .../dto/project/backlog/BacklogListDto.java | 1 - .../dto/project/backlog/BacklogPutDto.java | 2 + .../project/backlog/BacklogPutListDto.java | 3 +- .../project/backlog/BacklogResponseDto.java | 3 + .../dto/project/backlog/BacklogUpdateDto.java | 2 + .../project/backlog/BacklogUpdateListDto.java | 3 +- .../dto/project/burndown/BurndownListDto.java | 23 +++++ .../project/burndown/BurndownPatchDto.java | 19 ++++ .../dto/project/burndown/BurndownPostDto.java | 17 ++++ .../project/burndown/BurndownPostListDto.java | 15 +++ .../project/burndown/BurndownResponseDto.java | 17 ++++ .../example/prdoit/model/BacklogTable.java | 2 +- .../example/prdoit/model/ProjectTable.java | 3 - .../repository/BacklogTableRepository.java | 5 + .../service/project/ProjectService.java | 10 ++ .../service/project/ProjectServiceImpl.java | 98 ++++++++++++++++++- 19 files changed, 257 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java create mode 100644 src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java create mode 100644 src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostDto.java create mode 100644 src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostListDto.java create mode 100644 src/main/java/com/example/prdoit/dto/project/burndown/BurndownResponseDto.java diff --git a/src/main/java/com/example/prdoit/config/BacklogEnum.java b/src/main/java/com/example/prdoit/config/BacklogEnum.java index a400aa5..0ae79d1 100644 --- a/src/main/java/com/example/prdoit/config/BacklogEnum.java +++ b/src/main/java/com/example/prdoit/config/BacklogEnum.java @@ -5,6 +5,7 @@ @Getter public enum BacklogEnum { + BACKLOG_NOT_YET(0, "Not Yet"), BACKLOG_TODO(1, "To Do"), BACKLOG_IN_PROGRESS(2, "In Progress"), BACKLOG_DONE(3, "Done"); diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 1e55edd..94fda32 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -5,6 +5,9 @@ import com.example.prdoit.dto.project.backlog.BacklogPutDto; import com.example.prdoit.dto.project.backlog.BacklogRequestDto; import com.example.prdoit.dto.project.backlog.BacklogUpdateDto; +import com.example.prdoit.dto.project.burndown.BurndownListDto; +import com.example.prdoit.dto.project.burndown.BurndownPatchDto; +import com.example.prdoit.dto.project.burndown.BurndownPostDto; import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; import com.example.prdoit.dto.project.content.ProjectContentDto; import com.example.prdoit.service.project.ProjectService; @@ -15,6 +18,8 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Controller @Transactional @CrossOrigin(origins = "*", allowedHeaders = "*") @@ -164,4 +169,40 @@ public ResponseEntity getBacklogList(@PathVariable String projectId) { return ResponseEntity.badRequest().body("백로그 리스트 조회에 실패했습니다."); } } + + @GetMapping("/burndown/{projectId}") + public ResponseEntity getBurnDownChart(@PathVariable String projectId) { + log.info("[getBurnDownChart] 번다운 차트 조회 요청"); + try{ + return ResponseEntity.ok(projectService.getBurnDownChart(projectId)); + } catch (RuntimeException e){ + log.error("[getBurnDownChart] 번다운 차트 조회 실패"); + return ResponseEntity.badRequest().body("번다운 차트 조회에 실패했습니다."); + } + } + + @PostMapping("/burndown") + public ResponseEntity createBurnDownChart(@RequestBody BurndownPostDto burndownPostDto) { + log.info("[createBurnDownChart] 번다운 차트 생성 요청"); + log.info("[createBurnDownChart] {}", burndownPostDto.getBurndownPostListDto().get(0).getIteration()); + try{ + projectService.createBurnDownChart(burndownPostDto); + return ResponseEntity.ok("번다운 차트 생성에 성공했습니다."); + } catch (RuntimeException e){ + log.error("[createBurnDownChart] {}", e.getMessage()); + return ResponseEntity.badRequest().body("번다운 차트 생성에 실패했습니다."); + } + } + + @PatchMapping("/burndown") + public ResponseEntity updateBurnDownChart(@RequestBody List burndownPatchDto) { + log.info("[updateBurnDownChart] 번다운 차트 수정 요청"); + try{ + projectService.updateBurnDownChart(burndownPatchDto); + return ResponseEntity.ok("번다운 차트 수정에 성공했습니다."); + } catch (RuntimeException e){ + log.error("[updateBurnDownChart] {}", e.getMessage()); + return ResponseEntity.badRequest().body("번다운 차트 수정에 실패했습니다."); + } + } } diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java index 28c37ae..5c5c963 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java @@ -1,5 +1,6 @@ package com.example.prdoit.dto.project.backlog; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -7,6 +8,7 @@ @Getter @Builder +@AllArgsConstructor public class BacklogDeleteDto { private String projectId; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogListDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogListDto.java index bd9aa9b..44e5952 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogListDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogListDto.java @@ -13,7 +13,6 @@ public class BacklogListDto { private int backlogPriority; private String backlogTask; private String backlogDescription; - private String backlogStatus; private String backlogWorker; private String backlogTaskId; private String backlogEstimate; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutDto.java index cef2446..419f7a5 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutDto.java @@ -1,5 +1,6 @@ package com.example.prdoit.dto.project.backlog; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -7,6 +8,7 @@ @Getter @Builder +@AllArgsConstructor public class BacklogPutDto { private String projectId; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutListDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutListDto.java index f80b30e..abcef7e 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutListDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPutListDto.java @@ -1,17 +1,18 @@ package com.example.prdoit.dto.project.backlog; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter @Builder +@AllArgsConstructor public class BacklogPutListDto { private String backlogUserStory; private int backlogPriority; private String backlogTask; private String backlogDescription; - private String backlogStatus; private String backlogWorker; private String backlogTaskId; private String backlogEstimate; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java index 512f8db..276e6cd 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java @@ -1,12 +1,15 @@ package com.example.prdoit.dto.project.backlog; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter @Builder +@AllArgsConstructor public class BacklogResponseDto { + private int backlogId; private String backlogUserStory; private int backlogPriority; private String backlogTask; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java index a1560ab..38c9c78 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java @@ -1,5 +1,6 @@ package com.example.prdoit.dto.project.backlog; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -7,6 +8,7 @@ @Getter @Builder +@AllArgsConstructor public class BacklogUpdateDto { private String projectId; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java index 942e9a6..92fde9b 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java @@ -1,17 +1,18 @@ package com.example.prdoit.dto.project.backlog; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter @Builder +@AllArgsConstructor public class BacklogUpdateListDto { private String backlogUserStory; private int backlogPriority; private String backlogTask; private String backlogDescription; - private String backlogStatus; private String backlogWorker; private String backlogTaskId; private String backlogEstimate; diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java new file mode 100644 index 0000000..9588371 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java @@ -0,0 +1,23 @@ +package com.example.prdoit.dto.project.burndown; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +@AllArgsConstructor +public class BurndownListDto { + + private int backlogId; + private String backlogTask; + private String backlogStatus; + private String backlogWorker; + private String backlogTaskId; + private String backlogEstimate; + private LocalDateTime backlogEndDate; + private String backlogEndTime; + +} diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java new file mode 100644 index 0000000..b842cd7 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java @@ -0,0 +1,19 @@ +package com.example.prdoit.dto.project.burndown; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +@AllArgsConstructor +public class BurndownPatchDto { + + private int backlogId; + private int Iteration; + private LocalDateTime backlogEndDate; + private String backlogEndTime; + private int backlogStatus; +} diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostDto.java new file mode 100644 index 0000000..6154394 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.project.burndown; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class BurndownPostDto { + + private String projectId; + private List burndownPostListDto; + +} diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostListDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostListDto.java new file mode 100644 index 0000000..577dd00 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPostListDto.java @@ -0,0 +1,15 @@ +package com.example.prdoit.dto.project.burndown; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class BurndownPostListDto { + + private int backlogId; + private int iteration; + +} diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownResponseDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownResponseDto.java new file mode 100644 index 0000000..01e1417 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownResponseDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.project.burndown; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class BurndownResponseDto { + + private int iteration; + private List burndownListDto; + +} diff --git a/src/main/java/com/example/prdoit/model/BacklogTable.java b/src/main/java/com/example/prdoit/model/BacklogTable.java index a2e9323..e8dfb9f 100644 --- a/src/main/java/com/example/prdoit/model/BacklogTable.java +++ b/src/main/java/com/example/prdoit/model/BacklogTable.java @@ -40,7 +40,7 @@ public class BacklogTable { private String backlogEndTime; - private String backlogIteration; + private int backlogIteration; @ManyToOne @JoinColumn(name = "levelContentId") diff --git a/src/main/java/com/example/prdoit/model/ProjectTable.java b/src/main/java/com/example/prdoit/model/ProjectTable.java index 8ceb050..ded09af 100644 --- a/src/main/java/com/example/prdoit/model/ProjectTable.java +++ b/src/main/java/com/example/prdoit/model/ProjectTable.java @@ -44,8 +44,5 @@ public class ProjectTable { @JoinColumn(name = "id") private IdTable id; - @OneToMany(mappedBy = "projectId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) - @JsonIgnore - private List projectLevelContentTable; } diff --git a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java index 311db44..48d3b9e 100644 --- a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java @@ -4,6 +4,7 @@ import com.example.prdoit.model.ProjectLevelContentTable; import com.example.prdoit.model.ProjectTable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @@ -13,4 +14,8 @@ public interface BacklogTableRepository extends JpaRepository { Optional findByBacklogTaskIdAndLevelContentId(String backlogTaskId, ProjectLevelContentTable levelContentId); List findAllByLevelContentId(ProjectLevelContentTable levelContentId); + List findAllByLevelContentIdAndBacklogIteration(ProjectLevelContentTable levelContentId, int iteration); + + @Query("SELECT b FROM BacklogTable b WHERE b.backlogId=:backlogId") + Optional findByBacklogId(int backlogId); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index bfe9d17..652eeac 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -2,6 +2,10 @@ import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; +import com.example.prdoit.dto.project.burndown.BurndownPatchDto; +import com.example.prdoit.dto.project.burndown.BurndownPostDto; +import com.example.prdoit.dto.project.burndown.BurndownListDto; +import com.example.prdoit.dto.project.burndown.BurndownResponseDto; import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; import com.example.prdoit.dto.project.content.ProjectContentDto; @@ -31,4 +35,10 @@ public interface ProjectService { void putBacklog(BacklogPutDto backlogPutDto); List getBacklogList(String projectId); + + void createBurnDownChart(BurndownPostDto burndownPostDtoList); + + void updateBurnDownChart(List burndownPatchDtoList); + + List getBurnDownChart(String projectId); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index cf2f162..6b1eb11 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -3,6 +3,7 @@ import com.example.prdoit.config.BacklogEnum; import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; +import com.example.prdoit.dto.project.burndown.*; import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; import com.example.prdoit.dto.project.content.ProjectContentDto; import com.example.prdoit.exception.CustomException; @@ -14,11 +15,11 @@ import com.example.prdoit.repository.IdTableRepository; import com.example.prdoit.repository.ProjectLevelContentTableRepository; import com.example.prdoit.repository.ProjectTableRepository; -import io.micrometer.observation.annotation.Observed; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.UUID; @@ -324,6 +325,7 @@ public void createBacklog(BacklogRequestDto backLogRequestDto) { throw new CustomException("백로그를 생성할 수 없는 프로젝트입니다."); } ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); + ProjectLevelContentTable projectBurndownChart = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 8); if(!Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")){ throw new CustomException("이미 백로그가 생성되어 있습니다."); } @@ -337,14 +339,16 @@ public void createBacklog(BacklogRequestDto backLogRequestDto) { .backlogTask(backlogListDto.getBacklogTask()) .backlogTaskId(backlogListDto.getBacklogTaskId()) .backlogDescription(backlogListDto.getBacklogDescription()) - .backlogStatus(BacklogEnum.BACKLOG_TODO.getCode()) + .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) .backlogEstimate(backlogListDto.getBacklogEstimate()) .levelContentId(projectLevelContentTable) .build(); backlogTableRepository.save(backlogTable); } projectLevelContentTable.setProjectLevelContent(String.valueOf(backLogRequestDto.getIteration())); + projectBurndownChart.setProjectLevelContent(String.valueOf(backLogRequestDto.getIteration())); projectLevelContentTableRepository.save(projectLevelContentTable); + projectLevelContentTableRepository.save(projectBurndownChart); projectTable.setProjectLevel7(2); projectTableRepository.save(projectTable); } catch (CustomException e){ @@ -445,7 +449,7 @@ public void putBacklog(BacklogPutDto backlogPutDto) { .backlogTask(backlogListDto.getBacklogTask()) .backlogPriority(backlogListDto.getBacklogPriority()) .backlogUserStory(backlogListDto.getBacklogUserStory()) - .backlogStatus(BacklogEnum.BACKLOG_TODO.getCode()) + .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) .levelContentId(projectLevelContentTable) .build(); backlogTableRepository.save(backlogtable); @@ -473,6 +477,7 @@ public List getBacklogList(String projectId) { try{ List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); return backlogTableList.stream().map(backlogTable -> BacklogResponseDto.builder() + .backlogId(backlogTable.getBacklogId()) .backlogUserStory(backlogTable.getBacklogUserStory()) .backlogPriority(backlogTable.getBacklogPriority()) .backlogTask(backlogTable.getBacklogTask()) @@ -490,4 +495,91 @@ public List getBacklogList(String projectId) { throw e; } } + + @Override + public void createBurnDownChart(BurndownPostDto burndownPostDtoList){ + log.info("[createBurnDownChart] 번다운 차트 생성 시작"); + ProjectTable projectTable = projectTableRepository.findById(burndownPostDtoList.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + try{ + for(BurndownPostListDto burndownPostListDto : burndownPostDtoList.getBurndownPostListDto()){ + BacklogTable backlogTable = backlogTableRepository.findByBacklogId(burndownPostListDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogIteration(burndownPostListDto.getIteration()); + backlogTableRepository.save(backlogTable); + } + projectTable.setProjectLevel8(2); + projectTableRepository.save(projectTable); + } catch (CustomException e){ + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e){ + log.error("[createBurnDownChart] 서버 오류"); + throw e; + } + } + + @Override + public void updateBurnDownChart(List burndownPatchDtoList){ + log.info("[updateBurnDownChart] 번다운 차트 수정 시작"); + + try{ + for(BurndownPatchDto burndownPatchDto : burndownPatchDtoList){ + BacklogTable backlogTable = backlogTableRepository.findById(burndownPatchDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogStatus(burndownPatchDto.getBacklogStatus()); + backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTable.setBacklogEndDate(burndownPatchDto.getBacklogEndDate()); + backlogTable.setBacklogEndTime(burndownPatchDto.getBacklogEndTime()); + + backlogTableRepository.save(backlogTable); + } + } catch (CustomException e){ + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e){ + log.error("[updateBurnDownChart] 서버 오류"); + throw e; + } + } + + @Override + public List getBurnDownChart(String projectId) { + log.info("[getBurnDownChart] 번다운 차트 조회 시작"); + List burndownResponseDtoList = new ArrayList<>(); + ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + if (projectTable.getProjectLevel8() == 0) { + throw new CustomException("번다운 차트를 조회할 수 없는 프로젝트입니다."); + } + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); + if (Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")) { + throw new CustomException("번다운 차트가 생성되어 있지 않습니다."); + } + try { + for ( int i = 1 ; i <= parseInt(projectLevelContentTable.getProjectLevelContent()) ; i++){ + List backlogTableList = backlogTableRepository.findAllByLevelContentIdAndBacklogIteration(projectLevelContentTable, i); + if(backlogTableList.isEmpty()){ + continue; + } + BurndownResponseDto burndownResponseDto = BurndownResponseDto.builder() + .iteration(i) + .burndownListDto(backlogTableList.stream().map(backlogTable -> BurndownListDto.builder() + .backlogId(backlogTable.getBacklogId()) + .backlogTask(backlogTable.getBacklogTask()) + .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus()).getDescription()) + .backlogWorker(backlogTable.getBacklogWorker()) + .backlogTaskId(backlogTable.getBacklogTaskId()) + .backlogEstimate(backlogTable.getBacklogEstimate() != null ? backlogTable.getBacklogEstimate() : null) + .backlogEndDate(backlogTable.getBacklogEndDate() != null ? backlogTable.getBacklogEndDate() : null) + .backlogEndTime(backlogTable.getBacklogEndTime() != null ? backlogTable.getBacklogEndTime() : null) + .build()).toList()) + .build(); + burndownResponseDtoList.add(burndownResponseDto); + } + return burndownResponseDtoList; + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error("[getBurnDownChart] 서버 오류"); + throw e; + } + } } From f53eab1e5d1b61efb4f2154dd6a4595d6347c045 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Sun, 2 Feb 2025 21:50:48 +0900 Subject: [PATCH 02/44] feat:create & patch burndown api --- src/main/java/com/example/prdoit/config/BacklogEnum.java | 4 ++-- .../prdoit/dto/project/burndown/BurndownPatchDto.java | 2 +- .../example/prdoit/repository/BacklogTableRepository.java | 1 + .../example/prdoit/service/project/ProjectServiceImpl.java | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/prdoit/config/BacklogEnum.java b/src/main/java/com/example/prdoit/config/BacklogEnum.java index 0ae79d1..390d0aa 100644 --- a/src/main/java/com/example/prdoit/config/BacklogEnum.java +++ b/src/main/java/com/example/prdoit/config/BacklogEnum.java @@ -13,10 +13,10 @@ public enum BacklogEnum { private final int code; private final String description; - public static BacklogEnum getBacklogEnum(int code){ + public static String getBacklogEnum(int code){ for(BacklogEnum backlogEnum : values()){ if(backlogEnum.code == code){ - return backlogEnum; + return backlogEnum.getDescription(); } } return null; diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java index b842cd7..54bdfd3 100644 --- a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java @@ -12,7 +12,7 @@ public class BurndownPatchDto { private int backlogId; - private int Iteration; + private int iteration; private LocalDateTime backlogEndDate; private String backlogEndTime; private int backlogStatus; diff --git a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java index 48d3b9e..e1069d1 100644 --- a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java @@ -18,4 +18,5 @@ public interface BacklogTableRepository extends JpaRepository findByBacklogId(int backlogId); + } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 6b1eb11..eafb24c 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -482,7 +482,7 @@ public List getBacklogList(String projectId) { .backlogPriority(backlogTable.getBacklogPriority()) .backlogTask(backlogTable.getBacklogTask()) .backlogDescription(backlogTable.getBacklogDescription()) - .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus()).getDescription()) + .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus())) .backlogWorker(backlogTable.getBacklogWorker()) .backlogTaskId(backlogTable.getBacklogTaskId()) .backlogEstimate(backlogTable.getBacklogEstimate()) @@ -563,7 +563,7 @@ public List getBurnDownChart(String projectId) { .burndownListDto(backlogTableList.stream().map(backlogTable -> BurndownListDto.builder() .backlogId(backlogTable.getBacklogId()) .backlogTask(backlogTable.getBacklogTask()) - .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus()).getDescription()) + .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus())) .backlogWorker(backlogTable.getBacklogWorker()) .backlogTaskId(backlogTable.getBacklogTaskId()) .backlogEstimate(backlogTable.getBacklogEstimate() != null ? backlogTable.getBacklogEstimate() : null) @@ -578,7 +578,7 @@ public List getBurnDownChart(String projectId) { log.error(e.getMessage()); throw new CustomException(e.getMessage()); } catch (RuntimeException e) { - log.error("[getBurnDownChart] 서버 오류"); + log.error(e.getMessage()); throw e; } } From 06023619635ad4b1bd22db5800d7f1a96a676783 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 3 Feb 2025 02:50:37 +0900 Subject: [PATCH 03/44] fix:add error message --- .../com/example/prdoit/service/content/ContentService.java | 4 ++++ .../example/prdoit/service/content/ContentServiceImpl.java | 4 ++++ .../example/prdoit/service/project/ProjectServiceImpl.java | 2 +- .../com/example/prdoit/service/survey/SurveyServiceImpl.java | 1 - 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/prdoit/service/content/ContentService.java create mode 100644 src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java new file mode 100644 index 0000000..9e7e5dc --- /dev/null +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -0,0 +1,4 @@ +package com.example.prdoit.service.content; + +public interface ContentService { +} diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java new file mode 100644 index 0000000..91be366 --- /dev/null +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -0,0 +1,4 @@ +package com.example.prdoit.service.content; + +public class ContentServiceImpl { +} diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index eafb24c..c561e01 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -491,7 +491,7 @@ public List getBacklogList(String projectId) { log.error(e.getMessage()); throw new CustomException(e.getMessage()); } catch (RuntimeException e){ - log.error("[getBacklogList] 서버 오류"); + log.error(e.getMessage()); throw e; } } diff --git a/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java b/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java index bb35ee9..aea823d 100644 --- a/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java @@ -72,7 +72,6 @@ public SurveyDto getSurvey(String id) { return convertToDto(survey); } - @Override public void updateSurvey(SurveyDto surveyDto) { log.info("[updateSurvey] 설문조사 수정 로직 시작"); From 31c9e35c7f9f08188cd94f75027fde8fcc3dee35 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 3 Feb 2025 02:54:53 +0900 Subject: [PATCH 04/44] fix:add error message --- .../example/prdoit/service/project/ProjectServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index c561e01..d328bad 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -451,6 +451,10 @@ public void putBacklog(BacklogPutDto backlogPutDto) { .backlogUserStory(backlogListDto.getBacklogUserStory()) .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) .levelContentId(projectLevelContentTable) + .backlogWorker("") + .backlogIteration(0) + .backlogEndDate(null) + .backlogEndTime("") .build(); backlogTableRepository.save(backlogtable); } From 6fa9517651f10b3bc7ecbb33224faca64bccaf33 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 3 Feb 2025 02:55:33 +0900 Subject: [PATCH 05/44] fix:add error message --- .../example/prdoit/service/project/ProjectServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index d328bad..8e585ad 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -342,6 +342,10 @@ public void createBacklog(BacklogRequestDto backLogRequestDto) { .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) .backlogEstimate(backlogListDto.getBacklogEstimate()) .levelContentId(projectLevelContentTable) + .backlogWorker("") + .backlogIteration(0) + .backlogEndDate(null) + .backlogEndTime("") .build(); backlogTableRepository.save(backlogTable); } From 8f0eb617d45b32c7ddde70390687ba8389b79318 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 3 Feb 2025 16:35:59 +0900 Subject: [PATCH 06/44] fix: change request parameter --- .../project/backlog/BacklogRequestDto.java | 1 - .../service/project/ProjectServiceImpl.java | 94 ++----------------- 2 files changed, 10 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java index 829858f..1b9478a 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java @@ -13,6 +13,5 @@ public class BacklogRequestDto { private String projectId; private List backlogListDto; - private int iteration; } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 8e585ad..35035a8 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -60,70 +60,6 @@ public String createProject(ProjectCreateDto projectCreateDto) { .build(); try{ projectTableRepository.save(projectTable); - if(projectCreateDto.getPainPoint() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(1) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getTarget() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(2) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getUseCase() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(3) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getUserStory() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(4) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getFunction() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(5) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getTask() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(6) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getBacklog() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(7) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - if(projectCreateDto.getBurndown() == 1){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectId(projectTable) - .projectLevelContent("") - .projectLevel(8) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - } log.info("[createProject] 프로젝트 생성 완료"); return uuid; } catch (CustomException e){ @@ -159,7 +95,12 @@ public ProjectResponseDto getProject(String projectId) { public ProjectContentResponseDto getProjectContent(String projectId, int projectLevel) { log.info("[getProjectContent] 프로젝트 컨텐츠 조회 시작"); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectLevel); + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository. + findByProjectIdAndProjectLevel(projectTable, projectLevel) != null ? projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectLevel) : null; + + if(projectLevelContentTable == null){ + return null; + } return ProjectContentResponseDto.builder() .projectContent(projectLevelContentTable.getProjectLevelContent()) .projectLevel(projectLevelContentTable.getProjectLevel()) @@ -191,16 +132,12 @@ public List getProjectList(String userId) { public void createProjectContent(ProjectContentDto projectContentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 시작"); ProjectTable projectTable = projectTableRepository.findById(projectContentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectContentDto.getProjectLevel()); - if(projectLevelContentTable == null){ - throw new CustomException("존재하지 않는 프로젝트 레벨입니다."); - } - if(!Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")){ - throw new CustomException("이미 컨텐츠가 생성되어 있습니다."); - } try{ - projectLevelContentTable.setProjectLevelContent(projectContentDto.getProjectContent()); + ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() + .projectLevel(projectContentDto.getProjectLevel()) + .projectLevelContent(projectContentDto.getProjectContent()) + .build(); projectLevelContentTableRepository.save(projectLevelContentTable); switch (projectContentDto.getProjectLevel()){ case 1: @@ -325,11 +262,6 @@ public void createBacklog(BacklogRequestDto backLogRequestDto) { throw new CustomException("백로그를 생성할 수 없는 프로젝트입니다."); } ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - ProjectLevelContentTable projectBurndownChart = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 8); - if(!Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")){ - throw new CustomException("이미 백로그가 생성되어 있습니다."); - } - try{ List backlogListDtos = backLogRequestDto.getBacklogListDto(); for(BacklogListDto backlogListDto : backlogListDtos){ @@ -349,12 +281,6 @@ public void createBacklog(BacklogRequestDto backLogRequestDto) { .build(); backlogTableRepository.save(backlogTable); } - projectLevelContentTable.setProjectLevelContent(String.valueOf(backLogRequestDto.getIteration())); - projectBurndownChart.setProjectLevelContent(String.valueOf(backLogRequestDto.getIteration())); - projectLevelContentTableRepository.save(projectLevelContentTable); - projectLevelContentTableRepository.save(projectBurndownChart); - projectTable.setProjectLevel7(2); - projectTableRepository.save(projectTable); } catch (CustomException e){ log.error(e.getMessage()); throw new CustomException(e.getMessage()); From 73bcb223040e69e0796466c388010f2dd969e04f Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 3 Feb 2025 16:46:00 +0900 Subject: [PATCH 07/44] fix: change request parameter --- .../com/example/prdoit/service/project/ProjectServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 35035a8..71c9859 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -137,6 +137,7 @@ public void createProjectContent(ProjectContentDto projectContentDto) { ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() .projectLevel(projectContentDto.getProjectLevel()) .projectLevelContent(projectContentDto.getProjectContent()) + .projectId(projectTable) .build(); projectLevelContentTableRepository.save(projectLevelContentTable); switch (projectContentDto.getProjectLevel()){ From 9969a66dbf288a4f7cf60cb636b4009a154fe9ac Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 3 Feb 2025 23:54:04 +0900 Subject: [PATCH 08/44] refactor --- .../prdoit/controller/ProjectController.java | 44 +-- .../project/ProjectContentResponseDto.java | 14 +- .../dto/project/backlog/BacklogDeleteDto.java | 4 +- .../project/content/ContentResponseDto.java | 15 + .../content/ProjectContentDeleteDto.java | 4 + .../project/content/ProjectContentDto.java | 4 + .../ProjectLevelContentTableRepository.java | 4 + .../service/project/ProjectService.java | 8 +- .../service/project/ProjectServiceImpl.java | 329 +++++++++--------- 9 files changed, 201 insertions(+), 225 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 94fda32..a6fc398 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -53,11 +53,11 @@ public ResponseEntity getProject(@PathVariable String projectId) { } } - @GetMapping("/content/{projectId}/{level}") - public ResponseEntity getProjectContent(@PathVariable String projectId, @PathVariable int level) { + @GetMapping("/content/{projectId}/") + public ResponseEntity getProjectContent(@PathVariable String projectId) { log.info("[getProjectContent] 프로젝트 컨텐츠 조회 요청"); try{ - return ResponseEntity.ok(projectService.getProjectContent(projectId, level)); + return ResponseEntity.ok(projectService.getProjectContent(projectId)); } catch (RuntimeException e){ log.error("[getProjectContent] 프로젝트 컨텐츠 조회 실패"); return ResponseEntity.badRequest().body("프로젝트 컨텐츠 조회에 실패했습니다."); @@ -111,42 +111,6 @@ public ResponseEntity deleteProjectContent(@RequestBody ProjectContentDe } } - @PostMapping("/product") - public ResponseEntity createBacklog(@RequestBody BacklogRequestDto backLogRequestDto) { - log.info("[createBacklog] 백로그 생성 요청"); - try{ - projectService.createBacklog(backLogRequestDto); - return ResponseEntity.ok("백로그 생성에 성공했습니다."); - } catch (RuntimeException e){ - log.error(e.getMessage()); - return ResponseEntity.badRequest().body("백로그 생성에 실패했습니다."); - } - } - - @PatchMapping("/product") - public ResponseEntity updateBacklog(@RequestBody BacklogUpdateDto backLogUpdateDto) { - log.info("[updateBacklog] 백로그 수정 요청"); - try{ - projectService.updateBacklog(backLogUpdateDto); - return ResponseEntity.ok("백로그 수정에 성공했습니다."); - } catch (RuntimeException e){ - log.error("[updateBacklog] {}", e.getMessage()); - return ResponseEntity.badRequest().body("백로그 수정에 실패했습니다."); - } - } - - @DeleteMapping("/product") - public ResponseEntity deleteBacklog(@RequestBody BacklogDeleteDto backlogDeleteDto) { - log.info("[deleteBacklog] 백로그 삭제 요청"); - try{ - projectService.deleteBacklog(backlogDeleteDto); - return ResponseEntity.ok("백로그 삭제에 성공했습니다."); - } catch (RuntimeException e){ - log.error("[deleteBacklog] {}", e.getMessage()); - return ResponseEntity.badRequest().body("백로그 삭제에 실패했습니다."); - } - } - @PutMapping("/product") public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDto) { log.info("[putBacklog] 백로그 이동 요청"); @@ -159,6 +123,7 @@ public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDt } } + /* @GetMapping("/product/{projectId}") public ResponseEntity getBacklogList(@PathVariable String projectId) { log.info("[getBacklogList] 백로그 리스트 조회 요청"); @@ -169,6 +134,7 @@ public ResponseEntity getBacklogList(@PathVariable String projectId) { return ResponseEntity.badRequest().body("백로그 리스트 조회에 실패했습니다."); } } + */ @GetMapping("/burndown/{projectId}") public ResponseEntity getBurnDownChart(@PathVariable String projectId) { diff --git a/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java b/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java index c5902d8..3e7931e 100644 --- a/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java @@ -1,15 +1,19 @@ package com.example.prdoit.dto.project; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import com.example.prdoit.dto.project.backlog.BacklogResponseDto; +import com.example.prdoit.dto.project.content.ContentResponseDto; +import lombok.*; + +import java.util.List; @Getter +@Setter @Builder @AllArgsConstructor +@NoArgsConstructor public class ProjectContentResponseDto { - private String projectContent; - private int projectLevel; + private List contentResponseDtoList; + private List backlogResponseDtoList; } diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java index 5c5c963..e2a63d5 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java @@ -4,13 +4,11 @@ import lombok.Builder; import lombok.Getter; -import java.util.List; - @Getter @Builder @AllArgsConstructor public class BacklogDeleteDto { private String projectId; - private List backlogTaskIdList; + private String backlogTaskId; } diff --git a/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java b/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java new file mode 100644 index 0000000..36ffc0c --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java @@ -0,0 +1,15 @@ +package com.example.prdoit.dto.project.content; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Builder +public class ContentResponseDto { + + private int levelContentId; + private String projectContent; + private int projectLevel; + +} diff --git a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java b/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java index 7aa182b..3acc66f 100644 --- a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java @@ -1,12 +1,16 @@ package com.example.prdoit.dto.project.content; +import com.example.prdoit.dto.project.backlog.BacklogDeleteDto; import lombok.Builder; import lombok.Getter; +import java.util.List; + @Getter @Builder public class ProjectContentDeleteDto { private String projectId; private int projectLevel; + private List backlogTaskIdList; } diff --git a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java b/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java index e520ee1..18b2db9 100644 --- a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java @@ -1,8 +1,11 @@ package com.example.prdoit.dto.project.content; +import com.example.prdoit.dto.project.backlog.BacklogListDto; import lombok.Builder; import lombok.Getter; +import java.util.List; + @Getter @Builder public class ProjectContentDto { @@ -10,5 +13,6 @@ public class ProjectContentDto { private String projectId; private int projectLevel; private String projectContent; + private List backlogListDto; } diff --git a/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java index 2dbfe8f..715bce6 100644 --- a/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java @@ -4,7 +4,11 @@ import com.example.prdoit.model.ProjectTable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface ProjectLevelContentTableRepository extends JpaRepository { ProjectLevelContentTable findByProjectId(ProjectTable projectId); ProjectLevelContentTable findByProjectIdAndProjectLevel(ProjectTable projectId, int projectLevel); + + List findAllByProjectId(ProjectTable projectTable); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index 652eeac..63e15dd 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -16,7 +16,7 @@ public interface ProjectService { ProjectResponseDto getProject(String projectId); - ProjectContentResponseDto getProjectContent(String projectId, int projectLevel); + ProjectContentResponseDto getProjectContent(String projectId); List getProjectList(String userId); @@ -26,16 +26,16 @@ public interface ProjectService { void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto); + void putBacklog(BacklogPutDto backlogPutDto); + /* void createBacklog(BacklogRequestDto backLogRequestDto); void updateBacklog(BacklogUpdateDto backlogUpdateDto); void deleteBacklog(BacklogDeleteDto backlogDeleteDto); - void putBacklog(BacklogPutDto backlogPutDto); - List getBacklogList(String projectId); - + */ void createBurnDownChart(BurndownPostDto burndownPostDtoList); void updateBurnDownChart(List burndownPatchDtoList); diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 71c9859..9c2fd55 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -4,6 +4,7 @@ import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; import com.example.prdoit.dto.project.burndown.*; +import com.example.prdoit.dto.project.content.ContentResponseDto; import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; import com.example.prdoit.dto.project.content.ProjectContentDto; import com.example.prdoit.exception.CustomException; @@ -92,19 +93,48 @@ public ProjectResponseDto getProject(String projectId) { } @Override - public ProjectContentResponseDto getProjectContent(String projectId, int projectLevel) { + public ProjectContentResponseDto getProjectContent(String projectId) { log.info("[getProjectContent] 프로젝트 컨텐츠 조회 시작"); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository. - findByProjectIdAndProjectLevel(projectTable, projectLevel) != null ? projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectLevel) : null; - - if(projectLevelContentTable == null){ - return null; + List projectLevelContentTableList = projectLevelContentTableRepository.findAllByProjectId(projectTable); + ProjectContentResponseDto projectContentResponseDto = new ProjectContentResponseDto(new ArrayList<>(), new ArrayList<>()); + try { + for (ProjectLevelContentTable projectLevelContentTable : projectLevelContentTableList) { + if (projectLevelContentTable.getProjectLevel() == 8) continue; + if (projectLevelContentTable.getProjectLevel() == 7) { + projectContentResponseDto.setBacklogResponseDtoList(new ArrayList<>()); + List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); + if (backlogTableList == null) { + continue; + } + for (BacklogTable backlogTable : backlogTableList) { + projectContentResponseDto.getBacklogResponseDtoList().add(BacklogResponseDto.builder() + .backlogId(backlogTable.getBacklogId()) + .backlogUserStory(backlogTable.getBacklogUserStory()) + .backlogPriority(backlogTable.getBacklogPriority()) + .backlogTask(backlogTable.getBacklogTask()) + .backlogDescription(backlogTable.getBacklogDescription()) + .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus())) + .backlogWorker(backlogTable.getBacklogWorker()) + .backlogTaskId(backlogTable.getBacklogTaskId()) + .backlogEstimate(backlogTable.getBacklogEstimate()) + .build()); + } + } + projectContentResponseDto.getContentResponseDtoList().add(ContentResponseDto.builder() + .projectContent(projectLevelContentTable.getProjectLevelContent()) + .levelContentId(projectLevelContentTable.getLevelContentId()) + .projectLevel(projectLevelContentTable.getProjectLevel()) + .build()); + } + return projectContentResponseDto; + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; } - return ProjectContentResponseDto.builder() - .projectContent(projectLevelContentTable.getProjectLevelContent()) - .projectLevel(projectLevelContentTable.getProjectLevel()) - .build(); } @Override @@ -131,42 +161,70 @@ public List getProjectList(String userId) { @Override public void createProjectContent(ProjectContentDto projectContentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 시작"); + ProjectTable projectTable = projectTableRepository.findById(projectContentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTableCheck = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectContentDto.getProjectLevel()); + + if(projectLevelContentTableCheck != null){ + throw new CustomException("이미 생성된 컨텐츠가 있습니다."); + } try{ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectLevel(projectContentDto.getProjectLevel()) - .projectLevelContent(projectContentDto.getProjectContent()) - .projectId(projectTable) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - switch (projectContentDto.getProjectLevel()){ - case 1: - projectTable.setProjectLevel1(2); - break; - case 2: - projectTable.setProjectLevel2(2); - break; - case 3: - projectTable.setProjectLevel3(2); - break; - case 4: - projectTable.setProjectLevel4(2); - break; - case 5: - projectTable.setProjectLevel5(2); - break; - case 6: - projectTable.setProjectLevel6(2); - break; - case 7: - projectTable.setProjectLevel7(2); - break; - case 8: - projectTable.setProjectLevel8(2); - break; + if(projectContentDto.getBacklogListDto() == null){ + ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() + .projectLevel(projectContentDto.getProjectLevel()) + .projectLevelContent(projectContentDto.getProjectContent()) + .projectId(projectTable) + .build(); + projectLevelContentTableRepository.save(projectLevelContentTable); + switch (projectContentDto.getProjectLevel()){ + case 1: + projectTable.setProjectLevel1(2); + break; + case 2: + projectTable.setProjectLevel2(2); + break; + case 3: + projectTable.setProjectLevel3(2); + break; + case 4: + projectTable.setProjectLevel4(2); + break; + case 5: + projectTable.setProjectLevel5(2); + break; + case 6: + projectTable.setProjectLevel6(2); + break; + } + } else { + ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() + .projectLevel(projectContentDto.getProjectLevel()) + .projectLevelContent(projectContentDto.getProjectContent()) + .projectId(projectTable) + .build(); + projectLevelContentTableRepository.save(projectLevelContentTable); + List backlogListDtos = projectContentDto.getBacklogListDto(); + for(BacklogListDto backlogListDto : backlogListDtos){ + BacklogTable backlogTable = BacklogTable.builder() + .backlogUserStory(backlogListDto.getBacklogUserStory()) + .backlogPriority(backlogListDto.getBacklogPriority()) + .backlogTask(backlogListDto.getBacklogTask()) + .backlogTaskId(backlogListDto.getBacklogTaskId()) + .backlogDescription(backlogListDto.getBacklogDescription()) + .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) + .backlogEstimate(backlogListDto.getBacklogEstimate()) + .levelContentId(projectLevelContentTable) + .backlogWorker("") + .backlogIteration(0) + .backlogEndDate(null) + .backlogEndTime("") + .build(); + backlogTableRepository.save(backlogTable); + } + projectTable.setProjectLevel7(2); + projectTableRepository.save(projectTable); } - projectTableRepository.save(projectTable); } catch (CustomException e){ log.error(e.getMessage()); throw new CustomException(e.getMessage()); @@ -189,8 +247,24 @@ public void updateProjectContent(ProjectContentDto projectContentDto) { } try{ - projectLevelContentTable.setProjectLevelContent(projectContentDto.getProjectContent()); - projectLevelContentTableRepository.save(projectLevelContentTable); + if(projectContentDto.getBacklogListDto() == null){ + projectLevelContentTable.setProjectLevelContent(projectContentDto.getProjectContent()); + projectLevelContentTableRepository.save(projectLevelContentTable); + } else { + projectLevelContentTable.setProjectLevelContent(projectContentDto.getProjectContent()); + projectLevelContentTableRepository.save(projectLevelContentTable); + List backlogListDtos = projectContentDto.getBacklogListDto(); + for(BacklogListDto backlogListDto : backlogListDtos){ + BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogListDto.getBacklogTaskId(), projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogUserStory(backlogListDto.getBacklogUserStory()); + backlogTable.setBacklogPriority(backlogListDto.getBacklogPriority()); + backlogTable.setBacklogTask(backlogListDto.getBacklogTask()); + backlogTable.setBacklogTaskId(backlogListDto.getBacklogTaskId()); + backlogTable.setBacklogDescription(backlogListDto.getBacklogDescription()); + backlogTable.setBacklogEstimate(backlogListDto.getBacklogEstimate()); + backlogTableRepository.save(backlogTable); + } + } } catch (CustomException e){ log.error(e.getMessage()); throw new CustomException(e.getMessage()); @@ -216,35 +290,42 @@ public void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto } try{ - projectLevelContentTable.setProjectLevelContent(""); - projectLevelContentTableRepository.save(projectLevelContentTable); - switch (projectContentDeleteDto.getProjectLevel()){ - case 1: - projectTable.setProjectLevel1(1); - break; - case 2: - projectTable.setProjectLevel2(1); - break; - case 3: - projectTable.setProjectLevel3(1); - break; - case 4: - projectTable.setProjectLevel4(1); - break; - case 5: - projectTable.setProjectLevel5(1); - break; - case 6: - projectTable.setProjectLevel6(1); - break; - case 7: + if(projectContentDeleteDto.getBacklogTaskIdList() == null){ + log.info("[deleteProjectContent] 컨텐츠 삭제 시작"); + projectLevelContentTableRepository.delete(projectLevelContentTable); + switch (projectContentDeleteDto.getProjectLevel()){ + case 1: + projectTable.setProjectLevel1(1); + break; + case 2: + projectTable.setProjectLevel2(1); + break; + case 3: + projectTable.setProjectLevel3(1); + break; + case 4: + projectTable.setProjectLevel4(1); + break; + case 5: + projectTable.setProjectLevel5(1); + break; + case 6: + projectTable.setProjectLevel6(1); + break; + } + } else { + for(String backlogTaskId : projectContentDeleteDto.getBacklogTaskIdList()){ + BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogTaskId, projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTableRepository.delete(backlogTable); + } + List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); + if(backlogTableList.isEmpty()){ + projectLevelContentTable.setProjectLevelContent(""); + projectLevelContentTableRepository.save(projectLevelContentTable); projectTable.setProjectLevel7(1); - break; - case 8: - projectTable.setProjectLevel8(1); - break; + projectTableRepository.save(projectTable); + } } - projectTableRepository.save(projectTable); } catch (CustomException e){ log.error(e.getMessage()); @@ -255,109 +336,6 @@ public void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto } } - @Override - public void createBacklog(BacklogRequestDto backLogRequestDto) { - log.info("[createBacklog] 백로그 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(backLogRequestDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - if(projectTable.getProjectLevel7() == 0){ - throw new CustomException("백로그를 생성할 수 없는 프로젝트입니다."); - } - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - try{ - List backlogListDtos = backLogRequestDto.getBacklogListDto(); - for(BacklogListDto backlogListDto : backlogListDtos){ - BacklogTable backlogTable = BacklogTable.builder() - .backlogUserStory(backlogListDto.getBacklogUserStory()) - .backlogPriority(backlogListDto.getBacklogPriority()) - .backlogTask(backlogListDto.getBacklogTask()) - .backlogTaskId(backlogListDto.getBacklogTaskId()) - .backlogDescription(backlogListDto.getBacklogDescription()) - .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) - .backlogEstimate(backlogListDto.getBacklogEstimate()) - .levelContentId(projectLevelContentTable) - .backlogWorker("") - .backlogIteration(0) - .backlogEndDate(null) - .backlogEndTime("") - .build(); - backlogTableRepository.save(backlogTable); - } - } catch (CustomException e){ - log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error(e.getMessage()); - throw e; - } - } - - @Override - public void updateBacklog(BacklogUpdateDto backlogUpdateDto) { - log.info("[updateBacklog] 백로그 수정 시작"); - ProjectTable projectTable = projectTableRepository.findById(backlogUpdateDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - if(projectTable.getProjectLevel7() == 0){ - throw new CustomException("백로그를 수정할 수 없는 프로젝트입니다."); - } - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - if (Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")) { - throw new CustomException("백로그가 생성되어 있지 않습니다."); - } - - try{ - List backlogUpdateListDtos = backlogUpdateDto.getBacklogListDto(); - for(BacklogUpdateListDto backlogListDto : backlogUpdateListDtos){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogListDto.getPostTaskId(), projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogUserStory(backlogListDto.getBacklogUserStory()); - backlogTable.setBacklogPriority(backlogListDto.getBacklogPriority()); - backlogTable.setBacklogTask(backlogListDto.getBacklogTask()); - backlogTable.setBacklogTaskId(backlogListDto.getBacklogTaskId()); - backlogTable.setBacklogDescription(backlogListDto.getBacklogDescription()); - backlogTable.setBacklogEstimate(backlogListDto.getBacklogEstimate()); - backlogTableRepository.save(backlogTable); - } - } catch (CustomException e){ - log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[updateBacklog] 서버 오류"); - throw e; - } - } - - @Override - public void deleteBacklog(BacklogDeleteDto backlogDeleteDto) { - log.info("[deleteBacklog] 백로그 삭제 시작"); - ProjectTable projectTable = projectTableRepository.findById(backlogDeleteDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - if(projectTable.getProjectLevel7() == 0){ - throw new CustomException("백로그를 삭제할 수 없는 프로젝트입니다."); - } - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - if (Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")) { - throw new CustomException("백로그가 생성되어 있지 않습니다."); - } - - try{ - List backlogTaskIdList = backlogDeleteDto.getBacklogTaskIdList(); - for(String taskId : backlogTaskIdList){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(taskId, projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTableRepository.delete(backlogTable); - } - List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); - if(backlogTableList.isEmpty()){ - projectLevelContentTable.setProjectLevelContent(""); - projectLevelContentTableRepository.save(projectLevelContentTable); - projectTable.setProjectLevel7(1); - projectTableRepository.save(projectTable); - } - } catch (CustomException e){ - log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[deleteBacklog] 서버 오류"); - throw e; - } - } - @Override public void putBacklog(BacklogPutDto backlogPutDto) { log.info("[putBacklog] 백로그 이동 시작"); @@ -398,6 +376,7 @@ public void putBacklog(BacklogPutDto backlogPutDto) { } } + /* @Override public List getBacklogList(String projectId) { log.info("[getBacklogList] 백로그 리스트 조회 시작"); @@ -431,6 +410,8 @@ public List getBacklogList(String projectId) { } } + */ + @Override public void createBurnDownChart(BurndownPostDto burndownPostDtoList){ log.info("[createBurnDownChart] 번다운 차트 생성 시작"); From 99bf1edf096407f58f5a2e9f770bf8b8a5559bf0 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 4 Feb 2025 01:14:30 +0900 Subject: [PATCH 09/44] refactor --- .../prdoit/controller/ProjectController.java | 70 +---- .../project/ProjectContentResponseDto.java | 2 + ...pdateListDto.java => BacklogPatchDto.java} | 6 +- .../dto/project/backlog/BacklogUpdateDto.java | 2 +- ...ntDeleteDto.java => ContentDeleteDto.java} | 3 +- ...ProjectContentDto.java => ContentDto.java} | 4 +- .../dto/project/content/ContentPatchDto.java | 21 ++ .../service/project/ProjectService.java | 25 +- .../service/project/ProjectServiceImpl.java | 248 +++++++----------- 9 files changed, 147 insertions(+), 234 deletions(-) rename src/main/java/com/example/prdoit/dto/project/backlog/{BacklogUpdateListDto.java => BacklogPatchDto.java} (85%) rename src/main/java/com/example/prdoit/dto/project/content/{ProjectContentDeleteDto.java => ContentDeleteDto.java} (70%) rename src/main/java/com/example/prdoit/dto/project/content/{ProjectContentDto.java => ContentDto.java} (69%) create mode 100644 src/main/java/com/example/prdoit/dto/project/content/ContentPatchDto.java diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index a6fc398..4c31636 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -1,15 +1,12 @@ package com.example.prdoit.controller; import com.example.prdoit.dto.project.*; -import com.example.prdoit.dto.project.backlog.BacklogDeleteDto; import com.example.prdoit.dto.project.backlog.BacklogPutDto; -import com.example.prdoit.dto.project.backlog.BacklogRequestDto; -import com.example.prdoit.dto.project.backlog.BacklogUpdateDto; -import com.example.prdoit.dto.project.burndown.BurndownListDto; import com.example.prdoit.dto.project.burndown.BurndownPatchDto; import com.example.prdoit.dto.project.burndown.BurndownPostDto; -import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; -import com.example.prdoit.dto.project.content.ProjectContentDto; +import com.example.prdoit.dto.project.content.ContentDeleteDto; +import com.example.prdoit.dto.project.content.ContentDto; +import com.example.prdoit.dto.project.content.ContentPatchDto; import com.example.prdoit.service.project.ProjectService; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -76,10 +73,10 @@ public ResponseEntity getProjectList(@PathVariable String userId) { } @PostMapping("/content") - public ResponseEntity createProjectContent(@RequestBody ProjectContentDto projectContentDto) { + public ResponseEntity createProjectContent(@RequestBody ContentDto contentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 요청"); try{ - projectService.createProjectContent(projectContentDto); + projectService.createProjectContent(contentDto); return ResponseEntity.ok("프로젝트 컨텐츠 생성에 성공했습니다."); } catch (RuntimeException e){ log.error("[createProjectContent] {}", e.getMessage()); @@ -88,10 +85,10 @@ public ResponseEntity createProjectContent(@RequestBody ProjectContentDt } @PatchMapping("/content") - public ResponseEntity updateProjectContent(@RequestBody ProjectContentDto projectContentDto) { + public ResponseEntity updateProjectContent(@RequestBody ContentPatchDto contentDto) { log.info("[updateProjectContent] 프로젝트 컨텐츠 수정 요청"); try{ - projectService.updateProjectContent(projectContentDto); + projectService.updateProjectContent(contentDto); return ResponseEntity.ok("프로젝트 컨텐츠 수정에 성공했습니다."); } catch (RuntimeException e){ log.error("[updateProjectContent] {}", e.getMessage()); @@ -100,10 +97,10 @@ public ResponseEntity updateProjectContent(@RequestBody ProjectContentDt } @DeleteMapping("/content") - public ResponseEntity deleteProjectContent(@RequestBody ProjectContentDeleteDto projectContentDeleteDto) { + public ResponseEntity deleteProjectContent(@RequestBody ContentDeleteDto contentDeleteDto) { log.info("[deleteProjectContent] 프로젝트 컨텐츠 삭제 요청"); try{ - projectService.deleteProjectContent(projectContentDeleteDto); + projectService.deleteProjectContent(contentDeleteDto); return ResponseEntity.ok("프로젝트 컨텐츠 삭제에 성공했습니다."); } catch (RuntimeException e){ log.error("[deleteProjectContent] {}", e.getMessage()); @@ -122,53 +119,4 @@ public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDt return ResponseEntity.badRequest().body("백로그 이동에 실패했습니다."); } } - - /* - @GetMapping("/product/{projectId}") - public ResponseEntity getBacklogList(@PathVariable String projectId) { - log.info("[getBacklogList] 백로그 리스트 조회 요청"); - try{ - return ResponseEntity.ok(projectService.getBacklogList(projectId)); - } catch (RuntimeException e){ - log.error("[getBacklogList] 백로그 리스트 조회 실패"); - return ResponseEntity.badRequest().body("백로그 리스트 조회에 실패했습니다."); - } - } - */ - - @GetMapping("/burndown/{projectId}") - public ResponseEntity getBurnDownChart(@PathVariable String projectId) { - log.info("[getBurnDownChart] 번다운 차트 조회 요청"); - try{ - return ResponseEntity.ok(projectService.getBurnDownChart(projectId)); - } catch (RuntimeException e){ - log.error("[getBurnDownChart] 번다운 차트 조회 실패"); - return ResponseEntity.badRequest().body("번다운 차트 조회에 실패했습니다."); - } - } - - @PostMapping("/burndown") - public ResponseEntity createBurnDownChart(@RequestBody BurndownPostDto burndownPostDto) { - log.info("[createBurnDownChart] 번다운 차트 생성 요청"); - log.info("[createBurnDownChart] {}", burndownPostDto.getBurndownPostListDto().get(0).getIteration()); - try{ - projectService.createBurnDownChart(burndownPostDto); - return ResponseEntity.ok("번다운 차트 생성에 성공했습니다."); - } catch (RuntimeException e){ - log.error("[createBurnDownChart] {}", e.getMessage()); - return ResponseEntity.badRequest().body("번다운 차트 생성에 실패했습니다."); - } - } - - @PatchMapping("/burndown") - public ResponseEntity updateBurnDownChart(@RequestBody List burndownPatchDto) { - log.info("[updateBurnDownChart] 번다운 차트 수정 요청"); - try{ - projectService.updateBurnDownChart(burndownPatchDto); - return ResponseEntity.ok("번다운 차트 수정에 성공했습니다."); - } catch (RuntimeException e){ - log.error("[updateBurnDownChart] {}", e.getMessage()); - return ResponseEntity.badRequest().body("번다운 차트 수정에 실패했습니다."); - } - } } diff --git a/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java b/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java index 3e7931e..3c518fc 100644 --- a/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java @@ -1,6 +1,7 @@ package com.example.prdoit.dto.project; import com.example.prdoit.dto.project.backlog.BacklogResponseDto; +import com.example.prdoit.dto.project.burndown.BurndownResponseDto; import com.example.prdoit.dto.project.content.ContentResponseDto; import lombok.*; @@ -15,5 +16,6 @@ public class ProjectContentResponseDto { private List contentResponseDtoList; private List backlogResponseDtoList; + private List burndownResponseDtoList; } diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPatchDto.java similarity index 85% rename from src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java rename to src/main/java/com/example/prdoit/dto/project/backlog/BacklogPatchDto.java index 92fde9b..a052f0b 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateListDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogPatchDto.java @@ -7,8 +7,9 @@ @Getter @Builder @AllArgsConstructor -public class BacklogUpdateListDto { - +public class BacklogPatchDto { + + private int backlogId; private String backlogUserStory; private int backlogPriority; private String backlogTask; @@ -16,6 +17,5 @@ public class BacklogUpdateListDto { private String backlogWorker; private String backlogTaskId; private String backlogEstimate; - private String postTaskId; } diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java index 38c9c78..4c4b3db 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java @@ -12,6 +12,6 @@ public class BacklogUpdateDto { private String projectId; - private List backlogListDto; + private List backlogListDto; } diff --git a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java b/src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java similarity index 70% rename from src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java rename to src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java index 3acc66f..32b6f5f 100644 --- a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDeleteDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java @@ -1,6 +1,5 @@ package com.example.prdoit.dto.project.content; -import com.example.prdoit.dto.project.backlog.BacklogDeleteDto; import lombok.Builder; import lombok.Getter; @@ -8,7 +7,7 @@ @Getter @Builder -public class ProjectContentDeleteDto { +public class ContentDeleteDto { private String projectId; private int projectLevel; diff --git a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java b/src/main/java/com/example/prdoit/dto/project/content/ContentDto.java similarity index 69% rename from src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java rename to src/main/java/com/example/prdoit/dto/project/content/ContentDto.java index 18b2db9..6476d06 100644 --- a/src/main/java/com/example/prdoit/dto/project/content/ProjectContentDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ContentDto.java @@ -1,6 +1,7 @@ package com.example.prdoit.dto.project.content; import com.example.prdoit.dto.project.backlog.BacklogListDto; +import com.example.prdoit.dto.project.burndown.BurndownPostListDto; import lombok.Builder; import lombok.Getter; @@ -8,11 +9,12 @@ @Getter @Builder -public class ProjectContentDto { +public class ContentDto { private String projectId; private int projectLevel; private String projectContent; private List backlogListDto; + private List burndownPostListDto; } diff --git a/src/main/java/com/example/prdoit/dto/project/content/ContentPatchDto.java b/src/main/java/com/example/prdoit/dto/project/content/ContentPatchDto.java new file mode 100644 index 0000000..81cdb83 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/content/ContentPatchDto.java @@ -0,0 +1,21 @@ +package com.example.prdoit.dto.project.content; + +import com.example.prdoit.dto.project.backlog.BacklogPatchDto; +import com.example.prdoit.dto.project.burndown.BurndownPatchDto; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentPatchDto { + + private String projectId; + private int projectLevel; + private String projectContent; + private List backlogPatchDtoList; + private List burndownPatchDtoList; +} diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index 63e15dd..b0b8e3c 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -4,10 +4,10 @@ import com.example.prdoit.dto.project.backlog.*; import com.example.prdoit.dto.project.burndown.BurndownPatchDto; import com.example.prdoit.dto.project.burndown.BurndownPostDto; -import com.example.prdoit.dto.project.burndown.BurndownListDto; import com.example.prdoit.dto.project.burndown.BurndownResponseDto; -import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; -import com.example.prdoit.dto.project.content.ProjectContentDto; +import com.example.prdoit.dto.project.content.ContentDeleteDto; +import com.example.prdoit.dto.project.content.ContentDto; +import com.example.prdoit.dto.project.content.ContentPatchDto; import java.util.List; @@ -20,25 +20,12 @@ public interface ProjectService { List getProjectList(String userId); - void createProjectContent(ProjectContentDto projectContentDto); + void createProjectContent(ContentDto contentDto); - void updateProjectContent(ProjectContentDto projectContentDto); + void updateProjectContent(ContentPatchDto contentDto); - void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto); + void deleteProjectContent(ContentDeleteDto contentDeleteDto); void putBacklog(BacklogPutDto backlogPutDto); - /* - void createBacklog(BacklogRequestDto backLogRequestDto); - void updateBacklog(BacklogUpdateDto backlogUpdateDto); - - void deleteBacklog(BacklogDeleteDto backlogDeleteDto); - - List getBacklogList(String projectId); - */ - void createBurnDownChart(BurndownPostDto burndownPostDtoList); - - void updateBurnDownChart(List burndownPatchDtoList); - - List getBurnDownChart(String projectId); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 9c2fd55..b65ff51 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -4,9 +4,10 @@ import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; import com.example.prdoit.dto.project.burndown.*; +import com.example.prdoit.dto.project.content.ContentPatchDto; import com.example.prdoit.dto.project.content.ContentResponseDto; -import com.example.prdoit.dto.project.content.ProjectContentDeleteDto; -import com.example.prdoit.dto.project.content.ProjectContentDto; +import com.example.prdoit.dto.project.content.ContentDeleteDto; +import com.example.prdoit.dto.project.content.ContentDto; import com.example.prdoit.exception.CustomException; import com.example.prdoit.model.BacklogTable; import com.example.prdoit.model.IdTable; @@ -97,11 +98,18 @@ public ProjectContentResponseDto getProjectContent(String projectId) { log.info("[getProjectContent] 프로젝트 컨텐츠 조회 시작"); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); List projectLevelContentTableList = projectLevelContentTableRepository.findAllByProjectId(projectTable); - ProjectContentResponseDto projectContentResponseDto = new ProjectContentResponseDto(new ArrayList<>(), new ArrayList<>()); + ProjectContentResponseDto projectContentResponseDto = new ProjectContentResponseDto(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); try { for (ProjectLevelContentTable projectLevelContentTable : projectLevelContentTableList) { - if (projectLevelContentTable.getProjectLevel() == 8) continue; - if (projectLevelContentTable.getProjectLevel() == 7) { + log.info("[getProjectContent] 프로젝트 레벨 컨텐츠 조회 시작"); + if (projectLevelContentTable.getProjectLevel() < 7) { + projectContentResponseDto.getContentResponseDtoList().add(ContentResponseDto.builder() + .projectContent(projectLevelContentTable.getProjectLevelContent()) + .levelContentId(projectLevelContentTable.getLevelContentId()) + .projectLevel(projectLevelContentTable.getProjectLevel()) + .build()); + } + if(projectLevelContentTable.getProjectLevel() == 7){ projectContentResponseDto.setBacklogResponseDtoList(new ArrayList<>()); List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); if (backlogTableList == null) { @@ -120,12 +128,9 @@ public ProjectContentResponseDto getProjectContent(String projectId) { .backlogEstimate(backlogTable.getBacklogEstimate()) .build()); } + } else{ + projectContentResponseDto.setBurndownResponseDtoList(getBurnDownChart(projectId)); } - projectContentResponseDto.getContentResponseDtoList().add(ContentResponseDto.builder() - .projectContent(projectLevelContentTable.getProjectLevelContent()) - .levelContentId(projectLevelContentTable.getLevelContentId()) - .projectLevel(projectLevelContentTable.getProjectLevel()) - .build()); } return projectContentResponseDto; } catch (CustomException e) { @@ -159,52 +164,25 @@ public List getProjectList(String userId) { } @Override - public void createProjectContent(ProjectContentDto projectContentDto) { + public void createProjectContent(ContentDto contentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(projectContentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTableCheck = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectContentDto.getProjectLevel()); + ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTableCheck = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, contentDto.getProjectLevel()); if(projectLevelContentTableCheck != null){ throw new CustomException("이미 생성된 컨텐츠가 있습니다."); } try{ - if(projectContentDto.getBacklogListDto() == null){ + if(contentDto.getBacklogListDto() != null){ ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectLevel(projectContentDto.getProjectLevel()) - .projectLevelContent(projectContentDto.getProjectContent()) + .projectLevel(contentDto.getProjectLevel()) + .projectLevelContent(contentDto.getProjectContent()) .projectId(projectTable) .build(); projectLevelContentTableRepository.save(projectLevelContentTable); - switch (projectContentDto.getProjectLevel()){ - case 1: - projectTable.setProjectLevel1(2); - break; - case 2: - projectTable.setProjectLevel2(2); - break; - case 3: - projectTable.setProjectLevel3(2); - break; - case 4: - projectTable.setProjectLevel4(2); - break; - case 5: - projectTable.setProjectLevel5(2); - break; - case 6: - projectTable.setProjectLevel6(2); - break; - } - } else { - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectLevel(projectContentDto.getProjectLevel()) - .projectLevelContent(projectContentDto.getProjectContent()) - .projectId(projectTable) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - List backlogListDtos = projectContentDto.getBacklogListDto(); + List backlogListDtos = contentDto.getBacklogListDto(); for(BacklogListDto backlogListDto : backlogListDtos){ BacklogTable backlogTable = BacklogTable.builder() .backlogUserStory(backlogListDto.getBacklogUserStory()) @@ -224,6 +202,49 @@ public void createProjectContent(ProjectContentDto projectContentDto) { } projectTable.setProjectLevel7(2); projectTableRepository.save(projectTable); + } else if(contentDto.getBurndownPostListDto() != null){ + ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() + .projectLevel(contentDto.getProjectLevel()) + .projectLevelContent(contentDto.getProjectContent()) + .projectId(projectTable) + .build(); + projectLevelContentTableRepository.save(projectLevelContentTable); + List burndownPostListDtos = contentDto.getBurndownPostListDto(); + for(BurndownPostListDto burndownPostListDto : burndownPostListDtos){ + BacklogTable backlogTable = backlogTableRepository.findByBacklogId(burndownPostListDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogIteration(burndownPostListDto.getIteration()); + backlogTableRepository.save(backlogTable); + } + projectTable.setProjectLevel8(2); + projectTableRepository.save(projectTable); + } + else { + ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() + .projectLevel(contentDto.getProjectLevel()) + .projectLevelContent(contentDto.getProjectContent()) + .projectId(projectTable) + .build(); + projectLevelContentTableRepository.save(projectLevelContentTable); + switch (contentDto.getProjectLevel()){ + case 1: + projectTable.setProjectLevel1(2); + break; + case 2: + projectTable.setProjectLevel2(2); + break; + case 3: + projectTable.setProjectLevel3(2); + break; + case 4: + projectTable.setProjectLevel4(2); + break; + case 5: + projectTable.setProjectLevel5(2); + break; + case 6: + projectTable.setProjectLevel6(2); + break; + } } } catch (CustomException e){ log.error(e.getMessage()); @@ -235,10 +256,10 @@ public void createProjectContent(ProjectContentDto projectContentDto) { } @Override - public void updateProjectContent(ProjectContentDto projectContentDto) { + public void updateProjectContent(ContentPatchDto contentPatchDto) { log.info("[updateProjectContent] 프로젝트 컨텐츠 수정 시작"); - ProjectTable projectTable = projectTableRepository.findById(projectContentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectContentDto.getProjectLevel()); + ProjectTable projectTable = projectTableRepository.findById(contentPatchDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, contentPatchDto.getProjectLevel()); if(projectLevelContentTable == null){ throw new CustomException("존재하지 않는 프로젝트 레벨입니다."); } @@ -247,24 +268,38 @@ public void updateProjectContent(ProjectContentDto projectContentDto) { } try{ - if(projectContentDto.getBacklogListDto() == null){ - projectLevelContentTable.setProjectLevelContent(projectContentDto.getProjectContent()); + if(contentPatchDto.getBacklogPatchDtoList() != null){ + projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); projectLevelContentTableRepository.save(projectLevelContentTable); - } else { - projectLevelContentTable.setProjectLevelContent(projectContentDto.getProjectContent()); + List backlogPatchDtoList = contentPatchDto.getBacklogPatchDtoList(); + + for(BacklogPatchDto backlogPatchDto : backlogPatchDtoList){ + BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogPatchDto.getBacklogTaskId(), projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogUserStory(backlogPatchDto.getBacklogUserStory()); + backlogTable.setBacklogPriority(backlogPatchDto.getBacklogPriority()); + backlogTable.setBacklogTask(backlogPatchDto.getBacklogTask()); + backlogTable.setBacklogTaskId(backlogPatchDto.getBacklogTaskId()); + backlogTable.setBacklogDescription(backlogPatchDto.getBacklogDescription()); + backlogTable.setBacklogEstimate(backlogPatchDto.getBacklogEstimate()); + backlogTableRepository.save(backlogTable); + } + } else if(contentPatchDto.getBurndownPatchDtoList() != null){ + projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); projectLevelContentTableRepository.save(projectLevelContentTable); - List backlogListDtos = projectContentDto.getBacklogListDto(); - for(BacklogListDto backlogListDto : backlogListDtos){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogListDto.getBacklogTaskId(), projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogUserStory(backlogListDto.getBacklogUserStory()); - backlogTable.setBacklogPriority(backlogListDto.getBacklogPriority()); - backlogTable.setBacklogTask(backlogListDto.getBacklogTask()); - backlogTable.setBacklogTaskId(backlogListDto.getBacklogTaskId()); - backlogTable.setBacklogDescription(backlogListDto.getBacklogDescription()); - backlogTable.setBacklogEstimate(backlogListDto.getBacklogEstimate()); + + for(BurndownPatchDto burndownPatchDto : contentPatchDto.getBurndownPatchDtoList()){ + BacklogTable backlogTable = backlogTableRepository.findById(burndownPatchDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogStatus(burndownPatchDto.getBacklogStatus()); + backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTable.setBacklogEndDate(burndownPatchDto.getBacklogEndDate()); + backlogTable.setBacklogEndTime(burndownPatchDto.getBacklogEndTime()); backlogTableRepository.save(backlogTable); } } + else { + projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); + projectLevelContentTableRepository.save(projectLevelContentTable); + } } catch (CustomException e){ log.error(e.getMessage()); throw new CustomException(e.getMessage()); @@ -275,11 +310,11 @@ public void updateProjectContent(ProjectContentDto projectContentDto) { } @Override - public void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto) { + public void deleteProjectContent(ContentDeleteDto contentDeleteDto) { log.info("[deleteProjectContent] 프로젝트 컨텐츠 삭제 시작"); - ProjectTable projectTable = projectTableRepository.findById(projectContentDeleteDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectContentDeleteDto.getProjectLevel()); + ProjectTable projectTable = projectTableRepository.findById(contentDeleteDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, contentDeleteDto.getProjectLevel()); if(projectLevelContentTable == null){ throw new CustomException("존재하지 않는 프로젝트 레벨입니다."); @@ -290,10 +325,10 @@ public void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto } try{ - if(projectContentDeleteDto.getBacklogTaskIdList() == null){ + if(contentDeleteDto.getBacklogTaskIdList() == null){ log.info("[deleteProjectContent] 컨텐츠 삭제 시작"); projectLevelContentTableRepository.delete(projectLevelContentTable); - switch (projectContentDeleteDto.getProjectLevel()){ + switch (contentDeleteDto.getProjectLevel()){ case 1: projectTable.setProjectLevel1(1); break; @@ -314,7 +349,7 @@ public void deleteProjectContent(ProjectContentDeleteDto projectContentDeleteDto break; } } else { - for(String backlogTaskId : projectContentDeleteDto.getBacklogTaskIdList()){ + for(String backlogTaskId : contentDeleteDto.getBacklogTaskIdList()){ BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogTaskId, projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); backlogTableRepository.delete(backlogTable); } @@ -376,87 +411,6 @@ public void putBacklog(BacklogPutDto backlogPutDto) { } } - /* - @Override - public List getBacklogList(String projectId) { - log.info("[getBacklogList] 백로그 리스트 조회 시작"); - ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - if (projectTable.getProjectLevel7() == 0) { - throw new CustomException("백로그를 조회할 수 없는 프로젝트입니다."); - } - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - if (Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")) { - throw new CustomException("백로그가 생성되어 있지 않습니다."); - } - try{ - List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); - return backlogTableList.stream().map(backlogTable -> BacklogResponseDto.builder() - .backlogId(backlogTable.getBacklogId()) - .backlogUserStory(backlogTable.getBacklogUserStory()) - .backlogPriority(backlogTable.getBacklogPriority()) - .backlogTask(backlogTable.getBacklogTask()) - .backlogDescription(backlogTable.getBacklogDescription()) - .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus())) - .backlogWorker(backlogTable.getBacklogWorker()) - .backlogTaskId(backlogTable.getBacklogTaskId()) - .backlogEstimate(backlogTable.getBacklogEstimate()) - .build()).toList(); - } catch (CustomException e){ - log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error(e.getMessage()); - throw e; - } - } - - */ - - @Override - public void createBurnDownChart(BurndownPostDto burndownPostDtoList){ - log.info("[createBurnDownChart] 번다운 차트 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(burndownPostDtoList.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - try{ - for(BurndownPostListDto burndownPostListDto : burndownPostDtoList.getBurndownPostListDto()){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogId(burndownPostListDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogIteration(burndownPostListDto.getIteration()); - backlogTableRepository.save(backlogTable); - } - projectTable.setProjectLevel8(2); - projectTableRepository.save(projectTable); - } catch (CustomException e){ - log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[createBurnDownChart] 서버 오류"); - throw e; - } - } - - @Override - public void updateBurnDownChart(List burndownPatchDtoList){ - log.info("[updateBurnDownChart] 번다운 차트 수정 시작"); - - try{ - for(BurndownPatchDto burndownPatchDto : burndownPatchDtoList){ - BacklogTable backlogTable = backlogTableRepository.findById(burndownPatchDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogStatus(burndownPatchDto.getBacklogStatus()); - backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); - backlogTable.setBacklogEndDate(burndownPatchDto.getBacklogEndDate()); - backlogTable.setBacklogEndTime(burndownPatchDto.getBacklogEndTime()); - - backlogTableRepository.save(backlogTable); - } - } catch (CustomException e){ - log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[updateBurnDownChart] 서버 오류"); - throw e; - } - } - - @Override public List getBurnDownChart(String projectId) { log.info("[getBurnDownChart] 번다운 차트 조회 시작"); List burndownResponseDtoList = new ArrayList<>(); From 3092b17ffb077b3ffc95d56717a7420e3be7ea75 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 4 Feb 2025 15:45:02 +0900 Subject: [PATCH 10/44] asdf --- .../prdoit/controller/ProjectController.java | 4 +- .../dto/project/burndown/BurndownListDto.java | 4 +- .../repository/BacklogTableRepository.java | 13 +- .../ProjectLevelContentTableRepository.java | 3 +- .../service/project/ProjectService.java | 10 - .../service/project/ProjectServiceImpl.java | 296 +++++------------- 6 files changed, 87 insertions(+), 243 deletions(-) diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 4c31636..10564e6 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -83,7 +83,7 @@ public ResponseEntity createProjectContent(@RequestBody ContentDto conte return ResponseEntity.badRequest().body("프로젝트 컨텐츠 생성에 실패했습니다."); } } - +/* @PatchMapping("/content") public ResponseEntity updateProjectContent(@RequestBody ContentPatchDto contentDto) { log.info("[updateProjectContent] 프로젝트 컨텐츠 수정 요청"); @@ -119,4 +119,6 @@ public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDt return ResponseEntity.badRequest().body("백로그 이동에 실패했습니다."); } } + + */ } diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java index 9588371..ec0ff81 100644 --- a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownListDto.java @@ -3,17 +3,19 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Getter @Builder @AllArgsConstructor +@NoArgsConstructor public class BurndownListDto { private int backlogId; private String backlogTask; - private String backlogStatus; + private int backlogStatus; private String backlogWorker; private String backlogTaskId; private String backlogEstimate; diff --git a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java index e1069d1..f8b4a18 100644 --- a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java @@ -1,5 +1,6 @@ package com.example.prdoit.repository; +import com.example.prdoit.dto.project.burndown.BurndownListDto; import com.example.prdoit.model.BacklogTable; import com.example.prdoit.model.ProjectLevelContentTable; import com.example.prdoit.model.ProjectTable; @@ -12,11 +13,15 @@ @Repository public interface BacklogTableRepository extends JpaRepository { - Optional findByBacklogTaskIdAndLevelContentId(String backlogTaskId, ProjectLevelContentTable levelContentId); + + @Query("SELECT new com.example.prdoit.dto.project.backlog.BacklogResponseDto(b.backlogId, b.backlogTask, " + + "b.backlogStatus, b.backlogWorker, b.backlogTaskId, b.backlogEstimate, b.backlogEndDate, b.backlogEndTime) FROM BacklogTable b " + + "WHERE b.levelContentId=:levelContentId") List findAllByLevelContentId(ProjectLevelContentTable levelContentId); - List findAllByLevelContentIdAndBacklogIteration(ProjectLevelContentTable levelContentId, int iteration); - @Query("SELECT b FROM BacklogTable b WHERE b.backlogId=:backlogId") - Optional findByBacklogId(int backlogId); + @Query("SELECT new com.example.prdoit.dto.project.burndown.BurndownListDto(b.backlogId, b.backlogTask, " + + "b.backlogStatus, b.backlogWorker, b.backlogTaskId, b.backlogEstimate, b.backlogEndDate, b.backlogEndTime) FROM BacklogTable b " + + "WHERE b.levelContentId=:levelContentId AND b.backlogIteration=:iteration") + List findAllByLevelContentIdAndBacklogIteration(ProjectLevelContentTable levelContentId, int iteration); } diff --git a/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java index 715bce6..8f78c83 100644 --- a/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java @@ -5,10 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface ProjectLevelContentTableRepository extends JpaRepository { ProjectLevelContentTable findByProjectId(ProjectTable projectId); - ProjectLevelContentTable findByProjectIdAndProjectLevel(ProjectTable projectId, int projectLevel); + Optional findByProjectIdAndProjectLevel(ProjectTable projectId, int projectLevel); List findAllByProjectId(ProjectTable projectTable); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index b0b8e3c..97baeb4 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -2,9 +2,6 @@ import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; -import com.example.prdoit.dto.project.burndown.BurndownPatchDto; -import com.example.prdoit.dto.project.burndown.BurndownPostDto; -import com.example.prdoit.dto.project.burndown.BurndownResponseDto; import com.example.prdoit.dto.project.content.ContentDeleteDto; import com.example.prdoit.dto.project.content.ContentDto; import com.example.prdoit.dto.project.content.ContentPatchDto; @@ -21,11 +18,4 @@ public interface ProjectService { List getProjectList(String userId); void createProjectContent(ContentDto contentDto); - - void updateProjectContent(ContentPatchDto contentDto); - - void deleteProjectContent(ContentDeleteDto contentDeleteDto); - - void putBacklog(BacklogPutDto backlogPutDto); - } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index b65ff51..76f2e29 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -166,280 +166,124 @@ public List getProjectList(String userId) { @Override public void createProjectContent(ContentDto contentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTableCheck = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, contentDto.getProjectLevel()); - - if(projectLevelContentTableCheck != null){ - throw new CustomException("이미 생성된 컨텐츠가 있습니다."); - } - - try{ - if(contentDto.getBacklogListDto() != null){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectLevel(contentDto.getProjectLevel()) + try { + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7).orElseGet(() -> { + ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() .projectLevelContent(contentDto.getProjectContent()) + .projectLevel(7) .projectId(projectTable) .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - List backlogListDtos = contentDto.getBacklogListDto(); - for(BacklogListDto backlogListDto : backlogListDtos){ - BacklogTable backlogTable = BacklogTable.builder() - .backlogUserStory(backlogListDto.getBacklogUserStory()) - .backlogPriority(backlogListDto.getBacklogPriority()) - .backlogTask(backlogListDto.getBacklogTask()) - .backlogTaskId(backlogListDto.getBacklogTaskId()) - .backlogDescription(backlogListDto.getBacklogDescription()) - .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) - .backlogEstimate(backlogListDto.getBacklogEstimate()) - .levelContentId(projectLevelContentTable) - .backlogWorker("") - .backlogIteration(0) - .backlogEndDate(null) - .backlogEndTime("") - .build(); - backlogTableRepository.save(backlogTable); - } - projectTable.setProjectLevel7(2); - projectTableRepository.save(projectTable); + projectLevelContentTableRepository.save(projectLevelContentTable1); + return projectLevelContentTable1; + }); + + if(contentDto.getBacklogListDto() != null){ + createBacklog(contentDto); } else if(contentDto.getBurndownPostListDto() != null){ - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectLevel(contentDto.getProjectLevel()) - .projectLevelContent(contentDto.getProjectContent()) - .projectId(projectTable) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - List burndownPostListDtos = contentDto.getBurndownPostListDto(); - for(BurndownPostListDto burndownPostListDto : burndownPostListDtos){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogId(burndownPostListDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogIteration(burndownPostListDto.getIteration()); - backlogTableRepository.save(backlogTable); - } - projectTable.setProjectLevel8(2); - projectTableRepository.save(projectTable); - } - else { - ProjectLevelContentTable projectLevelContentTable = ProjectLevelContentTable.builder() - .projectLevel(contentDto.getProjectLevel()) - .projectLevelContent(contentDto.getProjectContent()) - .projectId(projectTable) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable); - switch (contentDto.getProjectLevel()){ - case 1: - projectTable.setProjectLevel1(2); - break; - case 2: - projectTable.setProjectLevel2(2); - break; - case 3: - projectTable.setProjectLevel3(2); - break; - case 4: - projectTable.setProjectLevel4(2); - break; - case 5: - projectTable.setProjectLevel5(2); - break; - case 6: - projectTable.setProjectLevel6(2); - break; - } + createBurndown(contentDto); } - } catch (CustomException e){ + } catch (CustomException e) { log.error(e.getMessage()); throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[createProjectContent] 서버 오류"); - throw e; - } - } - - @Override - public void updateProjectContent(ContentPatchDto contentPatchDto) { - log.info("[updateProjectContent] 프로젝트 컨텐츠 수정 시작"); - ProjectTable projectTable = projectTableRepository.findById(contentPatchDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, contentPatchDto.getProjectLevel()); - if(projectLevelContentTable == null){ - throw new CustomException("존재하지 않는 프로젝트 레벨입니다."); - } - if(Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")){ - throw new CustomException("컨텐츠가 생성되어 있지 않습니다."); - } - - try{ - if(contentPatchDto.getBacklogPatchDtoList() != null){ - projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); - projectLevelContentTableRepository.save(projectLevelContentTable); - List backlogPatchDtoList = contentPatchDto.getBacklogPatchDtoList(); - - for(BacklogPatchDto backlogPatchDto : backlogPatchDtoList){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogPatchDto.getBacklogTaskId(), projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogUserStory(backlogPatchDto.getBacklogUserStory()); - backlogTable.setBacklogPriority(backlogPatchDto.getBacklogPriority()); - backlogTable.setBacklogTask(backlogPatchDto.getBacklogTask()); - backlogTable.setBacklogTaskId(backlogPatchDto.getBacklogTaskId()); - backlogTable.setBacklogDescription(backlogPatchDto.getBacklogDescription()); - backlogTable.setBacklogEstimate(backlogPatchDto.getBacklogEstimate()); - backlogTableRepository.save(backlogTable); - } - } else if(contentPatchDto.getBurndownPatchDtoList() != null){ - projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); - projectLevelContentTableRepository.save(projectLevelContentTable); - - for(BurndownPatchDto burndownPatchDto : contentPatchDto.getBurndownPatchDtoList()){ - BacklogTable backlogTable = backlogTableRepository.findById(burndownPatchDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogStatus(burndownPatchDto.getBacklogStatus()); - backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); - backlogTable.setBacklogEndDate(burndownPatchDto.getBacklogEndDate()); - backlogTable.setBacklogEndTime(burndownPatchDto.getBacklogEndTime()); - backlogTableRepository.save(backlogTable); - } - } - else { - projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); - projectLevelContentTableRepository.save(projectLevelContentTable); - } - } catch (CustomException e){ + } catch (RuntimeException e) { log.error(e.getMessage()); - throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[updateProjectContent] 서버 오류"); throw e; } } - @Override - public void deleteProjectContent(ContentDeleteDto contentDeleteDto) { - log.info("[deleteProjectContent] 프로젝트 컨텐츠 삭제 시작"); - - ProjectTable projectTable = projectTableRepository.findById(contentDeleteDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, contentDeleteDto.getProjectLevel()); - - if(projectLevelContentTable == null){ - throw new CustomException("존재하지 않는 프로젝트 레벨입니다."); - } - - if(Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")){ - throw new CustomException("컨텐츠가 생성되어 있지 않습니다."); + public void createBurndown(ContentDto contentDto){ + log.info("[createBurndown] 번다운 차트 생성 시작"); + ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 8).orElseGet(() -> { + ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() + .projectLevelContent(contentDto.getProjectContent()) + .projectLevel(8) + .projectId(projectTable) + .build(); + projectLevelContentTableRepository.save(projectLevelContentTable1); + return projectLevelContentTable1; + }); + if(projectTable.getProjectLevel8() == 0){ + throw new CustomException("번다운 차트를 생성할 수 없는 프로젝트입니다."); } - try{ - if(contentDeleteDto.getBacklogTaskIdList() == null){ - log.info("[deleteProjectContent] 컨텐츠 삭제 시작"); - projectLevelContentTableRepository.delete(projectLevelContentTable); - switch (contentDeleteDto.getProjectLevel()){ - case 1: - projectTable.setProjectLevel1(1); - break; - case 2: - projectTable.setProjectLevel2(1); - break; - case 3: - projectTable.setProjectLevel3(1); - break; - case 4: - projectTable.setProjectLevel4(1); - break; - case 5: - projectTable.setProjectLevel5(1); - break; - case 6: - projectTable.setProjectLevel6(1); - break; - } - } else { - for(String backlogTaskId : contentDeleteDto.getBacklogTaskIdList()){ - BacklogTable backlogTable = backlogTableRepository.findByBacklogTaskIdAndLevelContentId(backlogTaskId, projectLevelContentTable).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTableRepository.delete(backlogTable); - } - List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); - if(backlogTableList.isEmpty()){ - projectLevelContentTable.setProjectLevelContent(""); - projectLevelContentTableRepository.save(projectLevelContentTable); - projectTable.setProjectLevel7(1); - projectTableRepository.save(projectTable); - } + for(BurndownPostListDto burndownPostListDto : contentDto.getBurndownPostListDto()){ + BacklogTable backlogTable = backlogTableRepository.findById(burndownPostListDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogIteration(burndownPostListDto.getIteration()); + backlogTableRepository.save(backlogTable); } - - } catch (CustomException e){ + } catch (CustomException e) { log.error(e.getMessage()); throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[deleteProjectContent] 서버 오류"); + } catch (RuntimeException e) { + log.error(e.getMessage()); throw e; } } - @Override - public void putBacklog(BacklogPutDto backlogPutDto) { - log.info("[putBacklog] 백로그 이동 시작"); - ProjectTable projectTable = projectTableRepository.findById(backlogPutDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + public void createBacklog(ContentDto contentDto) { + log.info("[createBacklog] 백로그 생성 시작"); + ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7).orElseGet(() -> { + ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() + .projectLevelContent(contentDto.getProjectContent()) + .projectLevel(7) + .projectId(projectTable) + .build(); + projectLevelContentTableRepository.save(projectLevelContentTable1); + return projectLevelContentTable1; + }); + if(projectTable.getProjectLevel7() == 0){ - throw new CustomException("백로그를 이동할 수 없는 프로젝트입니다."); - } - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - if (Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")) { - throw new CustomException("백로그가 생성되어 있지 않습니다."); + throw new CustomException("백로그를 생성할 수 없는 프로젝트입니다."); } - try{ - List backlogListDtos = backlogPutDto.getBacklogPutListDto(); - for(BacklogPutListDto backlogListDto : backlogListDtos){ - BacklogTable backlogtable = BacklogTable.builder() - .backlogEstimate(backlogListDto.getBacklogEstimate()) - .backlogDescription(backlogListDto.getBacklogDescription()) - .backlogTaskId(backlogListDto.getBacklogTaskId()) - .backlogTask(backlogListDto.getBacklogTask()) - .backlogPriority(backlogListDto.getBacklogPriority()) - .backlogUserStory(backlogListDto.getBacklogUserStory()) - .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) + try { + for (BacklogListDto backlogDto : contentDto.getBacklogListDto()) { + BacklogTable backlogTable = BacklogTable.builder() + .backlogUserStory(backlogDto.getBacklogUserStory()) + .backlogPriority(backlogDto.getBacklogPriority()) + .backlogTask(backlogDto.getBacklogTask()) + .backlogDescription(backlogDto.getBacklogDescription()) + .backlogWorker(backlogDto.getBacklogWorker()) + .backlogTaskId(backlogDto.getBacklogTaskId()) + .backlogEstimate(backlogDto.getBacklogEstimate()) .levelContentId(projectLevelContentTable) - .backlogWorker("") - .backlogIteration(0) - .backlogEndDate(null) - .backlogEndTime("") .build(); - backlogTableRepository.save(backlogtable); + backlogTableRepository.save(backlogTable); } - } catch (CustomException e){ + } catch (CustomException e) { log.error(e.getMessage()); throw new CustomException(e.getMessage()); - } catch (RuntimeException e){ - log.error("[putBacklog] 서버 오류"); + } catch (RuntimeException e) { + log.error(e.getMessage()); throw e; } } public List getBurnDownChart(String projectId) { log.info("[getBurnDownChart] 번다운 차트 조회 시작"); + List burndownResponseDtoList = new ArrayList<>(); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + if (projectTable.getProjectLevel8() == 0) { throw new CustomException("번다운 차트를 조회할 수 없는 프로젝트입니다."); } - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7); - if (Objects.equals(projectLevelContentTable.getProjectLevelContent(), "")) { - throw new CustomException("번다운 차트가 생성되어 있지 않습니다."); - } + + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository. + findByProjectIdAndProjectLevel(projectTable, 7).orElseThrow(() -> new CustomException("번다운 차트가 생성되어있지 않습니다.")); + try { for ( int i = 1 ; i <= parseInt(projectLevelContentTable.getProjectLevelContent()) ; i++){ - List backlogTableList = backlogTableRepository.findAllByLevelContentIdAndBacklogIteration(projectLevelContentTable, i); + List backlogTableList = backlogTableRepository.findAllByLevelContentIdAndBacklogIteration(projectLevelContentTable, i); if(backlogTableList.isEmpty()){ continue; } BurndownResponseDto burndownResponseDto = BurndownResponseDto.builder() .iteration(i) - .burndownListDto(backlogTableList.stream().map(backlogTable -> BurndownListDto.builder() - .backlogId(backlogTable.getBacklogId()) - .backlogTask(backlogTable.getBacklogTask()) - .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus())) - .backlogWorker(backlogTable.getBacklogWorker()) - .backlogTaskId(backlogTable.getBacklogTaskId()) - .backlogEstimate(backlogTable.getBacklogEstimate() != null ? backlogTable.getBacklogEstimate() : null) - .backlogEndDate(backlogTable.getBacklogEndDate() != null ? backlogTable.getBacklogEndDate() : null) - .backlogEndTime(backlogTable.getBacklogEndTime() != null ? backlogTable.getBacklogEndTime() : null) - .build()).toList()) + .burndownListDto(backlogTableList) .build(); burndownResponseDtoList.add(burndownResponseDto); } From 46d04bac64856c1c86f85f715266a2885c37724f Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 4 Feb 2025 15:47:07 +0900 Subject: [PATCH 11/44] bugfix --- .../prdoit/service/project/ProjectServiceImpl.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index b65ff51..313ff8c 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -102,13 +102,12 @@ public ProjectContentResponseDto getProjectContent(String projectId) { try { for (ProjectLevelContentTable projectLevelContentTable : projectLevelContentTableList) { log.info("[getProjectContent] 프로젝트 레벨 컨텐츠 조회 시작"); - if (projectLevelContentTable.getProjectLevel() < 7) { - projectContentResponseDto.getContentResponseDtoList().add(ContentResponseDto.builder() - .projectContent(projectLevelContentTable.getProjectLevelContent()) - .levelContentId(projectLevelContentTable.getLevelContentId()) - .projectLevel(projectLevelContentTable.getProjectLevel()) - .build()); - } + projectContentResponseDto.getContentResponseDtoList().add(ContentResponseDto.builder() + .projectContent(projectLevelContentTable.getProjectLevelContent()) + .levelContentId(projectLevelContentTable.getLevelContentId()) + .projectLevel(projectLevelContentTable.getProjectLevel()) + .build()); + if(projectLevelContentTable.getProjectLevel() == 7){ projectContentResponseDto.setBacklogResponseDtoList(new ArrayList<>()); List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); From 44c343aa2eeddb40c73c64add2d1f8f1352dc244 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 4 Feb 2025 17:52:38 +0900 Subject: [PATCH 12/44] refactor --- .../prdoit/controller/ProjectController.java | 15 +- .../dto/project/ProjectResponseDto.java | 6 +- .../dto/project/backlog/BacklogDeleteDto.java | 14 - .../project/backlog/BacklogRequestDto.java | 17 -- .../project/backlog/BacklogResponseDto.java | 8 +- .../dto/project/backlog/BacklogUpdateDto.java | 17 -- .../project/burndown/BurndownPatchDto.java | 1 + .../dto/project/content/ContentDeleteDto.java | 2 +- .../project/content/ContentResponseDto.java | 16 +- .../ProjectContentResponseDto.java | 3 +- .../repository/BacklogTableRepository.java | 9 +- .../ProjectLevelContentTableRepository.java | 9 +- .../repository/ProjectTableRepository.java | 17 +- .../service/project/ProjectService.java | 6 +- .../service/project/ProjectServiceImpl.java | 279 +++++++++++------- 15 files changed, 233 insertions(+), 186 deletions(-) delete mode 100644 src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java delete mode 100644 src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java delete mode 100644 src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java rename src/main/java/com/example/prdoit/dto/project/{ => content}/ProjectContentResponseDto.java (81%) diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 10564e6..3883536 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -8,9 +8,11 @@ import com.example.prdoit.dto.project.content.ContentDto; import com.example.prdoit.dto.project.content.ContentPatchDto; import com.example.prdoit.service.project.ProjectService; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Description; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @@ -28,7 +30,7 @@ public class ProjectController { private final ProjectService projectService; - @PostMapping("/management/store") + @PostMapping("/store") public ResponseEntity createProject(@RequestBody ProjectCreateDto projectCreateDto) { log.info("[createProject] 프로젝트 생성 요청"); try{ @@ -39,7 +41,7 @@ public ResponseEntity createProject(@RequestBody ProjectCreateDto projec } } - @GetMapping("/project/{projectId}") + @GetMapping("/{projectId}") public ResponseEntity getProject(@PathVariable String projectId) { log.info("[getProject] 프로젝트 조회 요청"); try{ @@ -67,7 +69,7 @@ public ResponseEntity getProjectList(@PathVariable String userId) { try{ return ResponseEntity.ok(projectService.getProjectList(userId)); } catch (RuntimeException e){ - log.error("[getProjectList] 프로젝트 리스트 조회 실패"); + log.error(e.getMessage()); return ResponseEntity.badRequest().body("프로젝트 리스트 조회에 실패했습니다."); } } @@ -83,12 +85,12 @@ public ResponseEntity createProjectContent(@RequestBody ContentDto conte return ResponseEntity.badRequest().body("프로젝트 컨텐츠 생성에 실패했습니다."); } } -/* + @PatchMapping("/content") public ResponseEntity updateProjectContent(@RequestBody ContentPatchDto contentDto) { log.info("[updateProjectContent] 프로젝트 컨텐츠 수정 요청"); try{ - projectService.updateProjectContent(contentDto); + projectService.patchProjectContent(contentDto); return ResponseEntity.ok("프로젝트 컨텐츠 수정에 성공했습니다."); } catch (RuntimeException e){ log.error("[updateProjectContent] {}", e.getMessage()); @@ -97,6 +99,8 @@ public ResponseEntity updateProjectContent(@RequestBody ContentPatchDto } @DeleteMapping("/content") + @Tag(name = "project", description = "프로젝트 삭제 API") + @Description("프로젝트 컨텐츠 삭제 API, backlog 삭제시 projectLevel=0으로") public ResponseEntity deleteProjectContent(@RequestBody ContentDeleteDto contentDeleteDto) { log.info("[deleteProjectContent] 프로젝트 컨텐츠 삭제 요청"); try{ @@ -108,6 +112,7 @@ public ResponseEntity deleteProjectContent(@RequestBody ContentDeleteDto } } +/* @PutMapping("/product") public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDto) { log.info("[putBacklog] 백로그 이동 요청"); diff --git a/src/main/java/com/example/prdoit/dto/project/ProjectResponseDto.java b/src/main/java/com/example/prdoit/dto/project/ProjectResponseDto.java index 7fc0f1e..a1dd5c9 100644 --- a/src/main/java/com/example/prdoit/dto/project/ProjectResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/ProjectResponseDto.java @@ -1,12 +1,12 @@ package com.example.prdoit.dto.project; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; @Getter @Builder +@Setter @AllArgsConstructor +@NoArgsConstructor public class ProjectResponseDto { private String projectId; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java deleted file mode 100644 index e2a63d5..0000000 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogDeleteDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.prdoit.dto.project.backlog; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -@AllArgsConstructor -public class BacklogDeleteDto { - - private String projectId; - private String backlogTaskId; -} diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java deleted file mode 100644 index 1b9478a..0000000 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogRequestDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.prdoit.dto.project.backlog; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -import java.util.List; - -@Getter -@Builder -@AllArgsConstructor -public class BacklogRequestDto { - - private String projectId; - private List backlogListDto; - -} diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java index 276e6cd..6fe3686 100644 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogResponseDto.java @@ -1,12 +1,12 @@ package com.example.prdoit.dto.project.backlog; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; @Getter @Builder +@Setter @AllArgsConstructor +@NoArgsConstructor public class BacklogResponseDto { private int backlogId; @@ -14,7 +14,7 @@ public class BacklogResponseDto { private int backlogPriority; private String backlogTask; private String backlogDescription; - private String backlogStatus; + private int backlogStatus; private String backlogWorker; private String backlogTaskId; private String backlogEstimate; diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java deleted file mode 100644 index 4c4b3db..0000000 --- a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogUpdateDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.prdoit.dto.project.backlog; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -import java.util.List; - -@Getter -@Builder -@AllArgsConstructor -public class BacklogUpdateDto { - - private String projectId; - private List backlogListDto; - -} diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java index 54bdfd3..cb45263 100644 --- a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java @@ -16,4 +16,5 @@ public class BurndownPatchDto { private LocalDateTime backlogEndDate; private String backlogEndTime; private int backlogStatus; + private String backlogWorker; } diff --git a/src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java b/src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java index 32b6f5f..3e39f07 100644 --- a/src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ContentDeleteDto.java @@ -11,5 +11,5 @@ public class ContentDeleteDto { private String projectId; private int projectLevel; - private List backlogTaskIdList; + private List backlogIdList; } diff --git a/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java b/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java index 36ffc0c..a4e2f65 100644 --- a/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ContentResponseDto.java @@ -1,15 +1,25 @@ package com.example.prdoit.dto.project.content; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Getter @Builder +@Setter +@AllArgsConstructor +@NoArgsConstructor public class ContentResponseDto { private int levelContentId; private String projectContent; private int projectLevel; + @Override + public String toString() { + return "ContentResponseDto{" + + "levelContentId=" + levelContentId + + ", projectContent='" + projectContent + '\'' + + ", projectLevel=" + projectLevel + + '}'; + } + } diff --git a/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java b/src/main/java/com/example/prdoit/dto/project/content/ProjectContentResponseDto.java similarity index 81% rename from src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java rename to src/main/java/com/example/prdoit/dto/project/content/ProjectContentResponseDto.java index 3c518fc..82829a7 100644 --- a/src/main/java/com/example/prdoit/dto/project/ProjectContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/project/content/ProjectContentResponseDto.java @@ -1,8 +1,7 @@ -package com.example.prdoit.dto.project; +package com.example.prdoit.dto.project.content; import com.example.prdoit.dto.project.backlog.BacklogResponseDto; import com.example.prdoit.dto.project.burndown.BurndownResponseDto; -import com.example.prdoit.dto.project.content.ContentResponseDto; import lombok.*; import java.util.List; diff --git a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java index f8b4a18..4bc8714 100644 --- a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java @@ -1,11 +1,13 @@ package com.example.prdoit.repository; +import com.example.prdoit.dto.project.backlog.BacklogResponseDto; import com.example.prdoit.dto.project.burndown.BurndownListDto; import com.example.prdoit.model.BacklogTable; import com.example.prdoit.model.ProjectLevelContentTable; import com.example.prdoit.model.ProjectTable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -14,10 +16,11 @@ @Repository public interface BacklogTableRepository extends JpaRepository { - @Query("SELECT new com.example.prdoit.dto.project.backlog.BacklogResponseDto(b.backlogId, b.backlogTask, " + - "b.backlogStatus, b.backlogWorker, b.backlogTaskId, b.backlogEstimate, b.backlogEndDate, b.backlogEndTime) FROM BacklogTable b " + + @Query("SELECT new com.example.prdoit.dto.project.backlog.BacklogResponseDto(b.backlogId, b.backlogUserStory, " + + "b.backlogPriority, b.backlogTask, b.backlogDescription, b.backlogStatus, " + + "b.backlogWorker, b.backlogTaskId, b.backlogEstimate) FROM BacklogTable b " + "WHERE b.levelContentId=:levelContentId") - List findAllByLevelContentId(ProjectLevelContentTable levelContentId); + List findAllByLevelContentId(@Param("levelContentId") ProjectLevelContentTable levelContentId); @Query("SELECT new com.example.prdoit.dto.project.burndown.BurndownListDto(b.backlogId, b.backlogTask, " + "b.backlogStatus, b.backlogWorker, b.backlogTaskId, b.backlogEstimate, b.backlogEndDate, b.backlogEndTime) FROM BacklogTable b " + diff --git a/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java index 8f78c83..a4b68cb 100644 --- a/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ProjectLevelContentTableRepository.java @@ -1,9 +1,13 @@ package com.example.prdoit.repository; +import com.example.prdoit.dto.project.content.ContentResponseDto; import com.example.prdoit.model.ProjectLevelContentTable; import com.example.prdoit.model.ProjectTable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import javax.swing.text.AbstractDocument; import java.util.List; import java.util.Optional; @@ -11,5 +15,8 @@ public interface ProjectLevelContentTableRepository extends JpaRepository findByProjectIdAndProjectLevel(ProjectTable projectId, int projectLevel); - List findAllByProjectId(ProjectTable projectTable); + @Query("SELECT new com.example.prdoit.dto.project.content.ContentResponseDto" + + "(c.levelContentId, c.projectLevelContent, c.projectLevel) " + + "FROM ProjectLevelContentTable c WHERE c.projectId=:projectId") + List findAllByProjectId(@Param("projectId")ProjectTable projectTable); } diff --git a/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java b/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java index fc8a4ef..f509d25 100644 --- a/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java @@ -1,5 +1,6 @@ package com.example.prdoit.repository; +import com.example.prdoit.dto.project.ProjectResponseDto; import com.example.prdoit.model.IdTable; import com.example.prdoit.model.ProjectTable; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,6 +11,18 @@ public interface ProjectTableRepository extends JpaRepository { - @Query("SELECT p FROM ProjectTable p WHERE p.id = :id") - List findAllByUserId(@Param("id") IdTable userId); + @Query("SELECT new com.example.prdoit.dto.project.ProjectResponseDto(" + + "p.projectId, p.projectName, p.projectIdea, p.projectLevel1, " + + "p.projectLevel2, p.projectLevel3, p.projectLevel4, p.projectLevel5, " + + "p.projectLevel6, p.projectLevel7, p.projectLevel8) " + + "FROM ProjectTable p WHERE p.id = :id") + List findAllByUserId(@Param("id") IdTable userId); + + @Query("SELECT new com.example.prdoit.dto.project.ProjectResponseDto(" + + "p.projectId, p.projectName, p.projectIdea, p.projectLevel1, " + + "p.projectLevel2, p.projectLevel3, p.projectLevel4, p.projectLevel5, " + + "p.projectLevel6, p.projectLevel7, p.projectLevel8) " + + "FROM ProjectTable p WHERE p.id = :id") + ProjectResponseDto findByProjectId(@Param("id") String projectId); + } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index 97baeb4..aa9f3c1 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -1,10 +1,10 @@ package com.example.prdoit.service.project; import com.example.prdoit.dto.project.*; -import com.example.prdoit.dto.project.backlog.*; import com.example.prdoit.dto.project.content.ContentDeleteDto; import com.example.prdoit.dto.project.content.ContentDto; import com.example.prdoit.dto.project.content.ContentPatchDto; +import com.example.prdoit.dto.project.content.ProjectContentResponseDto; import java.util.List; @@ -18,4 +18,8 @@ public interface ProjectService { List getProjectList(String userId); void createProjectContent(ContentDto contentDto); + + void patchProjectContent(ContentPatchDto contentPatchDto); + + void deleteProjectContent(ContentDeleteDto contentDeleteDto); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 76f2e29..049e319 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -1,13 +1,9 @@ package com.example.prdoit.service.project; -import com.example.prdoit.config.BacklogEnum; import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; import com.example.prdoit.dto.project.burndown.*; -import com.example.prdoit.dto.project.content.ContentPatchDto; -import com.example.prdoit.dto.project.content.ContentResponseDto; -import com.example.prdoit.dto.project.content.ContentDeleteDto; -import com.example.prdoit.dto.project.content.ContentDto; +import com.example.prdoit.dto.project.content.*; import com.example.prdoit.exception.CustomException; import com.example.prdoit.model.BacklogTable; import com.example.prdoit.model.IdTable; @@ -23,7 +19,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.UUID; import static java.lang.Integer.parseInt; @@ -78,57 +73,31 @@ public ProjectResponseDto getProject(String projectId) { log.info("[getProject] 프로젝트 조회 시작"); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - return ProjectResponseDto.builder() - .projectId(projectTable.getProjectId()) - .projectName(projectTable.getProjectName()) - .projectIdea(projectTable.getProjectIdea()) - .projectLevel1(projectTable.getProjectLevel1()) - .projectLevel2(projectTable.getProjectLevel2()) - .projectLevel3(projectTable.getProjectLevel3()) - .projectLevel4(projectTable.getProjectLevel4()) - .projectLevel5(projectTable.getProjectLevel5()) - .projectLevel6(projectTable.getProjectLevel6()) - .projectLevel7(projectTable.getProjectLevel7()) - .projectLevel8(projectTable.getProjectLevel8()) - .build(); + return projectTableRepository.findByProjectId(projectId); } @Override public ProjectContentResponseDto getProjectContent(String projectId) { log.info("[getProjectContent] 프로젝트 컨텐츠 조회 시작"); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - List projectLevelContentTableList = projectLevelContentTableRepository.findAllByProjectId(projectTable); - ProjectContentResponseDto projectContentResponseDto = new ProjectContentResponseDto(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + try { - for (ProjectLevelContentTable projectLevelContentTable : projectLevelContentTableList) { - log.info("[getProjectContent] 프로젝트 레벨 컨텐츠 조회 시작"); - if (projectLevelContentTable.getProjectLevel() < 7) { - projectContentResponseDto.getContentResponseDtoList().add(ContentResponseDto.builder() - .projectContent(projectLevelContentTable.getProjectLevelContent()) - .levelContentId(projectLevelContentTable.getLevelContentId()) - .projectLevel(projectLevelContentTable.getProjectLevel()) - .build()); - } - if(projectLevelContentTable.getProjectLevel() == 7){ - projectContentResponseDto.setBacklogResponseDtoList(new ArrayList<>()); - List backlogTableList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); - if (backlogTableList == null) { - continue; - } - for (BacklogTable backlogTable : backlogTableList) { - projectContentResponseDto.getBacklogResponseDtoList().add(BacklogResponseDto.builder() - .backlogId(backlogTable.getBacklogId()) - .backlogUserStory(backlogTable.getBacklogUserStory()) - .backlogPriority(backlogTable.getBacklogPriority()) - .backlogTask(backlogTable.getBacklogTask()) - .backlogDescription(backlogTable.getBacklogDescription()) - .backlogStatus(BacklogEnum.getBacklogEnum(backlogTable.getBacklogStatus())) - .backlogWorker(backlogTable.getBacklogWorker()) - .backlogTaskId(backlogTable.getBacklogTaskId()) - .backlogEstimate(backlogTable.getBacklogEstimate()) - .build()); - } - } else{ + List projectLevelContentTableList = projectLevelContentTableRepository.findAllByProjectId(projectTable); + ProjectContentResponseDto projectContentResponseDto = new ProjectContentResponseDto(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + for (ContentResponseDto contentResponseDto : projectLevelContentTableList) { + + projectContentResponseDto.getContentResponseDtoList().add(contentResponseDto); + + if(contentResponseDto.getProjectLevel() == 7){ + + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository + .findById(contentResponseDto.getLevelContentId()) + .orElseThrow(() -> new CustomException("존재하지 않는 컨텐츠입니다.")); + + List backlogResponseDtoList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); + projectContentResponseDto.setBacklogResponseDtoList(backlogResponseDtoList); + + } else if(contentResponseDto.getProjectLevel() == 8){ projectContentResponseDto.setBurndownResponseDtoList(getBurnDownChart(projectId)); } } @@ -145,41 +114,22 @@ public ProjectContentResponseDto getProjectContent(String projectId) { @Override public List getProjectList(String userId) { log.info("[getProjectList] 프로젝트 리스트 조회 시작"); - IdTable idTable = idTableRepository.findById(userId).orElseThrow(() -> new CustomException("존재하지 않는 사용자입니다.")); - List projectTableList = projectTableRepository.findAllByUserId(idTable); - - return projectTableList.stream().map(projectTable -> ProjectResponseDto.builder() - .projectId(projectTable.getProjectId()) - .projectName(projectTable.getProjectName()) - .projectIdea(projectTable.getProjectIdea()) - .projectLevel1(projectTable.getProjectLevel1()) - .projectLevel2(projectTable.getProjectLevel2()) - .projectLevel3(projectTable.getProjectLevel3()) - .projectLevel4(projectTable.getProjectLevel4()) - .projectLevel5(projectTable.getProjectLevel5()) - .projectLevel6(projectTable.getProjectLevel6()) - .projectLevel7(projectTable.getProjectLevel7()) - .projectLevel8(projectTable.getProjectLevel8()) - .build()).toList(); + IdTable idTable = idTableRepository.findById(userId).orElseThrow + (() -> new CustomException("존재하지 않는 사용자입니다.")); + return projectTableRepository.findAllByUserId(idTable); } @Override public void createProjectContent(ContentDto contentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + projectTableRepository.findById(contentDto.getProjectId()).orElseThrow + (() -> new CustomException("존재하지 않는 프로젝트입니다.")); try { - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7).orElseGet(() -> { - ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() - .projectLevelContent(contentDto.getProjectContent()) - .projectLevel(7) - .projectId(projectTable) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable1); - return projectLevelContentTable1; - }); + ProjectLevelContentTable projectLevelContentTable = + createContent(contentDto.getProjectId(), contentDto.getProjectLevel(), contentDto.getProjectContent()); if(contentDto.getBacklogListDto() != null){ - createBacklog(contentDto); + createBacklog(projectLevelContentTable, contentDto.getBacklogListDto()); } else if(contentDto.getBurndownPostListDto() != null){ createBurndown(contentDto); } @@ -192,24 +142,93 @@ public void createProjectContent(ContentDto contentDto) { } } - public void createBurndown(ContentDto contentDto){ - log.info("[createBurndown] 번다운 차트 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 8).orElseGet(() -> { + @Override + public void patchProjectContent(ContentPatchDto contentPatchDto){ + log.info("[patchProjectContent] 프로젝트 컨텐츠 수정 시작"); + ProjectTable projectTable = projectTableRepository.findById(contentPatchDto.getProjectId()).orElseThrow + (() -> new CustomException("존재하지 않는 프로젝트입니다.")); + try { + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository + .findByProjectIdAndProjectLevel(projectTable, contentPatchDto.getProjectLevel()) + .orElseThrow(() -> new CustomException("존재하지 않는 컨텐츠입니다.")); + + projectLevelContentTable.setProjectLevelContent(contentPatchDto.getProjectContent()); + projectLevelContentTableRepository.save(projectLevelContentTable); + if(contentPatchDto.getBacklogPatchDtoList() != null){ + patchBacklog(contentPatchDto.getBacklogPatchDtoList()); + } else if(contentPatchDto.getBurndownPatchDtoList() != null){ + patchBurndown(contentPatchDto.getBurndownPatchDtoList()); + } + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } + } + + @Override + public void deleteProjectContent(ContentDeleteDto contentDeleteDto){ + log.info("[deleteProjectContent] 프로젝트 컨텐츠 삭제 시작"); + ProjectTable projectTable = projectTableRepository.findById(contentDeleteDto.getProjectId()).orElseThrow + (() -> new CustomException("존재하지 않는 프로젝트입니다.")); + try { + if(contentDeleteDto.getProjectLevel() != 0) { + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository + .findByProjectIdAndProjectLevel(projectTable, contentDeleteDto.getProjectLevel()) + .orElseThrow(() -> new CustomException("존재하지 않는 컨텐츠입니다.")); + projectLevelContentTableRepository.delete(projectLevelContentTable); + } + if(contentDeleteDto.getBacklogIdList() != null){ + for (int backlogId : contentDeleteDto.getBacklogIdList()) { + BacklogTable backlogTable = backlogTableRepository.findById(backlogId) + .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTableRepository.delete(backlogTable); + } + } + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } + } + + + + // internal method + //ContentDto를 받아서 ProjectLevelContentTable을 생성 + public ProjectLevelContentTable createContent(String projectId, int projectLevel, String projectContent) { + log.info("[createContent] 프로젝트 컨텐츠 생성 시작"); + ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + return projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectLevel).orElseGet(() -> { ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() - .projectLevelContent(contentDto.getProjectContent()) - .projectLevel(8) + .projectLevelContent(projectContent) + .projectLevel(projectLevel) .projectId(projectTable) .build(); projectLevelContentTableRepository.save(projectLevelContentTable1); return projectLevelContentTable1; }); + } + + //ContentDto를 받아서 번다운 차트를 생성 + public void createBurndown(ContentDto contentDto){ + log.info("[createBurndown] 번다운 차트 생성 시작"); + + ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow + (() -> new CustomException("존재하지 않는 프로젝트입니다.")); + if(projectTable.getProjectLevel8() == 0){ throw new CustomException("번다운 차트를 생성할 수 없는 프로젝트입니다."); } + try{ for(BurndownPostListDto burndownPostListDto : contentDto.getBurndownPostListDto()){ - BacklogTable backlogTable = backlogTableRepository.findById(burndownPostListDto.getBacklogId()).orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + BacklogTable backlogTable = backlogTableRepository.findById(burndownPostListDto.getBacklogId()) + .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); backlogTable.setBacklogIteration(burndownPostListDto.getIteration()); backlogTableRepository.save(backlogTable); } @@ -222,37 +241,21 @@ public void createBurndown(ContentDto contentDto){ } } - public void createBacklog(ContentDto contentDto) { + //ContentDto를 받아서 백로그를 생성 + public void createBacklog(ProjectLevelContentTable projectLevelContentTable, List backlogListDto){ log.info("[createBacklog] 백로그 생성 시작"); - ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); - ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, 7).orElseGet(() -> { - ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() - .projectLevelContent(contentDto.getProjectContent()) - .projectLevel(7) - .projectId(projectTable) - .build(); - projectLevelContentTableRepository.save(projectLevelContentTable1); - return projectLevelContentTable1; - }); - - if(projectTable.getProjectLevel7() == 0){ - throw new CustomException("백로그를 생성할 수 없는 프로젝트입니다."); - } - try { - for (BacklogListDto backlogDto : contentDto.getBacklogListDto()) { - BacklogTable backlogTable = BacklogTable.builder() - .backlogUserStory(backlogDto.getBacklogUserStory()) - .backlogPriority(backlogDto.getBacklogPriority()) - .backlogTask(backlogDto.getBacklogTask()) - .backlogDescription(backlogDto.getBacklogDescription()) - .backlogWorker(backlogDto.getBacklogWorker()) - .backlogTaskId(backlogDto.getBacklogTaskId()) - .backlogEstimate(backlogDto.getBacklogEstimate()) - .levelContentId(projectLevelContentTable) - .build(); - backlogTableRepository.save(backlogTable); - } + List backlogTableList = backlogListDto.stream().map(backlogDto -> BacklogTable.builder() + .backlogUserStory(backlogDto.getBacklogUserStory()) + .backlogPriority(backlogDto.getBacklogPriority()) + .backlogTask(backlogDto.getBacklogTask()) + .backlogDescription(backlogDto.getBacklogDescription()) + .backlogWorker(backlogDto.getBacklogWorker()) + .backlogTaskId(backlogDto.getBacklogTaskId()) + .backlogEstimate(backlogDto.getBacklogEstimate()) + .levelContentId(projectLevelContentTable) + .build()).toList(); + backlogTableRepository.saveAll(backlogTableList); } catch (CustomException e) { log.error(e.getMessage()); throw new CustomException(e.getMessage()); @@ -262,6 +265,7 @@ public void createBacklog(ContentDto contentDto) { } } + //projectId를 받아서 번다운 차트를 조회 public List getBurnDownChart(String projectId) { log.info("[getBurnDownChart] 번다운 차트 조회 시작"); @@ -296,4 +300,53 @@ public List getBurnDownChart(String projectId) { throw e; } } + + //ContentDto를 받아서 백로그를 수정 + public void patchBacklog(List backlogPatchDtoList){ + log.info("[patchBacklog] 백로그 수정 시작"); + try { + for (BacklogPatchDto backlogPatchDto : backlogPatchDtoList) { + BacklogTable backlogTable = backlogTableRepository.findById(backlogPatchDto.getBacklogId()) + .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogUserStory(backlogPatchDto.getBacklogUserStory()); + backlogTable.setBacklogPriority(backlogPatchDto.getBacklogPriority()); + backlogTable.setBacklogTask(backlogPatchDto.getBacklogTask()); + backlogTable.setBacklogDescription(backlogPatchDto.getBacklogDescription()); + backlogTable.setBacklogWorker(backlogPatchDto.getBacklogWorker()); + backlogTable.setBacklogTaskId(backlogPatchDto.getBacklogTaskId()); + backlogTable.setBacklogEstimate(backlogPatchDto.getBacklogEstimate()); + backlogTableRepository.save(backlogTable); + } + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } + } + + //ContentDto를 받아서 번다운 차트를 수정 + public void patchBurndown(List burndownPatchDtoList){ + log.info("[patchBurndown] 번다운 차트 수정 시작"); + try { + for (BurndownPatchDto burndownPatchDto : burndownPatchDtoList) { + BacklogTable backlogTable = backlogTableRepository.findById(burndownPatchDto.getBacklogId()) + .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTable.setBacklogStatus(burndownPatchDto.getBacklogStatus()); + backlogTable.setBacklogWorker(burndownPatchDto.getBacklogWorker()); + backlogTable.setBacklogEndDate(burndownPatchDto.getBacklogEndDate()); + backlogTable.setBacklogEndTime(burndownPatchDto.getBacklogEndTime()); + backlogTableRepository.save(backlogTable); + } + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } + } + } From d5f5640f5d7710871432a9b1adf80c77e986d904 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 4 Feb 2025 17:59:36 +0900 Subject: [PATCH 13/44] refactor --- .../java/com/example/prdoit/controller/ProjectController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 3883536..2e79c90 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -26,6 +26,7 @@ @RequiredArgsConstructor @RequestMapping("/project") @Slf4j +@Tag(name = "Project", description = "프로젝트 API") public class ProjectController { private final ProjectService projectService; @@ -99,7 +100,6 @@ public ResponseEntity updateProjectContent(@RequestBody ContentPatchDto } @DeleteMapping("/content") - @Tag(name = "project", description = "프로젝트 삭제 API") @Description("프로젝트 컨텐츠 삭제 API, backlog 삭제시 projectLevel=0으로") public ResponseEntity deleteProjectContent(@RequestBody ContentDeleteDto contentDeleteDto) { log.info("[deleteProjectContent] 프로젝트 컨텐츠 삭제 요청"); From 6b18b5e7a72a8719c2da442918c8a4b87d74eddc Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 4 Feb 2025 18:05:54 +0900 Subject: [PATCH 14/44] refactor --- .../prdoit/repository/ProjectTableRepository.java | 2 +- .../prdoit/service/project/ProjectServiceImpl.java | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java b/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java index f509d25..99b8b3d 100644 --- a/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ProjectTableRepository.java @@ -22,7 +22,7 @@ public interface ProjectTableRepository extends JpaRepository new CustomException("존재하지 않는 프로젝트입니다.")); - - return projectTableRepository.findByProjectId(projectId); + try { + return projectTableRepository.findByProjectId(projectId); + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } } @Override From dfa29aeb06e37e08038896af35f99aa68ae6e106 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 5 Feb 2025 00:01:47 +0900 Subject: [PATCH 15/44] bugfix --- .../service/project/ProjectServiceImpl.java | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 1b2f8b3..d4d87d6 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -1,5 +1,6 @@ package com.example.prdoit.service.project; +import com.example.prdoit.config.BacklogEnum; import com.example.prdoit.dto.project.*; import com.example.prdoit.dto.project.backlog.*; import com.example.prdoit.dto.project.burndown.*; @@ -17,9 +18,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import static java.lang.Integer.parseInt; import static java.lang.Integer.valueOf; @@ -252,16 +253,33 @@ public void createBurndown(ContentDto contentDto){ public void createBacklog(ProjectLevelContentTable projectLevelContentTable, List backlogListDto){ log.info("[createBacklog] 백로그 생성 시작"); try { - List backlogTableList = backlogListDto.stream().map(backlogDto -> BacklogTable.builder() - .backlogUserStory(backlogDto.getBacklogUserStory()) - .backlogPriority(backlogDto.getBacklogPriority()) - .backlogTask(backlogDto.getBacklogTask()) - .backlogDescription(backlogDto.getBacklogDescription()) - .backlogWorker(backlogDto.getBacklogWorker()) - .backlogTaskId(backlogDto.getBacklogTaskId()) - .backlogEstimate(backlogDto.getBacklogEstimate()) + List backlogResponseDtoList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); + List localBacklogListDto = new ArrayList<>(); + + for (BacklogListDto backlogListDto1 : backlogListDto) { + boolean isExist = false; + for (BacklogResponseDto backlogResponseDto : backlogResponseDtoList) { + if (backlogResponseDto.getBacklogTaskId().equals(backlogListDto1.getBacklogTaskId())) { + isExist = true;break; + } + } + if(!isExist) { + localBacklogListDto.add(backlogListDto1); + } + } + + List backlogTableList = localBacklogListDto.stream().map(backlogListDto1 -> BacklogTable.builder() .levelContentId(projectLevelContentTable) - .build()).toList(); + .backlogUserStory(backlogListDto1.getBacklogUserStory()) + .backlogPriority(backlogListDto1.getBacklogPriority()) + .backlogTask(backlogListDto1.getBacklogTask()) + .backlogDescription(backlogListDto1.getBacklogDescription()) + .backlogStatus(BacklogEnum.BACKLOG_NOT_YET.getCode()) + .backlogWorker(backlogListDto1.getBacklogWorker()) + .backlogTaskId(backlogListDto1.getBacklogTaskId()) + .backlogEstimate(backlogListDto1.getBacklogEstimate()) + .build()).collect(Collectors.toList()); + backlogTableRepository.saveAll(backlogTableList); } catch (CustomException e) { log.error(e.getMessage()); From 8fbfe1a23ff7c2f9e8cd388764e34c9adfaec448 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 5 Feb 2025 00:27:21 +0900 Subject: [PATCH 16/44] bugfix --- .../service/project/ProjectServiceImpl.java | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index d4d87d6..33c7045 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -130,15 +130,17 @@ public List getProjectList(String userId) { @Override public void createProjectContent(ContentDto contentDto) { log.info("[createProjectContent] 프로젝트 컨텐츠 생성 시작"); - projectTableRepository.findById(contentDto.getProjectId()).orElseThrow + ProjectTable projectTable = projectTableRepository.findById(contentDto.getProjectId()).orElseThrow (() -> new CustomException("존재하지 않는 프로젝트입니다.")); try { ProjectLevelContentTable projectLevelContentTable = createContent(contentDto.getProjectId(), contentDto.getProjectLevel(), contentDto.getProjectContent()); if(contentDto.getBacklogListDto() != null){ + projectTable.setProjectLevel7(2); createBacklog(projectLevelContentTable, contentDto.getBacklogListDto()); } else if(contentDto.getBurndownPostListDto() != null){ + projectTable.setProjectLevel8(2); createBurndown(contentDto); } } catch (CustomException e) { @@ -211,6 +213,35 @@ public void deleteProjectContent(ContentDeleteDto contentDeleteDto){ public ProjectLevelContentTable createContent(String projectId, int projectLevel, String projectContent) { log.info("[createContent] 프로젝트 컨텐츠 생성 시작"); ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + switch (projectLevel) { + case 1: + projectTable.setProjectLevel1(2); + break; + case 2: + projectTable.setProjectLevel2(2); + break; + case 3: + projectTable.setProjectLevel3(2); + break; + case 4: + projectTable.setProjectLevel4(2); + break; + case 5: + projectTable.setProjectLevel5(2); + break; + case 6: + projectTable.setProjectLevel6(2); + break; + case 7: + projectTable.setProjectLevel7(2); + break; + case 8: + projectTable.setProjectLevel8(2); + break; + default: + throw new CustomException("존재하지 않는 프로젝트 레벨입니다."); + } + projectTableRepository.save(projectTable); return projectLevelContentTableRepository.findByProjectIdAndProjectLevel(projectTable, projectLevel).orElseGet(() -> { ProjectLevelContentTable projectLevelContentTable1 = ProjectLevelContentTable.builder() .projectLevelContent(projectContent) @@ -255,16 +286,21 @@ public void createBacklog(ProjectLevelContentTable projectLevelContentTable, Lis try { List backlogResponseDtoList = backlogTableRepository.findAllByLevelContentId(projectLevelContentTable); List localBacklogListDto = new ArrayList<>(); - - for (BacklogListDto backlogListDto1 : backlogListDto) { - boolean isExist = false; - for (BacklogResponseDto backlogResponseDto : backlogResponseDtoList) { - if (backlogResponseDto.getBacklogTaskId().equals(backlogListDto1.getBacklogTaskId())) { - isExist = true;break; + if(backlogResponseDtoList.isEmpty()){ + localBacklogListDto = backlogListDto; + } + else { + for (BacklogListDto backlogListDto1 : backlogListDto) { + boolean isExist = false; + for (BacklogResponseDto backlogResponseDto : backlogResponseDtoList) { + if (backlogResponseDto.getBacklogTaskId().equals(backlogListDto1.getBacklogTaskId())) { + isExist = true; + break; + } + } + if (!isExist) { + localBacklogListDto.add(backlogListDto1); } - } - if(!isExist) { - localBacklogListDto.add(backlogListDto1); } } From ff9cd2e4f44279e0c6bfd0d0b40c5284eabe1585 Mon Sep 17 00:00:00 2001 From: pureumq Date: Wed, 5 Feb 2025 14:58:43 +0900 Subject: [PATCH 17/44] feat --- .gitignore | 4 +++- .../prdoit/controller/UserController.java | 15 +++++++------ .../prdoit/service/user/UserService.java | 2 +- .../prdoit/service/user/UserServiceImpl.java | 21 +++++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index fa63701..011d3b1 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,6 @@ out/ .vscode/ ### Application Files ### -application.properties \ No newline at end of file +application.properties + +.DS_Store \ No newline at end of file diff --git a/src/main/java/com/example/prdoit/controller/UserController.java b/src/main/java/com/example/prdoit/controller/UserController.java index 660613d..a7f7240 100644 --- a/src/main/java/com/example/prdoit/controller/UserController.java +++ b/src/main/java/com/example/prdoit/controller/UserController.java @@ -75,18 +75,17 @@ public ResponseEntity checkNickname(@PathVariable String userNickname){ return ResponseEntity.badRequest().body(e.getMessage()); } } -/* + @PostMapping("/login") - public ResponseEntity login(@RequestBody LoginDto loginDto){ - log.info("[login] 로그인 로직 시작"); + public ResponseEntity login(@RequestBody LoginDto loginDto) { + log.info("[login] 로그인 시도 - ID: {}", loginDto.getUserId()); - try{ - userService.signIn(loginDto.getUserId(), loginDto.getPassword()); - return ResponseEntity.ok().body("로그인 성공"); + try { + userService.login(loginDto.getUserId(), loginDto.getPassword()); + return ResponseEntity.ok("로그인 성공"); } catch (CustomException e) { - log.error("[login] 로그인 실패"); + log.error("[login] 로그인 실패 - 이유: {}", e.getMessage()); return ResponseEntity.badRequest().body(e.getMessage()); } } - */ } diff --git a/src/main/java/com/example/prdoit/service/user/UserService.java b/src/main/java/com/example/prdoit/service/user/UserService.java index f57b1ab..b06ef3b 100644 --- a/src/main/java/com/example/prdoit/service/user/UserService.java +++ b/src/main/java/com/example/prdoit/service/user/UserService.java @@ -12,6 +12,6 @@ public interface UserService { void checkNickname(String nickname); - void signIn(String userId, String password); + void login(String userId, String password); } diff --git a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java index 7495f23..342cf61 100644 --- a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java @@ -98,4 +98,25 @@ public void signIn(String userId, String password){ } } + @Override + public void login(String userId, String password) { + log.info("[login] 로그인 시도 - ID: {}", userId); + + Optional findUser = idTableRepository.findById(userId); + + if (findUser.isEmpty()) { + log.info("[login] 아이디 없음"); + throw new CustomException("아이디 또는 비밀번호가 잘못되었습니다."); + } + + IdTable user = findUser.get(); + + // 비밀번호 맞나 안맞나 + if (!passwordEncoder.matches(password, user.getPassword())) { + log.info("[login] 비밀번호 불일치"); + throw new CustomException("아이디 또는 비밀번호가 잘못되었습니다."); + } + + log.info("[login] 로그인 성공 - ID: {}", userId); + } } From 5e6231fba6909b231cf2c789cf7b826f183f4810 Mon Sep 17 00:00:00 2001 From: pureumq Date: Wed, 5 Feb 2025 15:09:09 +0900 Subject: [PATCH 18/44] feat/login --- .../example/prdoit/service/user/UserServiceImpl.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java index 342cf61..325fb0b 100644 --- a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java @@ -86,18 +86,6 @@ public void checkNickname(String nickname) { } } - @Override - public void signIn(String userId, String password){ - log.info("[signIn] 로그인 로직 시작"); - - IdTable findUser = idTableRepository.findById(userId).orElseThrow(() -> new CustomException("존재하지 않는 아이디입니다.")); - - if(!passwordEncoder.matches(password, findUser.getPassword())){ - log.info("[signIn] 비밀번호 불일치"); - throw new CustomException("비밀번호가 일치하지 않습니다."); - } - } - @Override public void login(String userId, String password) { log.info("[login] 로그인 시도 - ID: {}", userId); From 04aab8fe4612fc739b7eee5e62293e12d9722bda Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 5 Feb 2025 18:56:04 +0900 Subject: [PATCH 19/44] feat:get backlog --- .../prdoit/controller/ProjectController.java | 11 +++++++++++ .../dto/project/backlog/BacklogAddDto.java | 17 +++++++++++++++++ .../repository/BacklogTableRepository.java | 7 +++++++ .../service/project/ProjectService.java | 3 +++ .../service/project/ProjectServiceImpl.java | 19 +++++++++++++++++++ 5 files changed, 57 insertions(+) create mode 100644 src/main/java/com/example/prdoit/dto/project/backlog/BacklogAddDto.java diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 2e79c90..a5e4bfe 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -112,6 +112,17 @@ public ResponseEntity deleteProjectContent(@RequestBody ContentDeleteDto } } + @GetMapping("/burndown/{projectId}/{taskId}") + public ResponseEntity getBurndownList(@PathVariable String projectId, @PathVariable String taskId) { + log.info("[getBurndownList] 번다운 리스트 조회 요청"); + try{ + return ResponseEntity.ok(projectService.getBacklog(projectId, taskId)); + } catch (RuntimeException e){ + log.error("[getBurndownList] {}", e.getMessage()); + return ResponseEntity.badRequest().body("번다운 리스트 조회에 실패했습니다."); + } + } + /* @PutMapping("/product") public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDto) { diff --git a/src/main/java/com/example/prdoit/dto/project/backlog/BacklogAddDto.java b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogAddDto.java new file mode 100644 index 0000000..f2707db --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/backlog/BacklogAddDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.project.backlog; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class BacklogAddDto { + + private int backlogId; + private String backlogTask; + private String backlogWorker; + private String backlogEstimate; + +} diff --git a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java index 4bc8714..8526896 100644 --- a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java @@ -1,5 +1,6 @@ package com.example.prdoit.repository; +import com.example.prdoit.dto.project.backlog.BacklogAddDto; import com.example.prdoit.dto.project.backlog.BacklogResponseDto; import com.example.prdoit.dto.project.burndown.BurndownListDto; import com.example.prdoit.model.BacklogTable; @@ -27,4 +28,10 @@ public interface BacklogTableRepository extends JpaRepository findAllByLevelContentIdAndBacklogIteration(ProjectLevelContentTable levelContentId, int iteration); + + @Query("SELECT new com.example.prdoit.dto.project.backlog.BacklogAddDto(b.backlogId, b.backlogTask, " + + "b.backlogWorker, b.backlogEstimate) FROM BacklogTable b " + + "WHERE b.levelContentId=:levelContentId AND b.backlogTaskId=:backlogTaskId") + Optional findByLevelContentIdAndBacklogTaskId(ProjectLevelContentTable levelContentId, String backlogTaskId); + } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index aa9f3c1..4d71133 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -1,6 +1,7 @@ package com.example.prdoit.service.project; import com.example.prdoit.dto.project.*; +import com.example.prdoit.dto.project.backlog.BacklogAddDto; import com.example.prdoit.dto.project.content.ContentDeleteDto; import com.example.prdoit.dto.project.content.ContentDto; import com.example.prdoit.dto.project.content.ContentPatchDto; @@ -22,4 +23,6 @@ public interface ProjectService { void patchProjectContent(ContentPatchDto contentPatchDto); void deleteProjectContent(ContentDeleteDto contentDeleteDto); + + BacklogAddDto getBacklog(String projectId, String backlogTaskId); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 33c7045..89d7ccf 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -206,7 +206,26 @@ public void deleteProjectContent(ContentDeleteDto contentDeleteDto){ } } + @Override + public BacklogAddDto getBacklog(String projectId, String backlogTaskId) { + log.info("[getBacklogList] 백로그 리스트 조회 시작"); + + try { + ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + ProjectLevelContentTable projectLevelContentTable = projectLevelContentTableRepository + .findByProjectIdAndProjectLevel(projectTable, 7).orElseThrow(() -> new CustomException("존재하지 않는 컨텐츠입니다.")); + return backlogTableRepository.findByLevelContentIdAndBacklogTaskId(projectLevelContentTable, backlogTaskId) + .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } + + } // internal method //ContentDto를 받아서 ProjectLevelContentTable을 생성 From cbcced5343f2cf3cd2f2562514df492515605de2 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 5 Feb 2025 21:53:44 +0900 Subject: [PATCH 20/44] fix:add iteration --- .../dto/project/burndown/BurndownDto.java | 20 +++++++++++++++++++ .../project/burndown/BurndownPatchDto.java | 7 ++----- .../service/project/ProjectServiceImpl.java | 17 ++++++++-------- 3 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/project/burndown/BurndownDto.java diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownDto.java new file mode 100644 index 0000000..98f78ed --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownDto.java @@ -0,0 +1,20 @@ +package com.example.prdoit.dto.project.burndown; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class BurndownDto { + + private int backlogId; + private LocalDateTime backlogEndDate; + private String backlogEndTime; + private int backlogStatus; + private String backlogWorker; + +} diff --git a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java index cb45263..2f6ef8b 100644 --- a/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java +++ b/src/main/java/com/example/prdoit/dto/project/burndown/BurndownPatchDto.java @@ -5,16 +5,13 @@ import lombok.Getter; import java.time.LocalDateTime; +import java.util.List; @Getter @Builder @AllArgsConstructor public class BurndownPatchDto { - private int backlogId; private int iteration; - private LocalDateTime backlogEndDate; - private String backlogEndTime; - private int backlogStatus; - private String backlogWorker; + private List burndownDtoList; } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 89d7ccf..684e2ed 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -411,14 +411,15 @@ public void patchBurndown(List burndownPatchDtoList){ log.info("[patchBurndown] 번다운 차트 수정 시작"); try { for (BurndownPatchDto burndownPatchDto : burndownPatchDtoList) { - BacklogTable backlogTable = backlogTableRepository.findById(burndownPatchDto.getBacklogId()) - .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); - backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); - backlogTable.setBacklogStatus(burndownPatchDto.getBacklogStatus()); - backlogTable.setBacklogWorker(burndownPatchDto.getBacklogWorker()); - backlogTable.setBacklogEndDate(burndownPatchDto.getBacklogEndDate()); - backlogTable.setBacklogEndTime(burndownPatchDto.getBacklogEndTime()); - backlogTableRepository.save(backlogTable); + for(BurndownDto burndownDto : burndownPatchDto.getBurndownDtoList()){ + BacklogTable backlogTable = backlogTableRepository.findById(burndownDto.getBacklogId()) + .orElseThrow(() -> new CustomException("존재하지 않는 백로그입니다.")); + backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTable.setBacklogEndDate(burndownDto.getBacklogEndDate()); + backlogTable.setBacklogEndTime(burndownDto.getBacklogEndTime()); + backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTableRepository.save(backlogTable); + } } } catch (CustomException e) { log.error(e.getMessage()); From 6562609a2c754415c84c1c1497a7c4202fa5c9c0 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 5 Feb 2025 22:02:32 +0900 Subject: [PATCH 21/44] fix:add iteration --- .../com/example/prdoit/service/project/ProjectServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 684e2ed..bcc28c0 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -418,6 +418,7 @@ public void patchBurndown(List burndownPatchDtoList){ backlogTable.setBacklogEndDate(burndownDto.getBacklogEndDate()); backlogTable.setBacklogEndTime(burndownDto.getBacklogEndTime()); backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTable.setBacklogStatus(burndownDto.getBacklogStatus()); backlogTableRepository.save(backlogTable); } } From 14b800c02430b2cf318814bc2fda2b8db0815921 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 5 Feb 2025 22:16:23 +0900 Subject: [PATCH 22/44] fix:add iteration --- .../com/example/prdoit/service/project/ProjectServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index bcc28c0..17c1ab7 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -418,6 +418,7 @@ public void patchBurndown(List burndownPatchDtoList){ backlogTable.setBacklogEndDate(burndownDto.getBacklogEndDate()); backlogTable.setBacklogEndTime(burndownDto.getBacklogEndTime()); backlogTable.setBacklogIteration(burndownPatchDto.getIteration()); + backlogTable.setBacklogWorker(burndownDto.getBacklogWorker()); backlogTable.setBacklogStatus(burndownDto.getBacklogStatus()); backlogTableRepository.save(backlogTable); } From 50451838e6896cbd50dca671e75a8a1a6adc9073 Mon Sep 17 00:00:00 2001 From: Koo Date: Thu, 6 Feb 2025 02:34:32 +0900 Subject: [PATCH 23/44] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SurveyTableRepository.java | 2 +- .../service/survey/SurveyServiceImpl.java | 65 ++++++++----------- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/example/prdoit/repository/SurveyTableRepository.java b/src/main/java/com/example/prdoit/repository/SurveyTableRepository.java index d8d9cbd..5233c48 100644 --- a/src/main/java/com/example/prdoit/repository/SurveyTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/SurveyTableRepository.java @@ -9,5 +9,5 @@ @Repository public interface SurveyTableRepository extends JpaRepository { - Optional findById(IdTable idTable); + SurveyTable findByIdId(String userId); } diff --git a/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java b/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java index bb35ee9..726edb1 100644 --- a/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java @@ -11,7 +11,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.Optional; @@ -28,12 +27,15 @@ public class SurveyServiceImpl implements SurveyService { public void saveSurvey(SurveyDto surveyDto) { log.info("[saveSurvey] 설문조사 저장 로직 시작"); + // DB 사용자 조회 IdTable idTable = idTableRepository.findById(surveyDto.getId()) .orElseThrow(() -> new CustomException("사용자를 찾을 수 없습니다.")); + // 기존 설문조사 존재 여부 확인 - Optional existingSurvey = surveyTableRepository.findById(idTable); - if(existingSurvey.isPresent()) { - log.error("[saveSurvey] 이미 설문조사가 존재함"); + SurveyTable existingSurvey = surveyTableRepository.findByIdId(surveyDto.getId()); + + if(existingSurvey!=null) { + log.info("[saveSurvey] 이미 설문조사가 존재함"); throw new CustomException("이미 설문조사가 존재합니다."); } @@ -58,18 +60,20 @@ public void saveSurvey(SurveyDto surveyDto) { public SurveyDto getSurvey(String id) { log.info("[getSurvey] 설문조사 조회 로직 시작"); - // IdTable 먼저 찾기 - IdTable idTable = idTableRepository.findById(id) - .orElseThrow(() -> new CustomException("사용자를 찾을 수 없습니다.")); - // SurveyTable 찾기 - SurveyTable survey = surveyTableRepository.findById(idTable) - .orElseThrow(() -> { - log.error("[getSurvey] 설문조사를 찾을 수 없음"); - return new CustomException("설문조사 정보를 찾을 수 없습니다."); - }); + SurveyTable survey = surveyTableRepository.findByIdId(id); + if(survey == null) { + log.error("[getSurvey] 설문조사를 찾을 수 없음"); + throw new CustomException("설문조사 정보를 찾을 수 없습니다."); + } - return convertToDto(survey); + return SurveyDto.builder() + .surveyNum1(survey.getSurveyNum1()) + .surveyNum2(survey.getSurveyNum2()) + .surveyNum3(survey.getSurveyNum3()) + .surveyNum4(survey.getSurveyNum4()) + .id(survey.getId().getId()) + .build(); } @@ -77,28 +81,21 @@ public SurveyDto getSurvey(String id) { public void updateSurvey(SurveyDto surveyDto) { log.info("[updateSurvey] 설문조사 수정 로직 시작"); - // DTO에서 ID를 가져와서 IdTable 객체 조회 - IdTable idTable = idTableRepository.findById(surveyDto.getId()) - .orElseThrow(() -> { - log.error("[updateSurvey] IdTable 조회 실패"); - return new CustomException("사용자를 찾을 수 없습니다."); - }); - - // IdTable을 사용하여 SurveyTable 조회 - SurveyTable survey = surveyTableRepository.findById(idTable) - .orElseThrow(() -> { - log.error("[updateSurvey] 수정할 설문조사를 찾을 수 없음"); - return new CustomException("수정할 설문조사를 찾을 수 없습니다."); - }); + SurveyTable survey = surveyTableRepository.findByIdId(surveyDto.getId()); + + if(survey == null) { + log.error("[getSurvey] 설문조사를 찾을 수 없음"); + throw new CustomException("설문조사 정보를 찾을 수 없습니다."); + } try { - // 직접 필드 값을 변경 (엔터티 내 메서드 없이) survey.setSurveyNum1(surveyDto.getSurveyNum1()); survey.setSurveyNum2(surveyDto.getSurveyNum2()); survey.setSurveyNum3(surveyDto.getSurveyNum3()); survey.setSurveyNum4(surveyDto.getSurveyNum4()); - // JPA의 변경 감지(Dirty Checking)로 자동 업데이트 + surveyTableRepository.save(survey); + log.info("[updateSurvey] 설문조사 수정 성공"); } catch (Exception e) { log.error("[updateSurvey] 데이터베이스 접근 오류", e); @@ -106,13 +103,5 @@ public void updateSurvey(SurveyDto surveyDto) { } } - private SurveyDto convertToDto(SurveyTable survey) { - return SurveyDto.builder() - .surveyNum1(survey.getSurveyNum1()) - .surveyNum2(survey.getSurveyNum2()) - .surveyNum3(survey.getSurveyNum3()) - .surveyNum4(survey.getSurveyNum4()) - .id(survey.getId().getId()) - .build(); - } + } \ No newline at end of file From 8c212dd59f733d5d2caaa1acd3586b461ea63e29 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Thu, 6 Feb 2025 02:49:48 +0900 Subject: [PATCH 24/44] check --- src/main/java/com/example/prdoit/controller/testController.java | 2 +- .../java/com/example/prdoit/service/content/ContentService.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/prdoit/controller/testController.java b/src/main/java/com/example/prdoit/controller/testController.java index 43e899e..f143299 100644 --- a/src/main/java/com/example/prdoit/controller/testController.java +++ b/src/main/java/com/example/prdoit/controller/testController.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; - +// @RestController @Slf4j diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 9e7e5dc..985f23e 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -1,4 +1,5 @@ package com.example.prdoit.service.content; public interface ContentService { + } From 3b5ebffcc63d4419ccede4bc36f8539fa750bf1d Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Thu, 6 Feb 2025 03:19:21 +0900 Subject: [PATCH 25/44] add database --- .../prdoit/model/CommentCommentTable.java | 24 +++++++++++++++ .../example/prdoit/model/CommentTable.java | 28 +++++++++++++++++ .../prdoit/model/ContentCommentTable.java | 25 ++++++++++++++++ .../prdoit/model/ContentReplyTable.java | 25 ++++++++++++++++ .../example/prdoit/model/ContentTable.java | 30 +++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 src/main/java/com/example/prdoit/model/CommentCommentTable.java create mode 100644 src/main/java/com/example/prdoit/model/CommentTable.java create mode 100644 src/main/java/com/example/prdoit/model/ContentCommentTable.java create mode 100644 src/main/java/com/example/prdoit/model/ContentReplyTable.java create mode 100644 src/main/java/com/example/prdoit/model/ContentTable.java diff --git a/src/main/java/com/example/prdoit/model/CommentCommentTable.java b/src/main/java/com/example/prdoit/model/CommentCommentTable.java new file mode 100644 index 0000000..a100e2e --- /dev/null +++ b/src/main/java/com/example/prdoit/model/CommentCommentTable.java @@ -0,0 +1,24 @@ +package com.example.prdoit.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentCommentTable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int commentCommentId; + + private String commentCommentContent; + + @ManyToOne + @JoinColumn(name = "commentId") + private CommentTable commentId; +} diff --git a/src/main/java/com/example/prdoit/model/CommentTable.java b/src/main/java/com/example/prdoit/model/CommentTable.java new file mode 100644 index 0000000..5864724 --- /dev/null +++ b/src/main/java/com/example/prdoit/model/CommentTable.java @@ -0,0 +1,28 @@ +package com.example.prdoit.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentTable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int commentId; + + private String commentContent; + + private String commentNickname; + + @ManyToOne + @JoinColumn(name = "userId") + private IdTable id; + +} diff --git a/src/main/java/com/example/prdoit/model/ContentCommentTable.java b/src/main/java/com/example/prdoit/model/ContentCommentTable.java new file mode 100644 index 0000000..e25cdcd --- /dev/null +++ b/src/main/java/com/example/prdoit/model/ContentCommentTable.java @@ -0,0 +1,25 @@ +package com.example.prdoit.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentCommentTable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int contentCommentId; + + private String contentCommentContent; + + @ManyToOne + @JoinColumn(name = "contentId") + private ContentTable contentId; +} diff --git a/src/main/java/com/example/prdoit/model/ContentReplyTable.java b/src/main/java/com/example/prdoit/model/ContentReplyTable.java new file mode 100644 index 0000000..4582a28 --- /dev/null +++ b/src/main/java/com/example/prdoit/model/ContentReplyTable.java @@ -0,0 +1,25 @@ +package com.example.prdoit.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentReplyTable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int contentReplyId; + + private String contentReplyContent; + + @ManyToOne + @JoinColumn(name = "contentCommentId") + private ContentCommentTable contentCommentId; +} diff --git a/src/main/java/com/example/prdoit/model/ContentTable.java b/src/main/java/com/example/prdoit/model/ContentTable.java new file mode 100644 index 0000000..3d365a5 --- /dev/null +++ b/src/main/java/com/example/prdoit/model/ContentTable.java @@ -0,0 +1,30 @@ +package com.example.prdoit.model; + +import jakarta.persistence.*; +import lombok.*; + +@Data +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentTable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int contentId; + + private String contentTitle; + + private String contentContent; + + private String contentLevel; + + private int contentView; + + private int contentLike; + + @ManyToOne + @JoinColumn(name = "userId") + private IdTable userId; +} From 1e06eb03772557142c8c9571af4dfa27bd7c6d51 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Thu, 6 Feb 2025 17:39:06 +0900 Subject: [PATCH 26/44] develop --- .../prdoit/dto/ContentResponseDto.java | 17 +++++++ .../repository/ContentTableRepository.java | 22 +++++++++ .../service/content/ContentService.java | 6 +++ .../service/content/ContentServiceImpl.java | 45 ++++++++++++++++++- 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/prdoit/dto/ContentResponseDto.java create mode 100644 src/main/java/com/example/prdoit/repository/ContentTableRepository.java diff --git a/src/main/java/com/example/prdoit/dto/ContentResponseDto.java b/src/main/java/com/example/prdoit/dto/ContentResponseDto.java new file mode 100644 index 0000000..eef4397 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/ContentResponseDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.content; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentResponseDto { + + private int contentId; + private String contentTitle; + private int contentView; + private int contentLike; + private String contentLevel; +} diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java new file mode 100644 index 0000000..f510fda --- /dev/null +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -0,0 +1,22 @@ +package com.example.prdoit.repository; + +import com.example.prdoit.dto.content.ContentResponseDto; +import com.example.prdoit.model.ContentTable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Optional; + +public interface ContentTableRepository extends JpaRepository { + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel) " + + "FROM ContentTable c WHERE c.contentTitle LIKE %:query% OR c.contentContent LIKE %:query%") + List findAllByQueryContaining(String query); + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel) " + + "FROM ContentTable c") + List findAllList(); +} diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 985f23e..55a47dd 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -1,5 +1,11 @@ package com.example.prdoit.service.content; +import com.example.prdoit.dto.content.ContentResponseDto; + +import java.util.List; + public interface ContentService { + List getContentQuery(String query); + } diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 91be366..1be6db9 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -1,4 +1,47 @@ package com.example.prdoit.service.content; -public class ContentServiceImpl { +import com.example.prdoit.dto.content.ContentResponseDto; +import com.example.prdoit.model.ContentTable; +import com.example.prdoit.repository.ContentTableRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@Slf4j +@RequiredArgsConstructor +public class ContentServiceImpl implements ContentService { + + private final ContentTableRepository contentRepository; + + @Override + public List getContentQuery(String query) { + log.info("[getContentQuery] 쿼리 조회 로직 시작"); + List contentTableList = contentRepository.findAll(); + if(contentTableList.isEmpty()) { + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } + try { + if(query.equals("ALL")) { + List contentResponseDtoList = contentRepository.findAllList(); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } else { + return contentResponseDtoList; + } + } else { + List contentResponseDtoList = contentRepository.findAllByQueryContaining(query); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("검색 결과가 없습니다."); + } else { + return contentResponseDtoList; + } + } + } catch (Exception e) { + log.error("[getContentQuery] 쿼리 조회 실패"); + throw new RuntimeException("쿼리 조회에 실패했습니다."); + } + } } From 03c222e623dfe4d81a18649f8096db40ded28420 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Thu, 6 Feb 2025 17:46:58 +0900 Subject: [PATCH 27/44] docker test --- .../java/com/example/prdoit/service/content/ContentService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 55a47dd..07596a4 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -3,7 +3,7 @@ import com.example.prdoit.dto.content.ContentResponseDto; import java.util.List; - +// public interface ContentService { List getContentQuery(String query); From e1a351a92fa04f3b11357072e1b4acbcccef80cc Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Thu, 6 Feb 2025 18:10:59 +0900 Subject: [PATCH 28/44] docker test --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a6aafe8..4c56141 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -47,7 +47,7 @@ jobs: run: docker login -u ${{secrets.DOCKER_USERNAME}} -p ${{secrets.DOCKER_PASSWORD}} - name: Make docker image - run: docker build -f DockerFile -t ${{secrets.DOCKER_USERNAME}}/prdoit:latest . + run: docker build --no-cache -f DockerFile -t ${{secrets.DOCKER_USERNAME}}/prdoit:latest . - name: Push docker image run: docker push ${{secrets.DOCKER_USERNAME}}/prdoit:latest From da9366f603395d40282fa5cbe55e065676855ea1 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Thu, 6 Feb 2025 19:57:46 +0900 Subject: [PATCH 29/44] docker test --- src/main/java/com/example/prdoit/controller/testController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/prdoit/controller/testController.java b/src/main/java/com/example/prdoit/controller/testController.java index f143299..3433da2 100644 --- a/src/main/java/com/example/prdoit/controller/testController.java +++ b/src/main/java/com/example/prdoit/controller/testController.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -// +//// @RestController @Slf4j From a4072fa5fe5970d5c017bdda52df698408048452 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Sun, 9 Feb 2025 18:00:55 +0900 Subject: [PATCH 30/44] feat: CRUD content & get content detail --- .../prdoit/controller/ContentController.java | 81 ++++++++++++++ .../prdoit/dto/content/ContentDetailDto.java | 21 ++++ .../prdoit/dto/content/ContentRequestDto.java | 18 +++ .../dto/{ => content}/ContentResponseDto.java | 5 +- .../prdoit/dto/content/ContentUpdateDto.java | 18 +++ .../prdoit/model/CommentCommentTable.java | 2 + .../example/prdoit/model/CommentTable.java | 11 +- .../example/prdoit/model/CommunityTable.java | 3 +- .../prdoit/model/ContentCommentTable.java | 25 ----- .../prdoit/model/ContentReplyTable.java | 25 ----- .../example/prdoit/model/ContentTable.java | 7 +- .../example/prdoit/model/GuideLineTable.java | 31 ------ .../com/example/prdoit/model/IdTable.java | 4 - .../com/example/prdoit/model/ReportTable.java | 29 ----- .../repository/ContentTableRepository.java | 39 +++++-- .../repository/GuideLineTableRepository.java | 7 -- .../service/content/ContentService.java | 13 ++- .../service/content/ContentServiceImpl.java | 103 +++++++++++++++++- .../service/survey/SurveyServiceImpl.java | 4 +- 19 files changed, 300 insertions(+), 146 deletions(-) create mode 100644 src/main/java/com/example/prdoit/controller/ContentController.java create mode 100644 src/main/java/com/example/prdoit/dto/content/ContentDetailDto.java create mode 100644 src/main/java/com/example/prdoit/dto/content/ContentRequestDto.java rename src/main/java/com/example/prdoit/dto/{ => content}/ContentResponseDto.java (74%) create mode 100644 src/main/java/com/example/prdoit/dto/content/ContentUpdateDto.java delete mode 100644 src/main/java/com/example/prdoit/model/ContentCommentTable.java delete mode 100644 src/main/java/com/example/prdoit/model/ContentReplyTable.java delete mode 100644 src/main/java/com/example/prdoit/model/GuideLineTable.java delete mode 100644 src/main/java/com/example/prdoit/model/ReportTable.java delete mode 100644 src/main/java/com/example/prdoit/repository/GuideLineTableRepository.java diff --git a/src/main/java/com/example/prdoit/controller/ContentController.java b/src/main/java/com/example/prdoit/controller/ContentController.java new file mode 100644 index 0000000..3b57f5f --- /dev/null +++ b/src/main/java/com/example/prdoit/controller/ContentController.java @@ -0,0 +1,81 @@ +package com.example.prdoit.controller; + +import com.example.prdoit.dto.content.ContentRequestDto; +import com.example.prdoit.dto.content.ContentUpdateDto; +import com.example.prdoit.exception.CustomException; +import com.example.prdoit.service.content.ContentService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@Slf4j +@CrossOrigin(origins = "*", allowedHeaders = "*") +@RequestMapping("/content") +@RequiredArgsConstructor +public class ContentController { + + private final ContentService contentService; + + @GetMapping() + public ResponseEntity getAllContent(@RequestParam(value = "query", required = false, defaultValue = "all") String query, + @RequestParam(value = "level", required = false, defaultValue = "-1") int level, + @RequestParam(value = "size", required = false, defaultValue = "5") int size, + @RequestParam(value = "page", required = false, defaultValue = "1") int page) { + try{ + if(level == -1){ + return ResponseEntity.ok(contentService.getContentQuery(query, size, page)); + } else { + return ResponseEntity.ok(contentService.getContentQueryWithLevel(query, level, size, page)); + } + } catch (CustomException e) { + log.error("[getAllContent] 컨텐츠 조회 실패", e); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (Exception e) { + log.error("[getAllContent] 컨텐츠 조회 실패", e); + return ResponseEntity.internalServerError().body("컨텐츠 조회에 실패했습니다."); + } + } + + @PostMapping() + public ResponseEntity postContent(@RequestBody ContentRequestDto contentRequestDto) { + try { + contentService.postContent(contentRequestDto); + return ResponseEntity.ok("컨텐츠 등록에 성공했습니다."); + } catch (CustomException e) { + log.error("[postContent] 컨텐츠 등록 실패", e); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (Exception e) { + log.error("[postContent] 컨텐츠 등록 실패", e); + return ResponseEntity.internalServerError().body("컨텐츠 등록에 실패했습니다."); + } + } + + @PatchMapping() + public ResponseEntity updateContent(@RequestBody ContentUpdateDto contentUpdateDto) { + try { + contentService.updateContent(contentUpdateDto); + return ResponseEntity.ok("컨텐츠 수정에 성공했습니다."); + } catch (CustomException e) { + log.error("[updateContent] 컨텐츠 수정 실패", e); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (Exception e) { + log.error("[updateContent] 컨텐츠 수정 실패", e); + return ResponseEntity.internalServerError().body("컨텐츠 수정에 실패했습니다."); + } + } + + @GetMapping("/{contentId}") + public ResponseEntity getContentDetail(@PathVariable String contentId) { + try { + return ResponseEntity.ok(contentService.getContentDetail(contentId)); + } catch (CustomException e) { + log.error("[getContentDetail] 컨텐츠 상세 조회 실패", e); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (Exception e) { + log.error("[getContentDetail] 컨텐츠 상세 조회 실패", e); + return ResponseEntity.internalServerError().body("컨텐츠 상세 조회에 실패했습니다."); + } + } +} diff --git a/src/main/java/com/example/prdoit/dto/content/ContentDetailDto.java b/src/main/java/com/example/prdoit/dto/content/ContentDetailDto.java new file mode 100644 index 0000000..04e6ecf --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/content/ContentDetailDto.java @@ -0,0 +1,21 @@ +package com.example.prdoit.dto.content; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentDetailDto { + + private String contentId; + private String contentTitle; + private String contentContent; + private int contentView; + private int contentLike; + private int contentLevel; + private int isVideo; + private String writer; + +} diff --git a/src/main/java/com/example/prdoit/dto/content/ContentRequestDto.java b/src/main/java/com/example/prdoit/dto/content/ContentRequestDto.java new file mode 100644 index 0000000..eb8ae0c --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/content/ContentRequestDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.content; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentRequestDto { + + private String contentTitle; + private String contentContent; + private int contentLevel; + private int isVideo; + private String userId; + +} diff --git a/src/main/java/com/example/prdoit/dto/ContentResponseDto.java b/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java similarity index 74% rename from src/main/java/com/example/prdoit/dto/ContentResponseDto.java rename to src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java index eef4397..7c41a15 100644 --- a/src/main/java/com/example/prdoit/dto/ContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java @@ -9,9 +9,10 @@ @Builder public class ContentResponseDto { - private int contentId; + private String contentId; private String contentTitle; private int contentView; private int contentLike; - private String contentLevel; + private int contentLevel; + private String writer; } diff --git a/src/main/java/com/example/prdoit/dto/content/ContentUpdateDto.java b/src/main/java/com/example/prdoit/dto/content/ContentUpdateDto.java new file mode 100644 index 0000000..846c378 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/content/ContentUpdateDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.content; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentUpdateDto { + + private String contentId; + private String contentTitle; + private String contentContent; + private int contentLevel; + private int isVideo; + +} diff --git a/src/main/java/com/example/prdoit/model/CommentCommentTable.java b/src/main/java/com/example/prdoit/model/CommentCommentTable.java index a100e2e..523f01e 100644 --- a/src/main/java/com/example/prdoit/model/CommentCommentTable.java +++ b/src/main/java/com/example/prdoit/model/CommentCommentTable.java @@ -18,6 +18,8 @@ public class CommentCommentTable { private String commentCommentContent; + private String userNickname; + @ManyToOne @JoinColumn(name = "commentId") private CommentTable commentId; diff --git a/src/main/java/com/example/prdoit/model/CommentTable.java b/src/main/java/com/example/prdoit/model/CommentTable.java index 5864724..3846a21 100644 --- a/src/main/java/com/example/prdoit/model/CommentTable.java +++ b/src/main/java/com/example/prdoit/model/CommentTable.java @@ -1,5 +1,6 @@ package com.example.prdoit.model; +import jakarta.annotation.Nullable; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -21,8 +22,14 @@ public class CommentTable { private String commentNickname; + private String userNickname; + + @ManyToOne + @JoinColumn(name = "contentId", nullable = true) + private ContentTable contentId; + @ManyToOne - @JoinColumn(name = "userId") - private IdTable id; + @JoinColumn(name = "communityId", nullable = true) + private CommunityTable communityId; } diff --git a/src/main/java/com/example/prdoit/model/CommunityTable.java b/src/main/java/com/example/prdoit/model/CommunityTable.java index 23493cd..0832e95 100644 --- a/src/main/java/com/example/prdoit/model/CommunityTable.java +++ b/src/main/java/com/example/prdoit/model/CommunityTable.java @@ -16,8 +16,7 @@ public class CommunityTable { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int communityId; + private String communityId; private String communityContent; diff --git a/src/main/java/com/example/prdoit/model/ContentCommentTable.java b/src/main/java/com/example/prdoit/model/ContentCommentTable.java deleted file mode 100644 index e25cdcd..0000000 --- a/src/main/java/com/example/prdoit/model/ContentCommentTable.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.example.prdoit.model; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Entity -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ContentCommentTable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int contentCommentId; - - private String contentCommentContent; - - @ManyToOne - @JoinColumn(name = "contentId") - private ContentTable contentId; -} diff --git a/src/main/java/com/example/prdoit/model/ContentReplyTable.java b/src/main/java/com/example/prdoit/model/ContentReplyTable.java deleted file mode 100644 index 4582a28..0000000 --- a/src/main/java/com/example/prdoit/model/ContentReplyTable.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.example.prdoit.model; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Entity -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ContentReplyTable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int contentReplyId; - - private String contentReplyContent; - - @ManyToOne - @JoinColumn(name = "contentCommentId") - private ContentCommentTable contentCommentId; -} diff --git a/src/main/java/com/example/prdoit/model/ContentTable.java b/src/main/java/com/example/prdoit/model/ContentTable.java index 3d365a5..e4cb944 100644 --- a/src/main/java/com/example/prdoit/model/ContentTable.java +++ b/src/main/java/com/example/prdoit/model/ContentTable.java @@ -11,17 +11,18 @@ public class ContentTable { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int contentId; + private String contentId; private String contentTitle; private String contentContent; - private String contentLevel; + private int contentLevel; private int contentView; + private int isVideo; + private int contentLike; @ManyToOne diff --git a/src/main/java/com/example/prdoit/model/GuideLineTable.java b/src/main/java/com/example/prdoit/model/GuideLineTable.java deleted file mode 100644 index 9f95485..0000000 --- a/src/main/java/com/example/prdoit/model/GuideLineTable.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.prdoit.model; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Entity -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class GuideLineTable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int guideLineId; - - private String guideLinePainPoint; - private String guideLineTarget; - private String guideLineUseCase; - private String guideLineUserStory; - private String guideLineFunction; - private String guideLineTask; - private String guideLineProductBacklog; - private String guideLineBurnDownChart; -} diff --git a/src/main/java/com/example/prdoit/model/IdTable.java b/src/main/java/com/example/prdoit/model/IdTable.java index df48ef1..d3ab371 100644 --- a/src/main/java/com/example/prdoit/model/IdTable.java +++ b/src/main/java/com/example/prdoit/model/IdTable.java @@ -39,10 +39,6 @@ public class IdTable { @JsonIgnore private List readTable; - @OneToMany(mappedBy = "id", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) - @JsonIgnore - private List reportTable; - @OneToMany(mappedBy = "id", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) @JsonIgnore private List communityTable; diff --git a/src/main/java/com/example/prdoit/model/ReportTable.java b/src/main/java/com/example/prdoit/model/ReportTable.java deleted file mode 100644 index 5c02a0c..0000000 --- a/src/main/java/com/example/prdoit/model/ReportTable.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.prdoit.model; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Entity -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ReportTable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int reportId; - - private String reportReason; - - private int reportNumber; - - private String reportType; - - @ManyToOne - @JoinColumn(name = "id") - private IdTable id; -} diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index f510fda..4539c98 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -4,19 +4,42 @@ import com.example.prdoit.model.ContentTable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; -import java.util.Optional; -public interface ContentTableRepository extends JpaRepository { +public interface ContentTableRepository extends JpaRepository { + + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + + "WHERE c.contentTitle LIKE %:query% GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + + "LIMIT :size OFFSET :offset") + List findAllByQueryContaining(@Param("query") String query, @Param("size") int size, @Param("offset") int offset); + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + + "LIMIT :size OFFSET :offset") + List findAllList(@Param("size") int size, @Param("offset") int offset); @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + - "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel) " + - "FROM ContentTable c WHERE c.contentTitle LIKE %:query% OR c.contentContent LIKE %:query%") - List findAllByQueryContaining(String query); + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c LEFT JOIN CommentTable cc on c.contentId = cc.contentId.contentId WHERE c.contentTitle LIKE %:query% AND c.contentLevel = :level " + + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + + "LIMIT :size OFFSET :offset") + List findAllQueryContainingAndContentLevel(@Param("query")String query, @Param("level")int level, @Param("size") int size, @Param("offset") int offset); @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + - "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel) " + - "FROM ContentTable c") - List findAllList(); + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId WHERE c.contentLevel = :level " + + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + + "LIMIT :size OFFSET :offset") + List findAllByContentLevel(@Param("level") int level, @Param("size") int size, @Param("offset") int offset); } diff --git a/src/main/java/com/example/prdoit/repository/GuideLineTableRepository.java b/src/main/java/com/example/prdoit/repository/GuideLineTableRepository.java deleted file mode 100644 index 92699fa..0000000 --- a/src/main/java/com/example/prdoit/repository/GuideLineTableRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.prdoit.repository; - -import com.example.prdoit.model.GuideLineTable; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface GuideLineTableRepository extends JpaRepository { -} diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 07596a4..08c194a 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -1,11 +1,22 @@ package com.example.prdoit.service.content; +import com.example.prdoit.dto.content.ContentDetailDto; +import com.example.prdoit.dto.content.ContentRequestDto; import com.example.prdoit.dto.content.ContentResponseDto; +import com.example.prdoit.dto.content.ContentUpdateDto; import java.util.List; // public interface ContentService { - List getContentQuery(String query); + List getContentQuery(String query, int size, int page); + + List getContentQueryWithLevel(String query, int level, int size, int page); + + void updateContent(ContentUpdateDto contentUpdateDto); + + void postContent(ContentRequestDto contentRequestDto); + + ContentDetailDto getContentDetail(String contentId); } diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 1be6db9..c5fbcfb 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -1,13 +1,19 @@ package com.example.prdoit.service.content; +import com.example.prdoit.dto.content.ContentDetailDto; +import com.example.prdoit.dto.content.ContentRequestDto; import com.example.prdoit.dto.content.ContentResponseDto; +import com.example.prdoit.dto.content.ContentUpdateDto; import com.example.prdoit.model.ContentTable; +import com.example.prdoit.model.IdTable; import com.example.prdoit.repository.ContentTableRepository; +import com.example.prdoit.repository.IdTableRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; +import java.util.UUID; @Service @Slf4j @@ -15,24 +21,26 @@ public class ContentServiceImpl implements ContentService { private final ContentTableRepository contentRepository; + private final IdTableRepository IdTableRepository; @Override - public List getContentQuery(String query) { + public List getContentQuery(String query, int size, int page){ log.info("[getContentQuery] 쿼리 조회 로직 시작"); List contentTableList = contentRepository.findAll(); + int offset = (page - 1) * size; if(contentTableList.isEmpty()) { throw new RuntimeException("등록된 컨텐츠가 없습니다."); } try { - if(query.equals("ALL")) { - List contentResponseDtoList = contentRepository.findAllList(); + if(query.equals("all")) { + List contentResponseDtoList = contentRepository.findAllList(size, offset); if(contentResponseDtoList.isEmpty()){ throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { return contentResponseDtoList; } } else { - List contentResponseDtoList = contentRepository.findAllByQueryContaining(query); + List contentResponseDtoList = contentRepository.findAllByQueryContaining(query, size, offset); if(contentResponseDtoList.isEmpty()){ throw new RuntimeException("검색 결과가 없습니다."); } else { @@ -44,4 +52,91 @@ public List getContentQuery(String query) { throw new RuntimeException("쿼리 조회에 실패했습니다."); } } + + @Override + public List getContentQueryWithLevel(String query, int level, int size, int page){ + List contentTableList = contentRepository.findAll(); + if(contentTableList.isEmpty()) { + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } + int offset = (page - 1) * size; + try{ + if(query.equals("all")) { + List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } else { + return contentResponseDtoList; + } + } else { + List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("검색 결과가 없습니다."); + } else { + return contentResponseDtoList; + } + } + } catch (Exception e) { + log.error("[getContentQueryWithLevel] 쿼리 조회 실패"); + throw new RuntimeException("쿼리 조회에 실패했습니다."); + } + } + + @Override + public void postContent(ContentRequestDto contentRequestDto){ + + IdTable idTable = IdTableRepository.findById(contentRequestDto.getUserId()).orElseThrow(() -> new RuntimeException("존재하지 않는 사용자입니다.")); + log.info("[postContent] 컨텐츠 등록 로직 시작"); + try { + ContentTable contentTable = ContentTable.builder() + .contentId(UUID.randomUUID().toString()) + .contentTitle(contentRequestDto.getContentTitle()) + .contentContent(contentRequestDto.getContentContent()) + .contentLevel(contentRequestDto.getContentLevel()) + .isVideo(contentRequestDto.getIsVideo()) + .userId(idTable) + .build(); + contentRepository.save(contentTable); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e.getMessage()); + } + } + + @Override + public void updateContent(ContentUpdateDto contentUpdateDto){ + log.info("[updateContent] 컨텐츠 수정 로직 시작"); + try { + ContentTable contentTable = contentRepository.findById(contentUpdateDto.getContentId()).orElseThrow(() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); + contentTable.setContentTitle(contentUpdateDto.getContentTitle()); + contentTable.setContentContent(contentUpdateDto.getContentContent()); + contentTable.setContentLevel(contentUpdateDto.getContentLevel()); + contentTable.setIsVideo(contentUpdateDto.getIsVideo()); + contentRepository.save(contentTable); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e.getMessage()); + } + } + + @Override + public ContentDetailDto getContentDetail(String contentId){ + log.info("[getContentDetail] 컨텐츠 상세 조회 로직 시작"); + try { + ContentTable contentTable = contentRepository.findById(contentId).orElseThrow(() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); + return ContentDetailDto.builder() + .contentId(contentTable.getContentId()) + .contentTitle(contentTable.getContentTitle()) + .contentContent(contentTable.getContentContent()) + .contentLevel(contentTable.getContentLevel()) + .contentView(contentTable.getContentView()) + .isVideo(contentTable.getIsVideo()) + .contentLike(contentTable.getContentLike()) + .writer(contentTable.getUserId().getNickname()) + .build(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e.getMessage()); + } + } } diff --git a/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java b/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java index 68b02ef..a5f6d3b 100644 --- a/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/survey/SurveyServiceImpl.java @@ -61,7 +61,7 @@ public SurveyDto getSurvey(String id) { log.info("[getSurvey] 설문조사 조회 로직 시작"); // SurveyTable 찾기 - SurveyTable survey = surveyTableRepository.findByIdId(id); + SurveyTable survey = surveyTableRepository.findByIdId(id); if(survey == null) { log.error("[getSurvey] 설문조사를 찾을 수 없음"); throw new CustomException("설문조사 정보를 찾을 수 없습니다."); @@ -101,6 +101,4 @@ public void updateSurvey(SurveyDto surveyDto) { throw new CustomException("데이터베이스 접근 중 오류가 발생했습니다."); } } - - } \ No newline at end of file From 1a07743e93303d5baaa33ef593bc8d4f8e10292c Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Sun, 9 Feb 2025 22:10:09 +0900 Subject: [PATCH 31/44] fix bug --- .../com/example/prdoit/config/WebConfig.java | 18 ++++++++++++++++++ .../repository/ContentTableRepository.java | 2 +- .../service/content/ContentServiceImpl.java | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/prdoit/config/WebConfig.java diff --git a/src/main/java/com/example/prdoit/config/WebConfig.java b/src/main/java/com/example/prdoit/config/WebConfig.java new file mode 100644 index 0000000..bb808e3 --- /dev/null +++ b/src/main/java/com/example/prdoit/config/WebConfig.java @@ -0,0 +1,18 @@ +package com.example.prdoit.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.nio.file.Watchable; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://prdoit-s3-bucket.s3-website.ap-northeast-2.amazonaws.com") + .allowedMethods("GET", "POST", "PUT", "DELETE"); + } +} diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index 4539c98..11d59af 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -22,7 +22,7 @@ public interface ContentTableRepository extends JpaRepository findAllList(@Param("size") int size, @Param("offset") int offset); diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index c5fbcfb..d533304 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -124,6 +124,8 @@ public ContentDetailDto getContentDetail(String contentId){ log.info("[getContentDetail] 컨텐츠 상세 조회 로직 시작"); try { ContentTable contentTable = contentRepository.findById(contentId).orElseThrow(() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); + contentTable.setContentView(contentTable.getContentView() + 1); + contentRepository.save(contentTable); return ContentDetailDto.builder() .contentId(contentTable.getContentId()) .contentTitle(contentTable.getContentTitle()) From ee6281e18d127a291a5239b9f870c27885fb1507 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Sun, 9 Feb 2025 22:25:08 +0900 Subject: [PATCH 32/44] fix bug --- .../java/com/example/prdoit/model/CommentCommentTable.java | 4 ++++ src/main/java/com/example/prdoit/model/CommentTable.java | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/prdoit/model/CommentCommentTable.java b/src/main/java/com/example/prdoit/model/CommentCommentTable.java index 523f01e..ffea9ba 100644 --- a/src/main/java/com/example/prdoit/model/CommentCommentTable.java +++ b/src/main/java/com/example/prdoit/model/CommentCommentTable.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity @Data @AllArgsConstructor @@ -20,6 +22,8 @@ public class CommentCommentTable { private String userNickname; + private LocalDateTime commentCommentDate; + @ManyToOne @JoinColumn(name = "commentId") private CommentTable commentId; diff --git a/src/main/java/com/example/prdoit/model/CommentTable.java b/src/main/java/com/example/prdoit/model/CommentTable.java index 3846a21..ca0f6d0 100644 --- a/src/main/java/com/example/prdoit/model/CommentTable.java +++ b/src/main/java/com/example/prdoit/model/CommentTable.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity @Data @AllArgsConstructor @@ -22,7 +24,7 @@ public class CommentTable { private String commentNickname; - private String userNickname; + private LocalDateTime commentDate; @ManyToOne @JoinColumn(name = "contentId", nullable = true) From fc367f874e8a1804764f19819b8ee628f7206d46 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Sun, 9 Feb 2025 22:30:24 +0900 Subject: [PATCH 33/44] fix bug --- .../com/example/prdoit/repository/ContentTableRepository.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index 11d59af..2a059d9 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -10,7 +10,6 @@ public interface ContentTableRepository extends JpaRepository { - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + @@ -22,7 +21,7 @@ public interface ContentTableRepository extends JpaRepository findAllList(@Param("size") int size, @Param("offset") int offset); From 1c097549f68c4b1574acb37d3181a8288c267e9e Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 10 Feb 2025 12:24:31 +0900 Subject: [PATCH 34/44] feat: user searching function --- .../com/example/prdoit/config/WebConfig.java | 2 +- .../prdoit/controller/ContentController.java | 6 ++++- .../repository/BacklogTableRepository.java | 1 - .../repository/ContentTableRepository.java | 6 +++++ .../service/content/ContentService.java | 2 ++ .../service/content/ContentServiceImpl.java | 27 ++++++++++++++++--- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/prdoit/config/WebConfig.java b/src/main/java/com/example/prdoit/config/WebConfig.java index bb808e3..24be647 100644 --- a/src/main/java/com/example/prdoit/config/WebConfig.java +++ b/src/main/java/com/example/prdoit/config/WebConfig.java @@ -7,7 +7,7 @@ import java.nio.file.Watchable; @Configuration -public class WebConfig implements WebMvcConfigurer { +public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { diff --git a/src/main/java/com/example/prdoit/controller/ContentController.java b/src/main/java/com/example/prdoit/controller/ContentController.java index 3b57f5f..d104b2b 100644 --- a/src/main/java/com/example/prdoit/controller/ContentController.java +++ b/src/main/java/com/example/prdoit/controller/ContentController.java @@ -21,13 +21,16 @@ public class ContentController { @GetMapping() public ResponseEntity getAllContent(@RequestParam(value = "query", required = false, defaultValue = "all") String query, @RequestParam(value = "level", required = false, defaultValue = "-1") int level, + @RequestParam(value = "userId", required = false, defaultValue = "") String userId, @RequestParam(value = "size", required = false, defaultValue = "5") int size, @RequestParam(value = "page", required = false, defaultValue = "1") int page) { try{ if(level == -1){ return ResponseEntity.ok(contentService.getContentQuery(query, size, page)); - } else { + } else if(userId.isEmpty()){ return ResponseEntity.ok(contentService.getContentQueryWithLevel(query, level, size, page)); + } else { + return ResponseEntity.ok(contentService.getContentWithUserId(userId)); } } catch (CustomException e) { log.error("[getAllContent] 컨텐츠 조회 실패", e); @@ -78,4 +81,5 @@ public ResponseEntity getContentDetail(@PathVariable String contentId) { return ResponseEntity.internalServerError().body("컨텐츠 상세 조회에 실패했습니다."); } } + } diff --git a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java index 8526896..13ab37d 100644 --- a/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/BacklogTableRepository.java @@ -5,7 +5,6 @@ import com.example.prdoit.dto.project.burndown.BurndownListDto; import com.example.prdoit.model.BacklogTable; import com.example.prdoit.model.ProjectLevelContentTable; -import com.example.prdoit.model.ProjectTable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index 2a059d9..7553ddb 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -41,4 +41,10 @@ public interface ContentTableRepository extends JpaRepository findAllByContentLevel(@Param("level") int level, @Param("size") int size, @Param("offset") int offset); + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c WHERE c.userId.id = :userId") + List findAllByUserId(@Param("userId") String userId); + } diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 08c194a..bda16b5 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -13,6 +13,8 @@ public interface ContentService { List getContentQueryWithLevel(String query, int level, int size, int page); + List getContentWithUserId(String userId); + void updateContent(ContentUpdateDto contentUpdateDto); void postContent(ContentRequestDto contentRequestDto); diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index d533304..a7eb112 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -83,9 +83,25 @@ public List getContentQueryWithLevel(String query, int level } @Override - public void postContent(ContentRequestDto contentRequestDto){ + public List getContentWithUserId(String userId){ + log.info("[getContentWithUserId] 사용자별 컨텐츠 조회 로직 시작"); + try { + List contentResponseDtoList = contentRepository.findAllByUserId(userId); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } else { + return contentResponseDtoList; + } + } catch (Exception e) { + log.error("[getContentWithUserId] 사용자별 컨텐츠 조회 실패"); + throw new RuntimeException("사용자별 컨텐츠 조회에 실패했습니다."); + } + } - IdTable idTable = IdTableRepository.findById(contentRequestDto.getUserId()).orElseThrow(() -> new RuntimeException("존재하지 않는 사용자입니다.")); + @Override + public void postContent(ContentRequestDto contentRequestDto){ + IdTable idTable = IdTableRepository.findById(contentRequestDto.getUserId()).orElseThrow + (() -> new RuntimeException("존재하지 않는 사용자입니다.")); log.info("[postContent] 컨텐츠 등록 로직 시작"); try { ContentTable contentTable = ContentTable.builder() @@ -107,7 +123,8 @@ public void postContent(ContentRequestDto contentRequestDto){ public void updateContent(ContentUpdateDto contentUpdateDto){ log.info("[updateContent] 컨텐츠 수정 로직 시작"); try { - ContentTable contentTable = contentRepository.findById(contentUpdateDto.getContentId()).orElseThrow(() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); + ContentTable contentTable = contentRepository.findById(contentUpdateDto.getContentId()).orElseThrow + (() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); contentTable.setContentTitle(contentUpdateDto.getContentTitle()); contentTable.setContentContent(contentUpdateDto.getContentContent()); contentTable.setContentLevel(contentUpdateDto.getContentLevel()); @@ -123,7 +140,8 @@ public void updateContent(ContentUpdateDto contentUpdateDto){ public ContentDetailDto getContentDetail(String contentId){ log.info("[getContentDetail] 컨텐츠 상세 조회 로직 시작"); try { - ContentTable contentTable = contentRepository.findById(contentId).orElseThrow(() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); + ContentTable contentTable = contentRepository.findById(contentId).orElseThrow + (() -> new RuntimeException("존재하지 않는 컨텐츠입니다.")); contentTable.setContentView(contentTable.getContentView() + 1); contentRepository.save(contentTable); return ContentDetailDto.builder() @@ -141,4 +159,5 @@ public ContentDetailDto getContentDetail(String contentId){ throw new RuntimeException(e.getMessage()); } } + } From 0105fd36e59c0f0f3ae45f0a72e9b64d7052f1ad Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Mon, 10 Feb 2025 12:39:19 +0900 Subject: [PATCH 35/44] feat: user searching function --- .../prdoit/controller/ContentController.java | 2 +- .../com/example/prdoit/model/IdTable.java | 3 +++ .../service/content/ContentServiceImpl.java | 26 ++++++++++++------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/prdoit/controller/ContentController.java b/src/main/java/com/example/prdoit/controller/ContentController.java index d104b2b..5119c37 100644 --- a/src/main/java/com/example/prdoit/controller/ContentController.java +++ b/src/main/java/com/example/prdoit/controller/ContentController.java @@ -25,7 +25,7 @@ public ResponseEntity getAllContent(@RequestParam(value = "query", requi @RequestParam(value = "size", required = false, defaultValue = "5") int size, @RequestParam(value = "page", required = false, defaultValue = "1") int page) { try{ - if(level == -1){ + if(level == -1 && userId.isEmpty()){ return ResponseEntity.ok(contentService.getContentQuery(query, size, page)); } else if(userId.isEmpty()){ return ResponseEntity.ok(contentService.getContentQueryWithLevel(query, level, size, page)); diff --git a/src/main/java/com/example/prdoit/model/IdTable.java b/src/main/java/com/example/prdoit/model/IdTable.java index d3ab371..eaec3ef 100644 --- a/src/main/java/com/example/prdoit/model/IdTable.java +++ b/src/main/java/com/example/prdoit/model/IdTable.java @@ -43,5 +43,8 @@ public class IdTable { @JsonIgnore private List communityTable; + @OneToMany(mappedBy = "userId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List contentTable; } diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index a7eb112..4419f79 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -84,17 +84,23 @@ public List getContentQueryWithLevel(String query, int level @Override public List getContentWithUserId(String userId){ - log.info("[getContentWithUserId] 사용자별 컨텐츠 조회 로직 시작"); - try { - List contentResponseDtoList = contentRepository.findAllByUserId(userId); - if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("등록된 컨텐츠가 없습니다."); - } else { - return contentResponseDtoList; - } + IdTable idTable = IdTableRepository.findById(userId).orElseThrow + (() -> new RuntimeException("존재하지 않는 사용자입니다.")); + if(idTable.getContentTable().isEmpty()) { + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } + try{ + return idTable.getContentTable().stream().map(contentTable -> ContentResponseDto.builder() + .contentId(contentTable.getContentId()) + .contentTitle(contentTable.getContentTitle()) + .contentView(contentTable.getContentView()) + .contentLike(contentTable.getContentLike()) + .contentLevel(contentTable.getContentLevel()) + .writer(contentTable.getUserId().getNickname()) + .build()).toList(); } catch (Exception e) { - log.error("[getContentWithUserId] 사용자별 컨텐츠 조회 실패"); - throw new RuntimeException("사용자별 컨텐츠 조회에 실패했습니다."); + log.error(e.getMessage()); + throw new RuntimeException("쿼리 조회에 실패했습니다."); } } From 21c1820e8b096aad18623c5273446a0a3dcb399a Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 11 Feb 2025 14:03:25 +0900 Subject: [PATCH 36/44] add repo --- .../java/com/example/prdoit/model/CommentTable.java | 6 ++++++ .../java/com/example/prdoit/model/ContentTable.java | 7 +++++++ .../repository/CommentCommentTableRepository.java | 13 +++++++++++++ .../prdoit/repository/CommentTableRepository.java | 9 +++++++++ 4 files changed, 35 insertions(+) create mode 100644 src/main/java/com/example/prdoit/repository/CommentCommentTableRepository.java create mode 100644 src/main/java/com/example/prdoit/repository/CommentTableRepository.java diff --git a/src/main/java/com/example/prdoit/model/CommentTable.java b/src/main/java/com/example/prdoit/model/CommentTable.java index ca0f6d0..e35c9e7 100644 --- a/src/main/java/com/example/prdoit/model/CommentTable.java +++ b/src/main/java/com/example/prdoit/model/CommentTable.java @@ -1,5 +1,6 @@ package com.example.prdoit.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.annotation.Nullable; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -8,6 +9,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; @Entity @Data @@ -34,4 +36,8 @@ public class CommentTable { @JoinColumn(name = "communityId", nullable = true) private CommunityTable communityId; + @OneToMany(mappedBy = "commentId") + @JsonIgnore + private List commentCommentTable; + } diff --git a/src/main/java/com/example/prdoit/model/ContentTable.java b/src/main/java/com/example/prdoit/model/ContentTable.java index e4cb944..be275a2 100644 --- a/src/main/java/com/example/prdoit/model/ContentTable.java +++ b/src/main/java/com/example/prdoit/model/ContentTable.java @@ -1,8 +1,11 @@ package com.example.prdoit.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.*; +import java.util.List; + @Data @Entity @AllArgsConstructor @@ -28,4 +31,8 @@ public class ContentTable { @ManyToOne @JoinColumn(name = "userId") private IdTable userId; + + @OneToMany(mappedBy = "contentId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List commentTable; } diff --git a/src/main/java/com/example/prdoit/repository/CommentCommentTableRepository.java b/src/main/java/com/example/prdoit/repository/CommentCommentTableRepository.java new file mode 100644 index 0000000..cc9c441 --- /dev/null +++ b/src/main/java/com/example/prdoit/repository/CommentCommentTableRepository.java @@ -0,0 +1,13 @@ +package com.example.prdoit.repository; + +import com.example.prdoit.model.CommentCommentTable; +import com.example.prdoit.model.CommentTable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CommentCommentTableRepository extends JpaRepository { + List findAllByCommentId(CommentTable commentId); +} diff --git a/src/main/java/com/example/prdoit/repository/CommentTableRepository.java b/src/main/java/com/example/prdoit/repository/CommentTableRepository.java new file mode 100644 index 0000000..a0f58d1 --- /dev/null +++ b/src/main/java/com/example/prdoit/repository/CommentTableRepository.java @@ -0,0 +1,9 @@ +package com.example.prdoit.repository; + +import com.example.prdoit.model.CommentTable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CommentTableRepository extends JpaRepository { +} From 7c46b0900f555c58733365bea964f66be67db092 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 11 Feb 2025 15:14:52 +0900 Subject: [PATCH 37/44] feat: add user content --- .../prdoit/controller/ContentController.java | 15 +++++++++ .../prdoit/dto/content/TotalContentDto.java | 21 ++++++++++++ .../example/prdoit/model/CommentTable.java | 1 - .../repository/ContentTableRepository.java | 7 ++++ .../service/content/ContentService.java | 7 ++-- .../service/content/ContentServiceImpl.java | 33 ++++++++++++++++--- 6 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/content/TotalContentDto.java diff --git a/src/main/java/com/example/prdoit/controller/ContentController.java b/src/main/java/com/example/prdoit/controller/ContentController.java index 5119c37..75e0b1a 100644 --- a/src/main/java/com/example/prdoit/controller/ContentController.java +++ b/src/main/java/com/example/prdoit/controller/ContentController.java @@ -82,4 +82,19 @@ public ResponseEntity getContentDetail(@PathVariable String contentId) { } } + @GetMapping("/total/{userId}") + public ResponseEntity getTotalContent(@PathVariable String userId, + @RequestParam(value = "size", required = false, defaultValue = "5") int size, + @RequestParam(value = "page", required = false, defaultValue = "1") int page) { + try { + return ResponseEntity.ok(contentService.getTotalContent(userId, size, page)); + } catch (CustomException e) { + log.error("[getTotalContent] 총 컨텐츠 조회 실패", e); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (Exception e) { + log.error("[getTotalContent] 총 컨텐츠 조회 실패", e); + return ResponseEntity.internalServerError().body("총 컨텐츠 조회에 실패했습니다."); + } + } + } diff --git a/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java b/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java new file mode 100644 index 0000000..178e8b5 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java @@ -0,0 +1,21 @@ +package com.example.prdoit.dto.content; + +import lombok.*; +import org.springframework.data.domain.Page; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TotalContentDto { + + private int totalContent; + private int totalView; + private int totalLike; + + private List ContentList; + +} diff --git a/src/main/java/com/example/prdoit/model/CommentTable.java b/src/main/java/com/example/prdoit/model/CommentTable.java index e35c9e7..b51a072 100644 --- a/src/main/java/com/example/prdoit/model/CommentTable.java +++ b/src/main/java/com/example/prdoit/model/CommentTable.java @@ -1,7 +1,6 @@ package com.example.prdoit.model; import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.annotation.Nullable; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index 7553ddb..1159de3 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -2,6 +2,8 @@ import com.example.prdoit.dto.content.ContentResponseDto; import com.example.prdoit.model.ContentTable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -47,4 +49,9 @@ public interface ContentTableRepository extends JpaRepository findAllByUserId(@Param("userId") String userId); + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c WHERE c.userId.id = :userId") + Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); + } diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index bda16b5..1e29911 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -1,9 +1,6 @@ package com.example.prdoit.service.content; -import com.example.prdoit.dto.content.ContentDetailDto; -import com.example.prdoit.dto.content.ContentRequestDto; -import com.example.prdoit.dto.content.ContentResponseDto; -import com.example.prdoit.dto.content.ContentUpdateDto; +import com.example.prdoit.dto.content.*; import java.util.List; // @@ -21,4 +18,6 @@ public interface ContentService { ContentDetailDto getContentDetail(String contentId); + TotalContentDto getTotalContent(String userId, int size, int page); + } diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 4419f79..82f734b 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -1,15 +1,15 @@ package com.example.prdoit.service.content; -import com.example.prdoit.dto.content.ContentDetailDto; -import com.example.prdoit.dto.content.ContentRequestDto; -import com.example.prdoit.dto.content.ContentResponseDto; -import com.example.prdoit.dto.content.ContentUpdateDto; +import com.example.prdoit.dto.content.*; import com.example.prdoit.model.ContentTable; import com.example.prdoit.model.IdTable; import com.example.prdoit.repository.ContentTableRepository; import com.example.prdoit.repository.IdTableRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.List; @@ -166,4 +166,29 @@ public ContentDetailDto getContentDetail(String contentId){ } } + @Override + public TotalContentDto getTotalContent(String userId, int size, int page){ + IdTable idTable = IdTableRepository.findById(userId).orElseThrow + (() -> new RuntimeException("존재하지 않는 사용자입니다.")); + if(idTable.getContentTable().isEmpty()) { + throw new RuntimeException("등록된 컨텐츠가 없습니다."); + } + Pageable pageable = PageRequest.of(page-1, size); + try{ + int totalContent = idTable.getContentTable().size(); + int totalView = idTable.getContentTable().stream().mapToInt(ContentTable::getContentView).sum(); + int totalLike = idTable.getContentTable().stream().mapToInt(ContentTable::getContentLike).sum(); + List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, pageable).stream().toList(); + return TotalContentDto.builder() + .totalContent(totalContent) + .totalView(totalView) + .totalLike(totalLike) + .ContentList(contentResponseDtoList) + .build(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException("쿼리 조회에 실패했습니다."); + } + } + } From 079b3881cabe61cf4e7fa12f10d740cd505aed3c Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Tue, 11 Feb 2025 21:57:14 +0900 Subject: [PATCH 38/44] feat community function --- .../controller/CommunityController.java | 97 ++++++++++ .../community/CommunityDetailResponseDto.java | 25 +++ .../dto/community/CommunityPatchDto.java | 19 ++ .../dto/community/CommunityRequestDto.java | 21 ++ .../dto/community/CommunityResponseDto.java | 22 +++ .../dto/community/CommunityTagPatchDto.java | 14 ++ .../community/CommunityTagResponseDto.java | 14 ++ .../example/prdoit/model/CommunityTable.java | 14 +- .../prdoit/model/CommunityTagTable.java | 25 +++ .../repository/CommunityTableRepository.java | 19 ++ .../CommunityTagTableRepository.java | 18 ++ .../service/community/CommunityService.java | 22 +++ .../community/CommunityServiceImpl.java | 183 ++++++++++++++++++ .../service/content/ContentServiceImpl.java | 1 - 14 files changed, 491 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/example/prdoit/controller/CommunityController.java create mode 100644 src/main/java/com/example/prdoit/dto/community/CommunityDetailResponseDto.java create mode 100644 src/main/java/com/example/prdoit/dto/community/CommunityPatchDto.java create mode 100644 src/main/java/com/example/prdoit/dto/community/CommunityRequestDto.java create mode 100644 src/main/java/com/example/prdoit/dto/community/CommunityResponseDto.java create mode 100644 src/main/java/com/example/prdoit/dto/community/CommunityTagPatchDto.java create mode 100644 src/main/java/com/example/prdoit/dto/community/CommunityTagResponseDto.java create mode 100644 src/main/java/com/example/prdoit/model/CommunityTagTable.java create mode 100644 src/main/java/com/example/prdoit/repository/CommunityTableRepository.java create mode 100644 src/main/java/com/example/prdoit/repository/CommunityTagTableRepository.java create mode 100644 src/main/java/com/example/prdoit/service/community/CommunityService.java create mode 100644 src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java diff --git a/src/main/java/com/example/prdoit/controller/CommunityController.java b/src/main/java/com/example/prdoit/controller/CommunityController.java new file mode 100644 index 0000000..8486326 --- /dev/null +++ b/src/main/java/com/example/prdoit/controller/CommunityController.java @@ -0,0 +1,97 @@ +package com.example.prdoit.controller; + +import com.example.prdoit.dto.community.CommunityPatchDto; +import com.example.prdoit.dto.community.CommunityRequestDto; +import com.example.prdoit.exception.CustomException; +import com.example.prdoit.service.community.CommunityService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@Slf4j +@RequiredArgsConstructor +@CrossOrigin(origins = "*", allowedHeaders = "*") +@RequestMapping("/community") +public class CommunityController { + + private final CommunityService communityService; + + @PostMapping() + public ResponseEntity postCommunity(@RequestBody CommunityRequestDto communityRequestDto) { + log.info("[CommunityController] 글 작성 시작"); + try{ + communityService.postCommunity(communityRequestDto); + return ResponseEntity.ok("글 작성에 성공했습니다."); + } catch (CustomException e) { + log.error(e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + return ResponseEntity.internalServerError().body("글 작성에 실패했습니다."); + } + } + + @GetMapping() + public ResponseEntity getCommunity(@RequestParam(value = "query", required = false, defaultValue = "all") String query, + @RequestParam(value = "tag", required = false, defaultValue = "") String tag, + @RequestParam(value = "size", required = false, defaultValue = "10") int size, + @RequestParam(value = "page", required = false, defaultValue = "1") int page) { + log.info("[CommunityController] 글 목록 조회 시작"); + try{ + return ResponseEntity.ok(communityService.getCommunityList(query, tag, size, page)); + } catch (CustomException e) { + log.error(e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + return ResponseEntity.internalServerError().body("글 목록 조회에 실패했습니다."); + } + } + + @PatchMapping() + public ResponseEntity patchCommunity(@RequestBody CommunityPatchDto communityPatchDto) { + log.info("[CommunityController] 글 수정 시작"); + try{ + communityService.patchCommunity(communityPatchDto); + return ResponseEntity.ok("글 수정에 성공했습니다."); + } catch (CustomException e) { + log.error(e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + return ResponseEntity.internalServerError().body("글 수정에 실패했습니다."); + } + } + + @DeleteMapping("/{communityId}") + public ResponseEntity deleteCommunity(@PathVariable String communityId) { + log.info("[CommunityController] 글 삭제 시작"); + try{ + communityService.deleteCommunity(communityId); + return ResponseEntity.ok("글 삭제에 성공했습니다."); + } catch (CustomException e) { + log.error(e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + return ResponseEntity.internalServerError().body("글 삭제에 실패했습니다."); + } + } + + @GetMapping("/{communityId}") + public ResponseEntity getCommunityDetail(@PathVariable String communityId) { + log.info("[CommunityController] 글 상세 조회 시작"); + try{ + return ResponseEntity.ok(communityService.getCommunityDetail(communityId)); + } catch (CustomException e) { + log.error(e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + return ResponseEntity.internalServerError().body("글 상세 조회에 실패했습니다."); + } + } + +} diff --git a/src/main/java/com/example/prdoit/dto/community/CommunityDetailResponseDto.java b/src/main/java/com/example/prdoit/dto/community/CommunityDetailResponseDto.java new file mode 100644 index 0000000..30e50f4 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/community/CommunityDetailResponseDto.java @@ -0,0 +1,25 @@ +package com.example.prdoit.dto.community; + +import com.example.prdoit.model.CommentTable; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityDetailResponseDto { + + private String communityId; + private String communityTitle; + private String communityContent; + private int communityView; + private String userNickname; + private LocalDateTime communityDate; + private List communityTagList; + private List commentList; + +} diff --git a/src/main/java/com/example/prdoit/dto/community/CommunityPatchDto.java b/src/main/java/com/example/prdoit/dto/community/CommunityPatchDto.java new file mode 100644 index 0000000..d4af342 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/community/CommunityPatchDto.java @@ -0,0 +1,19 @@ +package com.example.prdoit.dto.community; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityPatchDto { + + private String communityId; + private String communityTitle; + private String communityContent; + private List communityTagList; + +} diff --git a/src/main/java/com/example/prdoit/dto/community/CommunityRequestDto.java b/src/main/java/com/example/prdoit/dto/community/CommunityRequestDto.java new file mode 100644 index 0000000..a3437b4 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/community/CommunityRequestDto.java @@ -0,0 +1,21 @@ +package com.example.prdoit.dto.community; + +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityRequestDto { + + private String communityTitle; + private String communityContent; + private List communityTagList; + private LocalDateTime communityDate; + + private String userId; +} diff --git a/src/main/java/com/example/prdoit/dto/community/CommunityResponseDto.java b/src/main/java/com/example/prdoit/dto/community/CommunityResponseDto.java new file mode 100644 index 0000000..4cd16f7 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/community/CommunityResponseDto.java @@ -0,0 +1,22 @@ +package com.example.prdoit.dto.community; + +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityResponseDto { + + private String communityId; + private String communityTitle; + private int commentCount; + private String userNickname; + private LocalDateTime communityCreatedDate; + + private List communityTagList; +} diff --git a/src/main/java/com/example/prdoit/dto/community/CommunityTagPatchDto.java b/src/main/java/com/example/prdoit/dto/community/CommunityTagPatchDto.java new file mode 100644 index 0000000..acbbb9d --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/community/CommunityTagPatchDto.java @@ -0,0 +1,14 @@ +package com.example.prdoit.dto.community; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityTagPatchDto { + + private int communityTagId; + private String communityTag; +} diff --git a/src/main/java/com/example/prdoit/dto/community/CommunityTagResponseDto.java b/src/main/java/com/example/prdoit/dto/community/CommunityTagResponseDto.java new file mode 100644 index 0000000..0e537cb --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/community/CommunityTagResponseDto.java @@ -0,0 +1,14 @@ +package com.example.prdoit.dto.community; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityTagResponseDto { + + private int communityTagId; + private String communityTag; +} diff --git a/src/main/java/com/example/prdoit/model/CommunityTable.java b/src/main/java/com/example/prdoit/model/CommunityTable.java index 0832e95..28ecb48 100644 --- a/src/main/java/com/example/prdoit/model/CommunityTable.java +++ b/src/main/java/com/example/prdoit/model/CommunityTable.java @@ -1,5 +1,6 @@ package com.example.prdoit.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -7,6 +8,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; @Entity @Data @@ -22,11 +24,19 @@ public class CommunityTable { private String communityTitle; - private String communityTag; - private LocalDateTime communityDate; + private int communityView; + @ManyToOne @JoinColumn(name = "id") private IdTable id; + + @OneToMany(mappedBy = "communityId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List commentTable; + + @OneToMany(mappedBy = "communityId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List communityTagTable; } diff --git a/src/main/java/com/example/prdoit/model/CommunityTagTable.java b/src/main/java/com/example/prdoit/model/CommunityTagTable.java new file mode 100644 index 0000000..3fb24ff --- /dev/null +++ b/src/main/java/com/example/prdoit/model/CommunityTagTable.java @@ -0,0 +1,25 @@ +package com.example.prdoit.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommunityTagTable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int communityTagId; + + private String communityTag; + + @ManyToOne + @JoinColumn(name = "communityId") + private CommunityTable communityId; +} diff --git a/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java b/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java new file mode 100644 index 0000000..ccd3240 --- /dev/null +++ b/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java @@ -0,0 +1,19 @@ +package com.example.prdoit.repository; + +import com.example.prdoit.dto.community.CommunityResponseDto; +import com.example.prdoit.model.CommunityTable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CommunityTableRepository extends JpaRepository { + + @Query("SELECT c FROM CommunityTable c WHERE c.communityTitle LIKE %:query% OR c.communityContent LIKE %:query%") + Page findAllByCommunityTitleContaining(String query, Pageable pageable); + +} diff --git a/src/main/java/com/example/prdoit/repository/CommunityTagTableRepository.java b/src/main/java/com/example/prdoit/repository/CommunityTagTableRepository.java new file mode 100644 index 0000000..99f7d9f --- /dev/null +++ b/src/main/java/com/example/prdoit/repository/CommunityTagTableRepository.java @@ -0,0 +1,18 @@ +package com.example.prdoit.repository; + +import com.example.prdoit.model.CommunityTable; +import com.example.prdoit.model.CommunityTagTable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CommunityTagTableRepository extends JpaRepository { + + Page findAllByCommunityTag(String communityTag, Pageable pageable); + + CommunityTagTable findByCommunityIdAndCommunityTagId(CommunityTable communityId, int communityTagId); +} diff --git a/src/main/java/com/example/prdoit/service/community/CommunityService.java b/src/main/java/com/example/prdoit/service/community/CommunityService.java new file mode 100644 index 0000000..86a8a92 --- /dev/null +++ b/src/main/java/com/example/prdoit/service/community/CommunityService.java @@ -0,0 +1,22 @@ +package com.example.prdoit.service.community; + +import com.example.prdoit.dto.community.CommunityDetailResponseDto; +import com.example.prdoit.dto.community.CommunityPatchDto; +import com.example.prdoit.dto.community.CommunityRequestDto; +import com.example.prdoit.dto.community.CommunityResponseDto; + +import java.util.List; + +public interface CommunityService { + + void postCommunity(CommunityRequestDto communityRequestDto); + + List getCommunityList(String query, String tag, int size, int page); + + void patchCommunity(CommunityPatchDto communityPatchDto); + + void deleteCommunity(String communityId); + + CommunityDetailResponseDto getCommunityDetail(String communityId); +} + diff --git a/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java b/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java new file mode 100644 index 0000000..d0fbf43 --- /dev/null +++ b/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java @@ -0,0 +1,183 @@ +package com.example.prdoit.service.community; + +import com.example.prdoit.dto.community.*; +import com.example.prdoit.model.CommunityTable; +import com.example.prdoit.model.CommunityTagTable; +import com.example.prdoit.model.IdTable; +import com.example.prdoit.repository.CommunityTableRepository; +import com.example.prdoit.repository.CommunityTagTableRepository; +import com.example.prdoit.repository.IdTableRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +@Slf4j +public class CommunityServiceImpl implements CommunityService { + + private final CommunityTableRepository communityTableRepository; + private final IdTableRepository idTableRepository; + private final CommunityTagTableRepository communityTagTableRepository; + + @Override + public void postCommunity(CommunityRequestDto communityRequestDto) { + log.info("[CommunityServiceImpl] 글 작성 시작"); + IdTable idTable = idTableRepository.findById(communityRequestDto.getUserId()).orElseThrow(() -> new IllegalArgumentException("해당 아이디가 없습니다.")); + + try{ + CommunityTable communityTable = CommunityTable.builder() + .communityId(UUID.randomUUID().toString()) + .communityTitle(communityRequestDto.getCommunityTitle()) + .communityContent(communityRequestDto.getCommunityContent()) + .communityDate(communityRequestDto.getCommunityDate()) + .communityView(0) + .id(idTable) + .build(); + + List communityTagTableList = communityRequestDto.getCommunityTagList().stream() + .map(tag -> CommunityTagTable.builder() + .communityTag(tag) + .communityId(communityTable) + .build()) + .toList(); + communityTableRepository.save(communityTable); + communityTagTableRepository.saveAll(communityTagTableList); + log.info("[CommunityServiceImpl] 글 작성 성공"); + } catch (Exception e) { + log.error(e.getMessage()); + throw new IllegalArgumentException("글 작성에 실패했습니다."); + } + } + + @Override + public List getCommunityList(String query, String tag, int size, int page){ + log.info("[CommunityServiceImpl] 글 목록 조회 시작"); + Pageable pageable = PageRequest.of(page - 1, size); + try { + if (!query.equals("all")) { + List communityTableList = communityTableRepository.findAllByCommunityTitleContaining(query, pageable).toList(); + return communityTableList.stream() + .map(communityTable -> CommunityResponseDto.builder() + .communityId(communityTable.getCommunityId()) + .communityTitle(communityTable.getCommunityTitle()) + .commentCount(communityTable.getCommentTable().size()) + .userNickname(communityTable.getId().getNickname()) + .communityCreatedDate(communityTable.getCommunityDate()) + .communityTagList(communityTable.getCommunityTagTable().stream() + .map(CommunityTagTable -> CommunityTagResponseDto.builder() + .communityTagId(CommunityTagTable.getCommunityTagId()) + .communityTag(CommunityTagTable.getCommunityTag()) + .build()) + .toList()) + .build()) + .toList(); + } + + if (!tag.isEmpty()) { + List communityTagTableList = communityTagTableRepository.findAllByCommunityTag(tag, pageable).toList(); + return communityTagTableList.stream() + .map(communityTagTable -> CommunityResponseDto.builder() + .communityId(communityTagTable.getCommunityId().getCommunityId()) + .communityTitle(communityTagTable.getCommunityId().getCommunityTitle()) + .commentCount(communityTagTable.getCommunityId().getCommentTable().size()) + .userNickname(communityTagTable.getCommunityId().getId().getNickname()) + .communityCreatedDate(communityTagTable.getCommunityId().getCommunityDate()) + .communityTagList(communityTagTable.getCommunityId().getCommunityTagTable().stream() + .map(CommunityTagTable -> CommunityTagResponseDto.builder() + .communityTagId(CommunityTagTable.getCommunityTagId()) + .communityTag(CommunityTagTable.getCommunityTag()) + .build()) + .toList()) + .build()) + .toList(); + } + + return communityTableRepository.findAll(pageable).stream() + .map(communityTable -> CommunityResponseDto.builder() + .communityId(communityTable.getCommunityId()) + .communityTitle(communityTable.getCommunityTitle()) + .commentCount(communityTable.getCommentTable().size()) + .userNickname(communityTable.getId().getNickname()) + .communityCreatedDate(communityTable.getCommunityDate()) + .communityTagList(communityTable.getCommunityTagTable().stream() + .map(CommunityTagTable -> CommunityTagResponseDto.builder() + .communityTagId(CommunityTagTable.getCommunityTagId()) + .communityTag(CommunityTagTable.getCommunityTag()) + .build()) + .toList()) + .build()) + .toList(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new IllegalArgumentException("글 목록 조회에 실패했습니다."); + } + } + + @Override + public void patchCommunity(CommunityPatchDto communityPatchDto) { + log.info("[CommunityServiceImpl] 글 수정 시작"); + CommunityTable communityTable = communityTableRepository.findById(communityPatchDto.getCommunityId()).orElseThrow(() -> new IllegalArgumentException("해당 글이 없습니다.")); + try{ + communityTable.setCommunityTitle(communityPatchDto.getCommunityTitle()); + communityTable.setCommunityContent(communityPatchDto.getCommunityContent()); + + for(CommunityTagPatchDto communityTagPatchDto : communityPatchDto.getCommunityTagList()) { + CommunityTagTable communityTagTable = communityTagTableRepository.findByCommunityIdAndCommunityTagId(communityTable, communityTagPatchDto.getCommunityTagId()); + if(communityTagPatchDto.getCommunityTag().isEmpty()) { + communityTagTableRepository.delete(communityTagTable); + continue; + } else { + communityTagTable.setCommunityTag(communityTagPatchDto.getCommunityTag()); + } + communityTagTableRepository.save(communityTagTable); + } + + communityTableRepository.save(communityTable); + log.info("[CommunityServiceImpl] 글 수정 성공"); + } catch (Exception e) { + log.error(e.getMessage()); + throw new IllegalArgumentException("글 수정에 실패했습니다."); + } + } + + @Override + public void deleteCommunity(String communityId) { + log.info("[CommunityServiceImpl] 글 삭제 시작"); + CommunityTable communityTable = communityTableRepository.findById(communityId).orElseThrow(() -> new IllegalArgumentException("해당 글이 없습니다.")); + try { + communityTableRepository.delete(communityTable); + } catch (Exception e) { + log.error(e.getMessage()); + throw new IllegalArgumentException("글 삭제에 실패했습니다."); + } + } + + @Override + public CommunityDetailResponseDto getCommunityDetail(String communityId) { + log.info("[CommunityServiceImpl] 글 상세 조회 시작"); + CommunityTable communityTable = communityTableRepository.findById(communityId).orElseThrow(() -> new IllegalArgumentException("해당 글이 없습니다.")); + try { + return CommunityDetailResponseDto.builder() + .communityId(communityTable.getCommunityId()) + .communityTitle(communityTable.getCommunityTitle()) + .communityContent(communityTable.getCommunityContent()) + .communityDate(communityTable.getCommunityDate()) + .communityView(communityTable.getCommunityView()) + .userNickname(communityTable.getId().getNickname()) + .communityTagList(communityTable.getCommunityTagTable().stream() + .map(CommunityTagTable::getCommunityTag) + .toList()) + .commentList(communityTable.getCommentTable()) + .build(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new IllegalArgumentException("글 상세 조회에 실패했습니다."); + } + } +} diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 82f734b..c8a1f17 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -7,7 +7,6 @@ import com.example.prdoit.repository.IdTableRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; From 041efe517fe27a279cf4090c272de471d81f504f Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 14:22:48 +0900 Subject: [PATCH 39/44] feat:community id search & find id & change password --- .../controller/CommunityController.java | 3 +- .../prdoit/controller/UserController.java | 40 +++++++++++++++++ .../prdoit/dto/user/ChangePasswordDto.java | 14 ++++++ .../repository/CommunityTableRepository.java | 2 + .../prdoit/repository/IdTableRepository.java | 4 +- .../service/community/CommunityService.java | 2 +- .../community/CommunityServiceImpl.java | 23 +++++++++- .../prdoit/service/user/UserService.java | 6 +++ .../prdoit/service/user/UserServiceImpl.java | 45 ++++++++++++++++++- 9 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/user/ChangePasswordDto.java diff --git a/src/main/java/com/example/prdoit/controller/CommunityController.java b/src/main/java/com/example/prdoit/controller/CommunityController.java index 8486326..40433b0 100644 --- a/src/main/java/com/example/prdoit/controller/CommunityController.java +++ b/src/main/java/com/example/prdoit/controller/CommunityController.java @@ -36,11 +36,12 @@ public ResponseEntity postCommunity(@RequestBody CommunityRequestDto com @GetMapping() public ResponseEntity getCommunity(@RequestParam(value = "query", required = false, defaultValue = "all") String query, @RequestParam(value = "tag", required = false, defaultValue = "") String tag, + @RequestParam(value = "userId", required = false, defaultValue = "") String userId, @RequestParam(value = "size", required = false, defaultValue = "10") int size, @RequestParam(value = "page", required = false, defaultValue = "1") int page) { log.info("[CommunityController] 글 목록 조회 시작"); try{ - return ResponseEntity.ok(communityService.getCommunityList(query, tag, size, page)); + return ResponseEntity.ok(communityService.getCommunityList(query, tag, userId, size, page)); } catch (CustomException e) { log.error(e.getMessage()); return ResponseEntity.badRequest().body(e.getMessage()); diff --git a/src/main/java/com/example/prdoit/controller/UserController.java b/src/main/java/com/example/prdoit/controller/UserController.java index a7f7240..10fc6cd 100644 --- a/src/main/java/com/example/prdoit/controller/UserController.java +++ b/src/main/java/com/example/prdoit/controller/UserController.java @@ -1,5 +1,6 @@ package com.example.prdoit.controller; +import com.example.prdoit.dto.user.ChangePasswordDto; import com.example.prdoit.dto.user.LoginDto; import com.example.prdoit.dto.user.UserDto; import com.example.prdoit.exception.CustomException; @@ -7,6 +8,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.parameters.P; import org.springframework.web.bind.annotation.*; @@ -88,4 +90,42 @@ public ResponseEntity login(@RequestBody LoginDto loginDto) { return ResponseEntity.badRequest().body(e.getMessage()); } } + + @GetMapping("/findId/{email}") + public ResponseEntity findId(@PathVariable String email){ + log.info("[findId] 아이디 찾기 시작"); + + try{ + return ResponseEntity.ok(userService.findId(email)); + } catch (CustomException e) { + log.error("[findId] 아이디 찾기 실패 - 이유: {}", e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @GetMapping("/confirm/{userId}/{email}") + public ResponseEntity checkIdAndEmail(@PathVariable String userId, @PathVariable String email){ + log.info("[checkIdAndEmail] 아이디와 이메일 확인 시작"); + + try{ + userService.checkIdAndEmail(userId, email); + return ResponseEntity.ok("아이디와 이메일이 일치합니다."); + } catch (CustomException e) { + log.error("[checkIdAndEmail] 아이디와 이메일 확인 실패 - 이유: {}", e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @PatchMapping("/changePassword") + public ResponseEntity changePassword(@RequestBody ChangePasswordDto changePasswordDto){ + log.info("[changePassword] 비밀번호 변경 시작"); + try { + userService.changePassword(changePasswordDto.getUserId(), changePasswordDto.getNewPassword()); + return ResponseEntity.ok("비밀번호 변경에 성공했습니다."); + } catch (CustomException e) { + log.error("[changePassword] 비밀번호 변경 실패 - 이유: {}", e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + } diff --git a/src/main/java/com/example/prdoit/dto/user/ChangePasswordDto.java b/src/main/java/com/example/prdoit/dto/user/ChangePasswordDto.java new file mode 100644 index 0000000..fae7755 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/user/ChangePasswordDto.java @@ -0,0 +1,14 @@ +package com.example.prdoit.dto.user; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ChangePasswordDto { + + private String userId; + private String newPassword; +} diff --git a/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java b/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java index ccd3240..783cc16 100644 --- a/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/CommunityTableRepository.java @@ -16,4 +16,6 @@ public interface CommunityTableRepository extends JpaRepository findAllByCommunityTitleContaining(String query, Pageable pageable); + @Query("SELECT c FROM CommunityTable c WHERE c.id.id = :userId") + Page findAllByUserId(String userId, Pageable pageable); } diff --git a/src/main/java/com/example/prdoit/repository/IdTableRepository.java b/src/main/java/com/example/prdoit/repository/IdTableRepository.java index d10a471..0a6c996 100644 --- a/src/main/java/com/example/prdoit/repository/IdTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/IdTableRepository.java @@ -3,7 +3,9 @@ import com.example.prdoit.model.IdTable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface IdTableRepository extends JpaRepository { - IdTable findByEmail(String userEmail); + Optional findByEmail(String userEmail); IdTable findByNickname(String userNickname); } diff --git a/src/main/java/com/example/prdoit/service/community/CommunityService.java b/src/main/java/com/example/prdoit/service/community/CommunityService.java index 86a8a92..c39de56 100644 --- a/src/main/java/com/example/prdoit/service/community/CommunityService.java +++ b/src/main/java/com/example/prdoit/service/community/CommunityService.java @@ -11,7 +11,7 @@ public interface CommunityService { void postCommunity(CommunityRequestDto communityRequestDto); - List getCommunityList(String query, String tag, int size, int page); + List getCommunityList(String query, String tag, String userId, int size, int page); void patchCommunity(CommunityPatchDto communityPatchDto); diff --git a/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java b/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java index d0fbf43..6786adc 100644 --- a/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/community/CommunityServiceImpl.java @@ -56,7 +56,7 @@ public void postCommunity(CommunityRequestDto communityRequestDto) { } @Override - public List getCommunityList(String query, String tag, int size, int page){ + public List getCommunityList(String query, String tag, String userId, int size, int page){ log.info("[CommunityServiceImpl] 글 목록 조회 시작"); Pageable pageable = PageRequest.of(page - 1, size); try { @@ -98,6 +98,25 @@ public List getCommunityList(String query, String tag, int .toList(); } + if(!userId.isEmpty()) { + List communityTableList = communityTableRepository.findAllByUserId(userId, pageable).toList(); + return communityTableList.stream() + .map(communityTable -> CommunityResponseDto.builder() + .communityId(communityTable.getCommunityId()) + .communityTitle(communityTable.getCommunityTitle()) + .commentCount(communityTable.getCommentTable().size()) + .userNickname(communityTable.getId().getNickname()) + .communityCreatedDate(communityTable.getCommunityDate()) + .communityTagList(communityTable.getCommunityTagTable().stream() + .map(CommunityTagTable -> CommunityTagResponseDto.builder() + .communityTagId(CommunityTagTable.getCommunityTagId()) + .communityTag(CommunityTagTable.getCommunityTag()) + .build()) + .toList()) + .build()) + .toList(); + } + return communityTableRepository.findAll(pageable).stream() .map(communityTable -> CommunityResponseDto.builder() .communityId(communityTable.getCommunityId()) @@ -163,6 +182,8 @@ public CommunityDetailResponseDto getCommunityDetail(String communityId) { log.info("[CommunityServiceImpl] 글 상세 조회 시작"); CommunityTable communityTable = communityTableRepository.findById(communityId).orElseThrow(() -> new IllegalArgumentException("해당 글이 없습니다.")); try { + communityTable.setCommunityView(communityTable.getCommunityView() + 1); + communityTableRepository.save(communityTable); return CommunityDetailResponseDto.builder() .communityId(communityTable.getCommunityId()) .communityTitle(communityTable.getCommunityTitle()) diff --git a/src/main/java/com/example/prdoit/service/user/UserService.java b/src/main/java/com/example/prdoit/service/user/UserService.java index b06ef3b..00c6516 100644 --- a/src/main/java/com/example/prdoit/service/user/UserService.java +++ b/src/main/java/com/example/prdoit/service/user/UserService.java @@ -14,4 +14,10 @@ public interface UserService { void login(String userId, String password); + String findId(String email); + + void checkIdAndEmail(String userId, String email); + + void changePassword(String userId, String password); + } diff --git a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java index 325fb0b..655be39 100644 --- a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java @@ -65,7 +65,7 @@ public void checkId(String userId) { public void checkEmail(String email) { log.info("[checkEmail] 이메일 중복 확인 로직 시작"); - IdTable findUser = idTableRepository.findByEmail(email); + IdTable findUser = idTableRepository.findByEmail(email).orElseGet(() -> null); if(findUser != null){ log.info("[checkEmail] 이메일 중복"); @@ -107,4 +107,47 @@ public void login(String userId, String password) { log.info("[login] 로그인 성공 - ID: {}", userId); } + + @Override + public String findId(String email){ + IdTable idTable = idTableRepository.findByEmail(email).orElseThrow(() -> new CustomException("해당 이메일로 가입된 아이디가 없습니다.")); + try{ + return idTable.getId(); + } catch (Exception e){ + log.info(e.getMessage()); + throw new CustomException(e.getMessage()); + } + } + + @Override + public void checkIdAndEmail(String userId, String email) { + log.info("[checkIdAndEmail] 아이디와 이메일 확인 로직 시작"); + + try { + IdTable idTable = idTableRepository.findById(userId).orElseThrow(() -> new CustomException("해당 아이디로 가입된 정보가 없습니다.")); + if(!idTable.getEmail().equals(email)){ + throw new CustomException("해당 아이디와 이메일로 가입된 정보가 없습니다."); + } + } catch (CustomException e){ + log.info(e.getMessage()); + throw new CustomException("해당 아이디와 이메일로 가입된 정보가 없습니다."); + } catch (Exception e){ + log.info(e.getMessage()); + throw new CustomException(e.getMessage()); + } + } + + @Override + public void changePassword(String userId, String password) { + log.info("[changePassword] 비밀번호 변경 로직 시작"); + + IdTable idTable = idTableRepository.findById(userId).orElseThrow(() -> new CustomException("해당 아이디로 가입된 정보가 없습니다.")); + try{ + idTable.setPassword(passwordEncoder.encode(password)); + idTableRepository.save(idTable); + } catch (Exception e){ + log.info(e.getMessage()); + throw new CustomException(e.getMessage()); + } + } } From 0eef0023c4a4c0489150679b4a7cb15d36612d16 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 14:31:06 +0900 Subject: [PATCH 40/44] feat:community id search & find id & change password --- .../prdoit/controller/UserController.java | 13 +++++++++++++ .../com/example/prdoit/dto/user/UserDto.java | 12 +----------- .../prdoit/service/user/UserService.java | 2 ++ .../prdoit/service/user/UserServiceImpl.java | 17 +++++++++++++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/prdoit/controller/UserController.java b/src/main/java/com/example/prdoit/controller/UserController.java index 10fc6cd..6f56d19 100644 --- a/src/main/java/com/example/prdoit/controller/UserController.java +++ b/src/main/java/com/example/prdoit/controller/UserController.java @@ -128,4 +128,17 @@ public ResponseEntity changePassword(@RequestBody ChangePasswordDto chan } } + @PostMapping("/auth/password") + public ResponseEntity checkPassword(@RequestBody LoginDto loginDto) { + log.info("[checkPassword] 비밀번호 확인 시작"); + + try { + userService.checkPassword(loginDto.getUserId(), loginDto.getPassword()); + return ResponseEntity.ok("비밀번호가 일치합니다."); + } catch (CustomException e) { + log.error("[checkPassword] 비밀번호 불일치 - 이유: {}", e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + } diff --git a/src/main/java/com/example/prdoit/dto/user/UserDto.java b/src/main/java/com/example/prdoit/dto/user/UserDto.java index b215738..d70b12d 100644 --- a/src/main/java/com/example/prdoit/dto/user/UserDto.java +++ b/src/main/java/com/example/prdoit/dto/user/UserDto.java @@ -14,15 +14,5 @@ public class UserDto { private String name; private String email; private String nickname; -// - @Override - public String toString() { - return "UserDto{" + - "id='" + id + '\'' + - ", password='" + password + '\'' + - ", name='" + name + '\'' + - ", email='" + email + '\'' + - ", nickname='" + nickname + '\'' + - '}'; - } + } diff --git a/src/main/java/com/example/prdoit/service/user/UserService.java b/src/main/java/com/example/prdoit/service/user/UserService.java index 00c6516..39c3793 100644 --- a/src/main/java/com/example/prdoit/service/user/UserService.java +++ b/src/main/java/com/example/prdoit/service/user/UserService.java @@ -20,4 +20,6 @@ public interface UserService { void changePassword(String userId, String password); + void checkPassword(String userId, String password); + } diff --git a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java index 655be39..6efdd20 100644 --- a/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/user/UserServiceImpl.java @@ -150,4 +150,21 @@ public void changePassword(String userId, String password) { throw new CustomException(e.getMessage()); } } + + @Override + public void checkPassword(String userId, String password){ + log.info("[checkPassword] 비밀번호 확인 로직 시작"); + try { + IdTable idTable = idTableRepository.findById(userId).orElseThrow(() -> new CustomException("해당 아이디로 가입된 정보가 없습니다.")); + if (!passwordEncoder.matches(password, idTable.getPassword())) { + throw new CustomException("비밀번호가 일치하지 않습니다."); + } + } catch (CustomException e){ + log.info(e.getMessage()); + throw new CustomException("비밀번호가 일치하지 않습니다."); + } catch (Exception e){ + log.info(e.getMessage()); + throw new CustomException(e.getMessage()); + } + } } From aa242ccb3f66d3c3dbc25b8e166d94eb64939661 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 14:56:55 +0900 Subject: [PATCH 41/44] fix : bug fix --- .../service/content/ContentServiceImpl.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index c8a1f17..0c942d6 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -31,17 +31,17 @@ public List getContentQuery(String query, int size, int page throw new RuntimeException("등록된 컨텐츠가 없습니다."); } try { - if(query.equals("all")) { - List contentResponseDtoList = contentRepository.findAllList(size, offset); - if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("등록된 컨텐츠가 없습니다."); + if(!query.equals("all")){ + List contentResponseDtoList = contentRepository.findAllByQueryContaining(query, size, offset); + if (contentResponseDtoList.isEmpty()) { + throw new RuntimeException("검색 결과가 없습니다."); } else { return contentResponseDtoList; } - } else { - List contentResponseDtoList = contentRepository.findAllByQueryContaining(query, size, offset); - if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("검색 결과가 없습니다."); + } else{ + List contentResponseDtoList = contentRepository.findAllList(size, offset); + if (contentResponseDtoList.isEmpty()) { + throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { return contentResponseDtoList; } @@ -60,17 +60,17 @@ public List getContentQueryWithLevel(String query, int level } int offset = (page - 1) * size; try{ - if(query.equals("all")) { - List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); + if(!query.equals("all")){ + List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("등록된 컨텐츠가 없습니다."); + throw new RuntimeException("검색 결과가 없습니다."); } else { return contentResponseDtoList; } } else { - List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); + List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("검색 결과가 없습니다."); + throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { return contentResponseDtoList; } From 3e06dbcb7981294568410769e6944232b77cfc47 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 15:13:36 +0900 Subject: [PATCH 42/44] fix : bug fix --- .../prdoit/controller/ContentController.java | 2 +- .../repository/ContentTableRepository.java | 16 ++++++-- .../service/content/ContentService.java | 2 +- .../service/content/ContentServiceImpl.java | 40 ++++++++++++++----- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/prdoit/controller/ContentController.java b/src/main/java/com/example/prdoit/controller/ContentController.java index 75e0b1a..140fa45 100644 --- a/src/main/java/com/example/prdoit/controller/ContentController.java +++ b/src/main/java/com/example/prdoit/controller/ContentController.java @@ -30,7 +30,7 @@ public ResponseEntity getAllContent(@RequestParam(value = "query", requi } else if(userId.isEmpty()){ return ResponseEntity.ok(contentService.getContentQueryWithLevel(query, level, size, page)); } else { - return ResponseEntity.ok(contentService.getContentWithUserId(userId)); + return ResponseEntity.ok(contentService.getContentWithUserId(userId, query, level, size, page)); } } catch (CustomException e) { log.error("[getAllContent] 컨텐츠 조회 실패", e); diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index 1159de3..ae81550 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -47,11 +47,21 @@ public interface ContentTableRepository extends JpaRepository findAllByUserId(@Param("userId") String userId); + Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + - "FROM ContentTable c WHERE c.userId.id = :userId") - Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentLevel = :level") + Page findAllByUserIdAndContentLevel(String userId, int level, Pageable pageable); + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentTitle LIKE %:query%") + Page findAllByUserIdAndQueryContaining(String userId, String query, Pageable pageable); + + @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentLevel = :level AND c.contentTitle LIKE %:query%") + Page findAllByUserIdAndContentLevelAndQueryContaining(String userId, int level, String query, Pageable pageable); } diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 1e29911..474d296 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -10,7 +10,7 @@ public interface ContentService { List getContentQueryWithLevel(String query, int level, int size, int page); - List getContentWithUserId(String userId); + List getContentWithUserId(String userId, String query, int level, int size, int page); void updateContent(ContentUpdateDto contentUpdateDto); diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 0c942d6..d338f24 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -82,21 +82,43 @@ public List getContentQueryWithLevel(String query, int level } @Override - public List getContentWithUserId(String userId){ + public List getContentWithUserId(String userId, String query, int level, int size, int page){ IdTable idTable = IdTableRepository.findById(userId).orElseThrow (() -> new RuntimeException("존재하지 않는 사용자입니다.")); if(idTable.getContentTable().isEmpty()) { throw new RuntimeException("등록된 컨텐츠가 없습니다."); } + int offset = (page - 1) * size; try{ - return idTable.getContentTable().stream().map(contentTable -> ContentResponseDto.builder() - .contentId(contentTable.getContentId()) - .contentTitle(contentTable.getContentTitle()) - .contentView(contentTable.getContentView()) - .contentLike(contentTable.getContentLike()) - .contentLevel(contentTable.getContentLevel()) - .writer(contentTable.getUserId().getNickname()) - .build()).toList(); + if(query.equals("all") && level == -1){ + List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, PageRequest.of(page-1, size)).stream().toList(); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("검색 결과가 없습니다."); + } else { + return contentResponseDtoList; + } + } else if(!query.equals("all") && level == -1){ + List contentResponseDtoList = contentRepository.findAllByUserIdAndQueryContaining(userId, query, PageRequest.of(page-1, size)).stream().toList(); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("검색 결과가 없습니다."); + } else { + return contentResponseDtoList; + } + } else if(query.equals("all")){ + List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevel(userId, level, PageRequest.of(page-1, size)).stream().toList(); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("검색 결과가 없습니다."); + } else { + return contentResponseDtoList; + } + } else { + List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(userId, level, query, PageRequest.of(page-1, size)).stream().toList(); + if(contentResponseDtoList.isEmpty()){ + throw new RuntimeException("검색 결과가 없습니다."); + } else { + return contentResponseDtoList; + } + } } catch (Exception e) { log.error(e.getMessage()); throw new RuntimeException("쿼리 조회에 실패했습니다."); From 9a86010dfafd7b2005a290685ffd32cd4df1ce19 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 15:16:18 +0900 Subject: [PATCH 43/44] fix : bug fix --- .../service/content/ContentServiceImpl.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index d338f24..3599916 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -1,6 +1,7 @@ package com.example.prdoit.service.content; import com.example.prdoit.dto.content.*; +import com.example.prdoit.exception.CustomException; import com.example.prdoit.model.ContentTable; import com.example.prdoit.model.IdTable; import com.example.prdoit.repository.ContentTableRepository; @@ -93,35 +94,38 @@ public List getContentWithUserId(String userId, String query if(query.equals("all") && level == -1){ List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("검색 결과가 없습니다."); + throw new CustomException("검색 결과가 없습니다."); } else { return contentResponseDtoList; } } else if(!query.equals("all") && level == -1){ List contentResponseDtoList = contentRepository.findAllByUserIdAndQueryContaining(userId, query, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("검색 결과가 없습니다."); + throw new CustomException("검색 결과가 없습니다."); } else { return contentResponseDtoList; } } else if(query.equals("all")){ List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevel(userId, level, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("검색 결과가 없습니다."); + throw new CustomException("검색 결과가 없습니다."); } else { return contentResponseDtoList; } } else { List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(userId, level, query, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ - throw new RuntimeException("검색 결과가 없습니다."); + throw new CustomException("검색 결과가 없습니다."); } else { return contentResponseDtoList; } } - } catch (Exception e) { + } catch (CustomException e) { log.error(e.getMessage()); - throw new RuntimeException("쿼리 조회에 실패했습니다."); + throw new CustomException("검색 결과가 없습니다."); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw new RuntimeException("조회 실패"); } } From b86616810d1d92dc2aa29e67884835ecb456ec3e Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 16:29:26 +0900 Subject: [PATCH 44/44] fix : bug fix --- .../dto/content/ContentResponseDto.java | 11 ++- .../prdoit/dto/content/ContentTitleDto.java | 18 +++++ .../prdoit/dto/content/TotalContentDto.java | 2 +- .../example/prdoit/model/ContentTable.java | 1 + .../repository/ContentTableRepository.java | 55 +++++++++----- .../service/content/ContentService.java | 6 +- .../service/content/ContentServiceImpl.java | 74 +++++++++++++------ 7 files changed, 119 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java diff --git a/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java b/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java index 7c41a15..8ad5230 100644 --- a/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java @@ -2,6 +2,8 @@ import lombok.*; +import java.util.List; + @Getter @Setter @AllArgsConstructor @@ -9,10 +11,7 @@ @Builder public class ContentResponseDto { - private String contentId; - private String contentTitle; - private int contentView; - private int contentLike; - private int contentLevel; - private String writer; + private int total; + private List contentList; + } diff --git a/src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java b/src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java new file mode 100644 index 0000000..890fc92 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.content; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentTitleDto { + + private String contentId; + private String contentTitle; + private int contentView; + private int contentLike; + private int contentLevel; + private String writer; +} diff --git a/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java b/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java index 178e8b5..b535ff0 100644 --- a/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java +++ b/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java @@ -16,6 +16,6 @@ public class TotalContentDto { private int totalView; private int totalLike; - private List ContentList; + private List ContentList; } diff --git a/src/main/java/com/example/prdoit/model/ContentTable.java b/src/main/java/com/example/prdoit/model/ContentTable.java index be275a2..3b8b4ed 100644 --- a/src/main/java/com/example/prdoit/model/ContentTable.java +++ b/src/main/java/com/example/prdoit/model/ContentTable.java @@ -30,6 +30,7 @@ public class ContentTable { @ManyToOne @JoinColumn(name = "userId") + @JsonIgnore private IdTable userId; @OneToMany(mappedBy = "contentId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index ae81550..bb4c090 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -1,67 +1,88 @@ package com.example.prdoit.repository; -import com.example.prdoit.dto.content.ContentResponseDto; +import com.example.prdoit.dto.content.ContentTitleDto; import com.example.prdoit.model.ContentTable; +import com.example.prdoit.model.IdTable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import javax.swing.text.AbstractDocument; import java.util.List; public interface ContentTableRepository extends JpaRepository { - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + "WHERE c.contentTitle LIKE %:query% GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllByQueryContaining(@Param("query") String query, @Param("size") int size, @Param("offset") int offset); + List findAllByQueryContaining(@Param("query") String query, @Param("size") int size, @Param("offset") int offset); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT c FROM ContentTable c WHERE c.contentTitle LIKE %:query% OR c.contentContent LIKE %:query%") + List findAllByContentTitleContaining(String query); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllList(@Param("size") int size, @Param("offset") int offset); + List findAllList(@Param("size") int size, @Param("offset") int offset); + - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc on c.contentId = cc.contentId.contentId WHERE c.contentTitle LIKE %:query% AND c.contentLevel = :level " + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllQueryContainingAndContentLevel(@Param("query")String query, @Param("level")int level, @Param("size") int size, @Param("offset") int offset); + List findAllQueryContainingAndContentLevel(@Param("query")String query, @Param("level")int level, @Param("size") int size, @Param("offset") int offset); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT c FROM ContentTable c WHERE (c.contentTitle LIKE %:query% OR c.contentContent LIKE %:query%) AND c.contentLevel = :level") + List findAllByQueryContainingAndContentLevel(String query, int level); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId WHERE c.contentLevel = :level " + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllByContentLevel(@Param("level") int level, @Param("size") int size, @Param("offset") int offset); + List findAllByContentLevel(@Param("level") int level, @Param("size") int size, @Param("offset") int offset); + + List findAllByContentLevel(int level); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId") - Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); + Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + List findAllByUserId(IdTable userId); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentLevel = :level") - Page findAllByUserIdAndContentLevel(String userId, int level, Pageable pageable); + Page findAllByUserIdAndContentLevel(String userId, int level, Pageable pageable); + + List findAllByUserIdAndContentLevel(IdTable userId, int level); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentTitle LIKE %:query%") - Page findAllByUserIdAndQueryContaining(String userId, String query, Pageable pageable); + Page findAllByUserIdAndQueryContaining(String userId, String query, Pageable pageable); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT c FROM ContentTable c WHERE c.userId = :userId AND (c.contentTitle LIKE %:query% or c.contentContent LIKE %:query%)") + List findAllByUserIdAndQueryContaining(IdTable userId, String query); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentLevel = :level AND c.contentTitle LIKE %:query%") - Page findAllByUserIdAndContentLevelAndQueryContaining(String userId, int level, String query, Pageable pageable); + Page findAllByUserIdAndContentLevelAndQueryContaining(String userId, int level, String query, Pageable pageable); + + @Query("SELECT c FROM ContentTable c WHERE c.userId = :userId AND c.contentLevel = :level AND (c.contentTitle LIKE %:query% or c.contentContent LIKE %:query%)") + List findAllByUserIdAndContentLevelAndQueryContaining(IdTable userId, int level, String query); } diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 474d296..02b60cc 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -6,11 +6,11 @@ // public interface ContentService { - List getContentQuery(String query, int size, int page); + ContentResponseDto getContentQuery(String query, int size, int page); - List getContentQueryWithLevel(String query, int level, int size, int page); + ContentResponseDto getContentQueryWithLevel(String query, int level, int size, int page); - List getContentWithUserId(String userId, String query, int level, int size, int page); + ContentResponseDto getContentWithUserId(String userId, String query, int level, int size, int page); void updateContent(ContentUpdateDto contentUpdateDto); diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 3599916..409455f 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -12,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import javax.swing.text.AbstractDocument; import java.util.List; import java.util.UUID; @@ -24,7 +25,7 @@ public class ContentServiceImpl implements ContentService { private final IdTableRepository IdTableRepository; @Override - public List getContentQuery(String query, int size, int page){ + public ContentResponseDto getContentQuery(String query, int size, int page){ log.info("[getContentQuery] 쿼리 조회 로직 시작"); List contentTableList = contentRepository.findAll(); int offset = (page - 1) * size; @@ -33,18 +34,25 @@ public List getContentQuery(String query, int size, int page } try { if(!query.equals("all")){ - List contentResponseDtoList = contentRepository.findAllByQueryContaining(query, size, offset); - if (contentResponseDtoList.isEmpty()) { + List contentTableListQuery = contentRepository.findAllByContentTitleContaining(query); + List contentTitleDtoList = contentRepository.findAllByQueryContaining(query, size, offset); + if (contentTitleDtoList.isEmpty()) { throw new RuntimeException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableListQuery.size()) + .contentList(contentTitleDtoList) + .build(); } } else{ - List contentResponseDtoList = contentRepository.findAllList(size, offset); + List contentResponseDtoList = contentRepository.findAllList(size, offset); if (contentResponseDtoList.isEmpty()) { throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } } catch (Exception e) { @@ -54,7 +62,7 @@ public List getContentQuery(String query, int size, int page } @Override - public List getContentQueryWithLevel(String query, int level, int size, int page){ + public ContentResponseDto getContentQueryWithLevel(String query, int level, int size, int page){ List contentTableList = contentRepository.findAll(); if(contentTableList.isEmpty()) { throw new RuntimeException("등록된 컨텐츠가 없습니다."); @@ -62,18 +70,26 @@ public List getContentQueryWithLevel(String query, int level int offset = (page - 1) * size; try{ if(!query.equals("all")){ - List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); + List contentTableListAll = contentRepository.findAllByQueryContainingAndContentLevel(query, level); + List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); if(contentResponseDtoList.isEmpty()){ throw new RuntimeException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableListAll.size()) + .contentList(contentResponseDtoList) + .build(); } } else { - List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); + List contentTableListAll = contentRepository.findAllByContentLevel(level); + List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); if(contentResponseDtoList.isEmpty()){ throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableListAll.size()) + .contentList(contentResponseDtoList) + .build(); } } } catch (Exception e) { @@ -83,7 +99,7 @@ public List getContentQueryWithLevel(String query, int level } @Override - public List getContentWithUserId(String userId, String query, int level, int size, int page){ + public ContentResponseDto getContentWithUserId(String userId, String query, int level, int size, int page){ IdTable idTable = IdTableRepository.findById(userId).orElseThrow (() -> new RuntimeException("존재하지 않는 사용자입니다.")); if(idTable.getContentTable().isEmpty()) { @@ -92,32 +108,48 @@ public List getContentWithUserId(String userId, String query int offset = (page - 1) * size; try{ if(query.equals("all") && level == -1){ - List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserId(idTable); + List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } else if(!query.equals("all") && level == -1){ - List contentResponseDtoList = contentRepository.findAllByUserIdAndQueryContaining(userId, query, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserIdAndQueryContaining(idTable, query); + List contentResponseDtoList = contentRepository.findAllByUserIdAndQueryContaining(userId, query, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } else if(query.equals("all")){ - List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevel(userId, level, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserIdAndContentLevel(idTable, level); + List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevel(userId, level, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } else { - List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(userId, level, query, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(idTable, level, query); + List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(userId, level, query, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } } catch (CustomException e) { @@ -203,7 +235,7 @@ public TotalContentDto getTotalContent(String userId, int size, int page){ int totalContent = idTable.getContentTable().size(); int totalView = idTable.getContentTable().stream().mapToInt(ContentTable::getContentView).sum(); int totalLike = idTable.getContentTable().stream().mapToInt(ContentTable::getContentLike).sum(); - List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, pageable).stream().toList(); + List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, pageable).stream().toList(); return TotalContentDto.builder() .totalContent(totalContent) .totalView(totalView)