From 356edd4badff4fc162738e6c84ec16d2d4432616 Mon Sep 17 00:00:00 2001 From: Raymond Date: Fri, 2 Aug 2024 02:12:31 +0900 Subject: [PATCH] =?UTF-8?q?Feat/#69=20fix=20=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EB=96=A0=EB=82=98=EA=B8=B0=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EB=B3=80=EA=B2=BD=20(#71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 스페이스 떠나기 요청방식변경 * fix: 자잘한 이슈 수정 --- .../retrospect/controller/RetrospectApi.java | 18 +- .../controller/RetrospectController.java | 64 +++--- .../response/RetrospectCreateResponse.java | 14 ++ .../retrospect/service/RetrospectService.java | 182 +++++++++--------- .../controller/dto/AllTemplatesRequest.java | 10 +- 5 files changed, 152 insertions(+), 136 deletions(-) create mode 100644 layer-api/src/main/java/org/layer/domain/retrospect/controller/dto/response/RetrospectCreateResponse.java diff --git a/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectApi.java b/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectApi.java index d9cbe3df..ee4ee255 100644 --- a/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectApi.java +++ b/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectApi.java @@ -1,23 +1,23 @@ package org.layer.domain.retrospect.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import org.layer.common.annotation.MemberId; import org.layer.domain.retrospect.controller.dto.request.RetrospectCreateRequest; +import org.layer.domain.retrospect.controller.dto.response.RetrospectCreateResponse; import org.layer.domain.retrospect.controller.dto.response.RetrospectListGetResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; - @Tag(name = "회고", description = "회고 관련 API") public interface RetrospectApi { - @Operation(summary = "회고 생성", description = "") - ResponseEntity createRetrospect(@PathVariable("spaceId") Long spaceId, - @RequestBody @Valid RetrospectCreateRequest request, @MemberId Long memberId); + @Operation(summary = "회고 생성", description = "회고 생성 이후 생성된 회고의 아이디를 응답합니다.") + ResponseEntity createRetrospect(@PathVariable("spaceId") Long spaceId, + @RequestBody @Valid RetrospectCreateRequest request, @MemberId Long memberId); - @Operation(summary = "회고 목록 조회", description = "특정 팀 스페이스에서 작성했던 회고 목록을 보는 기능입니다.") - ResponseEntity getRetrospects(@PathVariable("spaceId") Long spaceId, @MemberId Long memberId); + @Operation(summary = "회고 목록 조회", description = "특정 팀 스페이스에서 작성했던 회고 목록을 보는 기능입니다.") + ResponseEntity getRetrospects(@PathVariable("spaceId") Long spaceId, @MemberId Long memberId); } diff --git a/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectController.java b/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectController.java index e7fb16d2..cbd2625e 100644 --- a/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectController.java +++ b/layer-api/src/main/java/org/layer/domain/retrospect/controller/RetrospectController.java @@ -1,61 +1,55 @@ package org.layer.domain.retrospect.controller; -import java.util.List; - +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import org.layer.common.annotation.MemberId; import org.layer.domain.retrospect.controller.dto.request.RetrospectCreateRequest; +import org.layer.domain.retrospect.controller.dto.response.RetrospectCreateResponse; import org.layer.domain.retrospect.controller.dto.response.RetrospectGetResponse; import org.layer.domain.retrospect.controller.dto.response.RetrospectListGetResponse; import org.layer.domain.retrospect.service.RetrospectService; -import org.layer.domain.retrospect.service.dto.request.RetrospectCreateServiceRequest; import org.layer.domain.retrospect.service.dto.response.RetrospectListGetServiceResponse; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; +import java.util.List; @RestController @RequiredArgsConstructor @RequestMapping("/space/{spaceId}/retrospect") public class RetrospectController implements RetrospectApi { - private final RetrospectService retrospectService; + private final RetrospectService retrospectService; - @Override - @PostMapping - @PreAuthorize("isAuthenticated()") - public ResponseEntity createRetrospect( - @PathVariable("spaceId") Long spaceId, - @RequestBody @Valid RetrospectCreateRequest request, - @MemberId Long memberId) { + @Override + @PostMapping + @PreAuthorize("isAuthenticated()") + public ResponseEntity createRetrospect( + @PathVariable("spaceId") Long spaceId, + @RequestBody @Valid RetrospectCreateRequest request, + @MemberId Long memberId) { - retrospectService.createRetrospect(request, spaceId, memberId); + var newRetrospectId = retrospectService.createRetrospect(request, spaceId, memberId); - return ResponseEntity.ok().build(); - } + return ResponseEntity.ok().body(RetrospectCreateResponse.of(newRetrospectId)); + } - @Override - @GetMapping - @PreAuthorize("isAuthenticated()") - public ResponseEntity getRetrospects(@PathVariable("spaceId") Long spaceId, - @MemberId Long memberId) { + @Override + @GetMapping + @PreAuthorize("isAuthenticated()") + public ResponseEntity getRetrospects(@PathVariable("spaceId") Long spaceId, + @MemberId Long memberId) { - RetrospectListGetServiceResponse serviceResponse = retrospectService.getRetrospects(spaceId, memberId); + RetrospectListGetServiceResponse serviceResponse = retrospectService.getRetrospects(spaceId, memberId); - List retrospectGetResponses = serviceResponse.retrospects().stream() - .map(r -> RetrospectGetResponse.of(r.retrospectId(), r.title(), r.introduction(), r.isWrite(), r.retrospectStatus(), - r.writeCount(), r.totalCount())) - .toList(); + List retrospectGetResponses = serviceResponse.retrospects().stream() + .map(r -> RetrospectGetResponse.of(r.retrospectId(), r.title(), r.introduction(), r.isWrite(), r.retrospectStatus(), + r.writeCount(), r.totalCount())) + .toList(); - return ResponseEntity.ok() - .body(RetrospectListGetResponse.of(serviceResponse.layerCount(), retrospectGetResponses)); - } + return ResponseEntity.ok() + .body(RetrospectListGetResponse.of(serviceResponse.layerCount(), retrospectGetResponses)); + } } diff --git a/layer-api/src/main/java/org/layer/domain/retrospect/controller/dto/response/RetrospectCreateResponse.java b/layer-api/src/main/java/org/layer/domain/retrospect/controller/dto/response/RetrospectCreateResponse.java new file mode 100644 index 00000000..f449c27a --- /dev/null +++ b/layer-api/src/main/java/org/layer/domain/retrospect/controller/dto/response/RetrospectCreateResponse.java @@ -0,0 +1,14 @@ +package org.layer.domain.retrospect.controller.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(name = "RetrospectCreateResponse", description = "회고 생성 응답 DTO") +public record RetrospectCreateResponse( + @Schema(description = "회고 id", example = "1") + Long retrospectId +) { + public static RetrospectCreateResponse of(Long retrospectId) { + + return new RetrospectCreateResponse(retrospectId); + } +} diff --git a/layer-api/src/main/java/org/layer/domain/retrospect/service/RetrospectService.java b/layer-api/src/main/java/org/layer/domain/retrospect/service/RetrospectService.java index e605c2de..1848d922 100644 --- a/layer-api/src/main/java/org/layer/domain/retrospect/service/RetrospectService.java +++ b/layer-api/src/main/java/org/layer/domain/retrospect/service/RetrospectService.java @@ -1,11 +1,6 @@ package org.layer.domain.retrospect.service; -import static org.layer.common.exception.MemberSpaceRelationExceptionType.*; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; - +import lombok.RequiredArgsConstructor; import org.layer.domain.answer.entity.Answers; import org.layer.domain.answer.repository.AnswerRepository; import org.layer.domain.form.entity.Form; @@ -31,95 +26,100 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import lombok.RequiredArgsConstructor; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.layer.common.exception.MemberSpaceRelationExceptionType.NOT_FOUND_MEMBER_SPACE_RELATION; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class RetrospectService { - private final RetrospectRepository retrospectRepository; - private final MemberSpaceRelationRepository memberSpaceRelationRepository; - private final QuestionRepository questionRepository; - private final AnswerRepository answerRepository; - private final FormRepository formRepository; - private final SpaceRepository spaceRepository; - - @Transactional - public void createRetrospect(RetrospectCreateRequest request, Long spaceId, Long memberId) { - // 해당 스페이스 팀원인지 검증 - Team team = new Team(memberSpaceRelationRepository.findAllBySpaceId(spaceId)); - team.validateTeamMembership(memberId); - - Retrospect retrospect = getRetrospect(request, spaceId); - Retrospect savedRetrospect = retrospectRepository.save(retrospect); - - List questions = getQuestions(request.questions(), savedRetrospect.getId(), null); - questionRepository.saveAll(questions); - - // 새로운 폼 생성(수정)인지 확인 - if (request.isNewForm()) { - // 내 회고 폼에 추가 - Form form = new Form(memberId, spaceId, request.title(), request.introduction(), FormType.CUSTOM); - Form savedForm = formRepository.save(form); - - List myQuestions = getQuestions(request.questions(), null, savedForm.getId()); - questionRepository.saveAll(myQuestions); - - // 해당 스페이스의 기본 폼 변경 - Space space = spaceRepository.findByIdOrThrow(spaceId); - space.updateFormId(savedForm.getId(), memberId); - } - } - - private Retrospect getRetrospect(RetrospectCreateRequest request, Long spaceId) { - return Retrospect.builder() - .spaceId(spaceId) - .title(request.title()) - .introduction(request.introduction()) - .retrospectStatus(RetrospectStatus.PROCEEDING) - .deadline(request.deadline()) - .build(); - } - - public RetrospectListGetServiceResponse getRetrospects(Long spaceId, Long memberId) { - // 해당 스페이스 팀원인지 검증 - Team team = new Team(memberSpaceRelationRepository.findAllBySpaceId(spaceId)); - team.validateTeamMembership(memberId); - - List retrospects = retrospectRepository.findAllBySpaceId(spaceId); - List retrospectIds = retrospects.stream().map(Retrospect::getId).toList(); - Answers answers = new Answers(answerRepository.findAllByRetrospectIdIn(retrospectIds)); - - List retrospectDtos = retrospects.stream() - .map(r -> RetrospectGetServiceResponse.of(r.getId(), r.getTitle(), r.getIntroduction(), - answers.hasRetrospectAnswer(memberId, r.getId()), r.getRetrospectStatus(), - answers.getWriteCount(r.getId()), team.getTeamMemberCount())) - .toList(); - - return RetrospectListGetServiceResponse.of(retrospects.size(), retrospectDtos); - } - - private void validateTeamMember(Long request, Long memberId) { - Optional team = memberSpaceRelationRepository.findBySpaceIdAndMemberId( - request, memberId); - if (team.isEmpty()) { - throw new MemberSpaceRelationException(NOT_FOUND_MEMBER_SPACE_RELATION); - } - } - - private List getQuestions(List questions, Long savedRetrospectId, Long formId) { - AtomicInteger index = new AtomicInteger(1); - - return questions.stream() - .map(question -> Question.builder() - .retrospectId(savedRetrospectId) - .formId(formId) - .content(question.questionContent()) - .questionOrder(index.getAndIncrement()) - .questionOwner(QuestionOwner.TEAM) - .questionType(QuestionType.stringToEnum(question.questionType())) - .build()) - .toList(); - } + private final RetrospectRepository retrospectRepository; + private final MemberSpaceRelationRepository memberSpaceRelationRepository; + private final QuestionRepository questionRepository; + private final AnswerRepository answerRepository; + private final FormRepository formRepository; + private final SpaceRepository spaceRepository; + + @Transactional + public Long createRetrospect(RetrospectCreateRequest request, Long spaceId, Long memberId) { + // 해당 스페이스 팀원인지 검증 + Team team = new Team(memberSpaceRelationRepository.findAllBySpaceId(spaceId)); + team.validateTeamMembership(memberId); + + Retrospect retrospect = getRetrospect(request, spaceId); + Retrospect savedRetrospect = retrospectRepository.save(retrospect); + + List questions = getQuestions(request.questions(), savedRetrospect.getId(), null); + questionRepository.saveAll(questions); + + // 새로운 폼 생성(수정)인지 확인 + if (request.isNewForm()) { + // 내 회고 폼에 추가 + Form form = new Form(memberId, spaceId, request.title(), request.introduction(), FormType.CUSTOM); + Form savedForm = formRepository.save(form); + + List myQuestions = getQuestions(request.questions(), null, savedForm.getId()); + questionRepository.saveAll(myQuestions); + + // 해당 스페이스의 기본 폼 변경 + Space space = spaceRepository.findByIdOrThrow(spaceId); + space.updateFormId(savedForm.getId(), memberId); + } + return savedRetrospect.getId(); + } + + private Retrospect getRetrospect(RetrospectCreateRequest request, Long spaceId) { + return Retrospect.builder() + .spaceId(spaceId) + .title(request.title()) + .introduction(request.introduction()) + .retrospectStatus(RetrospectStatus.PROCEEDING) + .deadline(request.deadline()) + .build(); + } + + public RetrospectListGetServiceResponse getRetrospects(Long spaceId, Long memberId) { + // 해당 스페이스 팀원인지 검증 + Team team = new Team(memberSpaceRelationRepository.findAllBySpaceId(spaceId)); + team.validateTeamMembership(memberId); + + List retrospects = retrospectRepository.findAllBySpaceId(spaceId); + List retrospectIds = retrospects.stream().map(Retrospect::getId).toList(); + Answers answers = new Answers(answerRepository.findAllByRetrospectIdIn(retrospectIds)); + + List retrospectDtos = retrospects.stream() + .map(r -> RetrospectGetServiceResponse.of(r.getId(), r.getTitle(), r.getIntroduction(), + answers.hasRetrospectAnswer(memberId, r.getId()), r.getRetrospectStatus(), + answers.getWriteCount(r.getId()), team.getTeamMemberCount())) + .toList(); + + return RetrospectListGetServiceResponse.of(retrospects.size(), retrospectDtos); + } + + private void validateTeamMember(Long request, Long memberId) { + Optional team = memberSpaceRelationRepository.findBySpaceIdAndMemberId( + request, memberId); + if (team.isEmpty()) { + throw new MemberSpaceRelationException(NOT_FOUND_MEMBER_SPACE_RELATION); + } + } + + private List getQuestions(List questions, Long savedRetrospectId, Long formId) { + AtomicInteger index = new AtomicInteger(1); + + return questions.stream() + .map(question -> Question.builder() + .retrospectId(savedRetrospectId) + .formId(formId) + .content(question.questionContent()) + .questionOrder(index.getAndIncrement()) + .questionOwner(QuestionOwner.TEAM) + .questionType(QuestionType.stringToEnum(question.questionType())) + .build()) + .toList(); + } } diff --git a/layer-api/src/main/java/org/layer/domain/template/controller/dto/AllTemplatesRequest.java b/layer-api/src/main/java/org/layer/domain/template/controller/dto/AllTemplatesRequest.java index ab59c291..620e70a7 100644 --- a/layer-api/src/main/java/org/layer/domain/template/controller/dto/AllTemplatesRequest.java +++ b/layer-api/src/main/java/org/layer/domain/template/controller/dto/AllTemplatesRequest.java @@ -3,6 +3,14 @@ import io.swagger.v3.oas.annotations.media.Schema; @Schema -public record AllTemplatesRequest(@Schema(description = "페이지 번호(0번부터 시작)") int page, +public record AllTemplatesRequest(@Schema(description = "페이지 번호(1번부터 시작)") int page, @Schema(description = "한 페이지에 보여줄 개수") int size) { + public AllTemplatesRequest { + if (page <= 0) { + page = 1; + } + if (size <= 0) { + size = 1; + } + } }