Skip to content

Commit

Permalink
Feat/#69 fix 스페이스 떠나기 요청방식변경 (#71)
Browse files Browse the repository at this point in the history
* fix: 스페이스 떠나기 요청방식변경

* fix: 자잘한 이슈 수정
  • Loading branch information
raymondanythings authored Aug 1, 2024
1 parent b7c4a57 commit 356edd4
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 136 deletions.
Original file line number Diff line number Diff line change
@@ -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<Void> createRetrospect(@PathVariable("spaceId") Long spaceId,
@RequestBody @Valid RetrospectCreateRequest request, @MemberId Long memberId);
@Operation(summary = "회고 생성", description = "회고 생성 이후 생성된 회고의 아이디를 응답합니다.")
ResponseEntity<RetrospectCreateResponse> createRetrospect(@PathVariable("spaceId") Long spaceId,
@RequestBody @Valid RetrospectCreateRequest request, @MemberId Long memberId);

@Operation(summary = "회고 목록 조회", description = "특정 팀 스페이스에서 작성했던 회고 목록을 보는 기능입니다.")
ResponseEntity<RetrospectListGetResponse> getRetrospects(@PathVariable("spaceId") Long spaceId, @MemberId Long memberId);
@Operation(summary = "회고 목록 조회", description = "특정 팀 스페이스에서 작성했던 회고 목록을 보는 기능입니다.")
ResponseEntity<RetrospectListGetResponse> getRetrospects(@PathVariable("spaceId") Long spaceId, @MemberId Long memberId);
}
Original file line number Diff line number Diff line change
@@ -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<Void> createRetrospect(
@PathVariable("spaceId") Long spaceId,
@RequestBody @Valid RetrospectCreateRequest request,
@MemberId Long memberId) {
@Override
@PostMapping
@PreAuthorize("isAuthenticated()")
public ResponseEntity<RetrospectCreateResponse> 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<RetrospectListGetResponse> getRetrospects(@PathVariable("spaceId") Long spaceId,
@MemberId Long memberId) {
@Override
@GetMapping
@PreAuthorize("isAuthenticated()")
public ResponseEntity<RetrospectListGetResponse> getRetrospects(@PathVariable("spaceId") Long spaceId,
@MemberId Long memberId) {

RetrospectListGetServiceResponse serviceResponse = retrospectService.getRetrospects(spaceId, memberId);
RetrospectListGetServiceResponse serviceResponse = retrospectService.getRetrospects(spaceId, memberId);

List<RetrospectGetResponse> retrospectGetResponses = serviceResponse.retrospects().stream()
.map(r -> RetrospectGetResponse.of(r.retrospectId(), r.title(), r.introduction(), r.isWrite(), r.retrospectStatus(),
r.writeCount(), r.totalCount()))
.toList();
List<RetrospectGetResponse> 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));
}

}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Question> 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<Question> 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<Retrospect> retrospects = retrospectRepository.findAllBySpaceId(spaceId);
List<Long> retrospectIds = retrospects.stream().map(Retrospect::getId).toList();
Answers answers = new Answers(answerRepository.findAllByRetrospectIdIn(retrospectIds));

List<RetrospectGetServiceResponse> 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<MemberSpaceRelation> team = memberSpaceRelationRepository.findBySpaceIdAndMemberId(
request, memberId);
if (team.isEmpty()) {
throw new MemberSpaceRelationException(NOT_FOUND_MEMBER_SPACE_RELATION);
}
}

private List<Question> getQuestions(List<QuestionCreateRequest> 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<Question> 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<Question> 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<Retrospect> retrospects = retrospectRepository.findAllBySpaceId(spaceId);
List<Long> retrospectIds = retrospects.stream().map(Retrospect::getId).toList();
Answers answers = new Answers(answerRepository.findAllByRetrospectIdIn(retrospectIds));

List<RetrospectGetServiceResponse> 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<MemberSpaceRelation> team = memberSpaceRelationRepository.findBySpaceIdAndMemberId(
request, memberId);
if (team.isEmpty()) {
throw new MemberSpaceRelationException(NOT_FOUND_MEMBER_SPACE_RELATION);
}
}

private List<Question> getQuestions(List<QuestionCreateRequest> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}

0 comments on commit 356edd4

Please sign in to comment.