Skip to content

Commit

Permalink
feat: 스페이스 아이디로 진행 중 회고에 실행 목표 추가 (#169)
Browse files Browse the repository at this point in the history
  • Loading branch information
clean2001 authored Aug 19, 2024
1 parent cc0b052 commit 8759c3b
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.layer.common.annotation.MemberId;
import org.layer.domain.actionItem.controller.dto.request.ActionItemCreateBySpaceIdRequest;
import org.layer.domain.actionItem.controller.dto.request.ActionItemCreateRequest;
import org.layer.domain.actionItem.controller.dto.request.ActionItemUpdateRequest;
import org.layer.domain.actionItem.controller.dto.response.MemberActionItemGetResponse;
Expand Down Expand Up @@ -105,4 +106,14 @@ ResponseEntity<SpaceActionItemGetResponse> spaceRecentActionItem(@MemberId Long
ResponseEntity<Void> updateActionItem(@MemberId Long memberId,
@PathVariable("retrospectId") Long retrospectId,
@RequestBody ActionItemUpdateRequest actionItemUpdateRequest);

@Operation(summary = "스페이스 아이디로 실행 목표 생성", method = "POST", description = """
특정 스페이스에서 "실행 중"인 회고(=가장 최근 종료된 회고)
""")
@ApiResponses({
@ApiResponse(responseCode = "201")
}
)
ResponseEntity<Void> createActionItemBySpaceId(@MemberId Long memberId,
@Validated @RequestBody ActionItemCreateBySpaceIdRequest actionItemCreateRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.layer.common.annotation.MemberId;
import org.layer.domain.actionItem.controller.dto.request.ActionItemCreateBySpaceIdRequest;
import org.layer.domain.actionItem.controller.dto.request.ActionItemCreateRequest;
import org.layer.domain.actionItem.controller.dto.request.ActionItemUpdateRequest;
import org.layer.domain.actionItem.controller.dto.response.MemberActionItemGetResponse;
Expand Down Expand Up @@ -74,4 +75,16 @@ public ResponseEntity<Void> updateActionItem(@MemberId Long memberId,
actionItemService.updateActionItems(memberId, retrospectId, actionItemUpdateRequest);
return new ResponseEntity<>(null, HttpStatus.OK);
}

@Override
@PostMapping("/create/space/{spaceId}")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<Void> createActionItemBySpaceId(@MemberId Long memberId,
@Validated @RequestBody ActionItemCreateBySpaceIdRequest actionItemCreateRequest) {
actionItemService.createActionItemBySpaceId(memberId,
actionItemCreateRequest.spaceId(),
actionItemCreateRequest.content());

return new ResponseEntity<>(null, HttpStatus.CREATED);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.layer.domain.actionItem.controller.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

@Schema(description = "실행 목표 생성 요청 dto")
public record ActionItemCreateBySpaceIdRequest(@NotNull
@Schema(description = "액션 아이템과 매핑되는 회고 ID")
Long spaceId,
@NotNull
@Schema(description = "액션 아이템 내용")
@NotNull String content) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.layer.common.exception.ActionItemExceptionType;
import org.layer.domain.actionItem.controller.dto.request.ActionItemUpdateRequest;
import org.layer.domain.actionItem.controller.dto.response.MemberActionItemGetResponse;
import org.layer.domain.actionItem.controller.dto.response.RetrospectActionItemResponse;
Expand Down Expand Up @@ -32,7 +31,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

import static org.layer.common.exception.ActionItemExceptionType.INVALID_ACTION_ITEM_LIST;
import static org.layer.common.exception.ActionItemExceptionType.*;
import static org.layer.common.exception.MemberSpaceRelationExceptionType.NOT_FOUND_MEMBER_SPACE_RELATION;
import static org.layer.domain.retrospect.entity.RetrospectStatus.DONE;

Expand Down Expand Up @@ -69,6 +68,38 @@ public void createActionItem(Long memberId, Long retrospectId, String content) {
.build());
}

@Transactional
public void createActionItemBySpaceId(Long memberId, Long spaceId, String content) {
// 만드는 사람이 스페이스 리더인지 확인
Space space = spaceRepository.findByIdOrThrow(spaceId);
space.isLeaderSpace(memberId);

// 가장 최근 실행 목표 찾기
Optional<Retrospect> retrospectOpt = retrospectRepository.findAllBySpaceId(spaceId)
.stream()
.filter(retrospect -> retrospect.getRetrospectStatus().equals(DONE))
.sorted((a, b) -> b.getDeadline().compareTo(a.getDeadline()))
.findFirst();

if(retrospectOpt.isEmpty()) { // "실행 중" 회고가 존재하지 않음
throw new ActionItemException(NO_PROCEEDING_ACTION_ITEMS);
}

Retrospect retrospect = retrospectOpt.get();

// order 설정을 위해 회고 아이디로 실행 목표 개수 찾기
int actionItemCount = actionItemRepository.countByRetrospectId(retrospect.getId());

// 액션 아이템 생성
actionItemRepository.save(ActionItem.builder()
.retrospectId(retrospect.getId())
.spaceId(retrospect.getSpaceId())
.memberId(memberId)
.content(content)
.actionItemOrder(actionItemCount + 1)
.build());
}


//== 스페이스의 액션 아이템 조회 ==//
public SpaceRetrospectActionItemGetResponse getSpaceActionItemList(Long memberId, Long spaceId) {
Expand Down Expand Up @@ -228,7 +259,7 @@ public void updateActionItems(Long memberId, Long retrospectId, ActionItemUpdate
for(ActionItemUpdateRequest.ActionItemUpdateElementRequest updateItem : updateDto.actionItems()) {
ActionItem actionItem = actionItemMap.getOrDefault(updateItem.getId(), null);
if(actionItem == null) {
throw new ActionItemException(ActionItemExceptionType.INVALID_ACTION_ITEM_ID);
throw new ActionItemException(INVALID_ACTION_ITEM_ID);
}
actionItem.updateContent(updateItem.getContent());
actionItem.updateActionItemOrder(order.getAndIncrement());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
public enum ActionItemExceptionType implements ExceptionType{
NOT_FOUND_ACTION_ITEM(HttpStatus.NOT_FOUND, "실행 목표가 존재하지 않습니다."),
INVALID_ACTION_ITEM_ID(HttpStatus.BAD_REQUEST, "잘못된 실행 목표 id입니다."),
INVALID_ACTION_ITEM_LIST(HttpStatus.BAD_REQUEST, "잘못된 실행 목표 리스트입니다.");
INVALID_ACTION_ITEM_LIST(HttpStatus.BAD_REQUEST, "잘못된 실행 목표 리스트입니다."),
NO_PROCEEDING_ACTION_ITEMS(HttpStatus.BAD_REQUEST, "해당 스페이스에 실행 중인 실행 목표 회고가 존재하지 않습니다.");


private final HttpStatus status;
Expand Down

0 comments on commit 8759c3b

Please sign in to comment.