Skip to content

Commit

Permalink
feat: 페어룸 종료 시 페어룸 내 작업 불가능하게 검증 로직 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
JiHyeonL committed Oct 16, 2024
1 parent 58754d8 commit f77a872
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@
import site.coduo.pairroom.exception.DuplicatePairNameException;
import site.coduo.pairroom.exception.InvalidAccessCodeException;
import site.coduo.pairroom.exception.InvalidNameFormatException;
import site.coduo.pairroom.exception.InvalidPairRoomStatusException;
import site.coduo.pairroom.exception.OperateNotAllowedException;
import site.coduo.pairroom.exception.PairRoomException;
import site.coduo.pairroom.exception.PairRoomNotFoundException;
import site.coduo.pairroom.exception.InvalidPairRoomStatusException;

@Slf4j
@RestControllerAdvice
Expand Down Expand Up @@ -49,7 +50,8 @@ public ResponseEntity<ApiErrorResponse> handleInvalidPropertiesFormatException(
}

@ExceptionHandler(InvalidPairRoomStatusException.class)
public ResponseEntity<ApiErrorResponse> handlePairRoomStatusNotFoundException(final InvalidPairRoomStatusException e) {
public ResponseEntity<ApiErrorResponse> handlePairRoomStatusNotFoundException(
final InvalidPairRoomStatusException e) {
log.warn(e.getMessage());

return ResponseEntity.status(PairRoomApiError.INVALID_PROPERTIES_FORMAT.getHttpStatus())
Expand All @@ -64,6 +66,14 @@ public ResponseEntity<ApiErrorResponse> handlePairRoomNotFoundException(final Pa
.body(new ApiErrorResponse(PairRoomApiError.PAIR_ROOM_NOT_FOUND.getMessage()));
}

@ExceptionHandler(OperateNotAllowedException.class)
public ResponseEntity<ApiErrorResponse> handleOperateNotAllowedException(final OperateNotAllowedException e) {
log.warn(e.getMessage());

return ResponseEntity.status(PairRoomApiError.NOT_OPERATE_PAIR_ROOM.getHttpStatus())
.body(new ApiErrorResponse(PairRoomApiError.NOT_OPERATE_PAIR_ROOM.getMessage()));
}

@ExceptionHandler(PairRoomException.class)
public ResponseEntity<ApiErrorResponse> handlePairRoomException(final PairRoomException e) {
log.warn(e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ public enum PairRoomApiError {
INVALID_PAIR_NAME(HttpStatus.BAD_REQUEST, "올바르지 않은 페어 이름입니다."),
INVALID_ACCESS_CODE(HttpStatus.BAD_REQUEST, "올바르지 않은 접근 코드입니다."),
PAIR_ROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "페어룸이 존재하지 않습니다."),
INVALID_PROPERTIES_FORMAT(HttpStatus.BAD_REQUEST, "올바르지 않은 데이터 형식입니다.");
INVALID_PROPERTIES_FORMAT(HttpStatus.BAD_REQUEST, "올바르지 않은 데이터 형식입니다."),
NOT_OPERATE_PAIR_ROOM(HttpStatus.BAD_REQUEST, "페어룸이 종료된 상태이므로 해당 요청을 수행할 수 없습니다.");

private final HttpStatus httpStatus;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ public class PairRoom {
private final MissionUrl missionUrl;
private final AccessCode accessCode;

public boolean isCompleted() {
return status == PairRoomStatus.COMPLETED;
}

public String getAccessCodeText() {
return accessCode.getValue();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package site.coduo.pairroom.exception;

public class OperateNotAllowedException extends PairRoomException {

public OperateNotAllowedException(final String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;
import site.coduo.pairroom.domain.PairRoom;
import site.coduo.pairroom.domain.accesscode.AccessCode;
import site.coduo.pairroom.exception.OperateNotAllowedException;
import site.coduo.pairroom.repository.PairRoomEntity;
import site.coduo.pairroom.repository.PairRoomRepository;
import site.coduo.referencelink.domain.Category;
Expand Down Expand Up @@ -41,21 +43,17 @@ public List<CategoryReadResponse> findAllByPairRoomAccessCode(final String acces

public CategoryCreateResponse createCategory(final String accessCode, final CategoryCreateRequest request) {
final PairRoomEntity pairRoomEntity = pairRoomRepository.fetchByAccessCode(new AccessCode(accessCode));
validateOperationAllow(pairRoomEntity.toDomain());
validateDuplicated(request.value(), pairRoomEntity);
final CategoryEntity categoryEntity = categoryRepository.save(
new CategoryEntity(pairRoomEntity, new Category(request.value())));

return CategoryCreateResponse.from(categoryEntity);
}

private void validateDuplicated(final String categoryName, final PairRoomEntity pairRoomEntity) {
if (categoryRepository.existsByCategoryNameAndPairRoomEntity(categoryName, pairRoomEntity)) {
throw new InvalidCategoryException("중복된 이름의 카테고리가 이미 존재합니다.");
}
}

public CategoryUpdateResponse updateCategoryName(final String accessCode, final CategoryUpdateRequest request) {
final PairRoomEntity pairRoomEntity = pairRoomRepository.fetchByAccessCode(new AccessCode(accessCode));
validateOperationAllow(pairRoomEntity.toDomain());
validateDuplicated(request.updatedCategoryName(), pairRoomEntity);
final CategoryEntity category = categoryRepository.fetchByPairRoomAndCategoryId(pairRoomEntity,
request.categoryId());
Expand All @@ -65,11 +63,24 @@ public CategoryUpdateResponse updateCategoryName(final String accessCode, final

public void deleteCategory(final String accessCode, final Long categoryId) {
final PairRoomEntity pairRoomEntity = pairRoomRepository.fetchByAccessCode(new AccessCode(accessCode));
validateOperationAllow(pairRoomEntity.toDomain());
if (categoryRepository.existsByIdAndPairRoomEntity(categoryId, pairRoomEntity)) {
final List<ReferenceLinkEntity> referenceLinks = referenceLinkService.findReferenceLinksEntityByCategory(
accessCode, categoryId);
referenceLinks.forEach(ReferenceLinkEntity::updateCategoryToNull);
categoryRepository.deleteCategoryByPairRoomEntityAndId(pairRoomEntity, categoryId);
}
}

private void validateOperationAllow(final PairRoom pairRoom) {
if (pairRoom.isCompleted()) {
throw new OperateNotAllowedException("페어룸이 COMPLETED(종료) 상태이기 때문에 카테고리를 조작할 수 없습니다.");
}
}

private void validateDuplicated(final String categoryName, final PairRoomEntity pairRoomEntity) {
if (categoryRepository.existsByCategoryNameAndPairRoomEntity(categoryName, pairRoomEntity)) {
throw new InvalidCategoryException("중복된 이름의 카테고리가 이미 존재합니다.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import site.coduo.pairroom.domain.PairRoom;
import site.coduo.pairroom.domain.accesscode.AccessCode;
import site.coduo.pairroom.exception.OperateNotAllowedException;
import site.coduo.pairroom.repository.PairRoomEntity;
import site.coduo.pairroom.repository.PairRoomRepository;
import site.coduo.referencelink.domain.Category;
Expand Down Expand Up @@ -38,6 +40,7 @@ public ReferenceLinkResponse createReferenceLink(final String accessCodeText,
final ReferenceLinkCreateRequest request) {
final AccessCode accessCode = new AccessCode(accessCodeText);
final PairRoomEntity pairRoomEntity = pairRoomRepository.fetchByAccessCode(accessCode);
validateOperationAllow(pairRoomEntity.toDomain());
final URL url = makeUrl(request.url());
final ReferenceLink referenceLink = new ReferenceLink(url, accessCode);

Expand Down Expand Up @@ -119,9 +122,16 @@ private ReferenceLinkResponse makeReferenceLinkResponse(final ReferenceLinkEntit

public void deleteReferenceLink(final String accessCodeText, final long id) {
final ReferenceLinkEntity referenceLinkEntity = referenceLinkRepository.fetchById(id);
validateOperationAllow(referenceLinkEntity.getPairRoomEntity().toDomain());
if (referenceLinkEntity.isSameAccessCode(new AccessCode(accessCodeText))) {
openGraphService.deleteByReferenceLink(referenceLinkEntity);
referenceLinkRepository.delete(referenceLinkEntity);
}
}

private void validateOperationAllow(final PairRoom pairRoom) {
if (pairRoom.isCompleted()) {
throw new OperateNotAllowedException("페어룸이 COMPLETED(종료) 상태이기 때문에 카테고리를 조작할 수 없습니다.");
}
}
}
23 changes: 18 additions & 5 deletions backend/src/main/java/site/coduo/todo/service/TodoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;
import site.coduo.pairroom.domain.PairRoom;
import site.coduo.pairroom.exception.OperateNotAllowedException;
import site.coduo.pairroom.exception.PairRoomNotFoundException;
import site.coduo.pairroom.repository.PairRoomEntity;
import site.coduo.pairroom.repository.PairRoomRepository;
Expand Down Expand Up @@ -38,11 +40,12 @@ public List<Todo> getAllOrderBySort(final String accessCode) {
}

public void createTodo(final String accessCode, final String content) {
final PairRoomEntity pairRoom = pairRoomRepository.findByAccessCode(accessCode)
final PairRoomEntity pairRoomEntity = pairRoomRepository.findByAccessCode(accessCode)
.orElseThrow(() -> new PairRoomNotFoundException("해당 Access Code의 페어룸은 존재하지 않습니다. - " + accessCode));
final TodoSort nextToLastSort = getLastTodoSort(pairRoom);
validateOperationAllow(pairRoomEntity.toDomain());
final TodoSort nextToLastSort = getLastTodoSort(pairRoomEntity);
final Todo todo = new Todo(null, content, nextToLastSort.getSort(), INITIAL_TODO_CHECKED);
final TodoEntity todoEntity = new TodoEntity(todo, pairRoom);
final TodoEntity todoEntity = new TodoEntity(todo, pairRoomEntity);

todoRepository.save(todoEntity);
}
Expand All @@ -57,19 +60,20 @@ private TodoSort getLastTodoSort(final PairRoomEntity pairRoom) {

public void updateTodoContent(final Long todoId, final String content) {
final TodoEntity todoEntity = todoRepository.fetchById(todoId);

validateOperationAllow(todoEntity.getPairRoomEntity().toDomain());
todoEntity.updateContent(content);
}

public void toggleTodoChecked(final Long todoId) {
final TodoEntity todoEntity = todoRepository.fetchById(todoId);

validateOperationAllow(todoEntity.getPairRoomEntity().toDomain());
todoEntity.toggleTodoChecked();
}

public void updateTodoSort(final Long targetTodoId, final int destinationSort) {
final TodoEntity targetTodo = todoRepository.findById(targetTodoId)
.orElseThrow(() -> new TodoNotFoundException("존재하지 않은 todo id입니다." + targetTodoId));
validateOperationAllow(targetTodo.getPairRoomEntity().toDomain());
final List<Todo> allByPairRoom = todoRepository
.findAllByPairRoomEntityOrderBySortAsc(targetTodo.getPairRoomEntity())
.stream()
Expand All @@ -82,6 +86,15 @@ public void updateTodoSort(final Long targetTodoId, final int destinationSort) {
}

public void deleteTodo(final Long todoId) {
final TodoEntity todoEntity = todoRepository.findById(todoId)
.orElseThrow(() -> new TodoNotFoundException("존재하지 않은 todo id입니다." + todoId));
validateOperationAllow(todoEntity.getPairRoomEntity().toDomain());
todoRepository.deleteById(todoId);
}

private void validateOperationAllow(final PairRoom pairRoom) {
if (pairRoom.isCompleted()) {
throw new OperateNotAllowedException("페어룸이 COMPLETED(종료) 상태이기 때문에 카테고리를 조작할 수 없습니다.");
}
}
}

0 comments on commit f77a872

Please sign in to comment.