From 47b0f94386c52196bb7054e83881b13eaee66c0e Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 19:10:23 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[Feat]=20#231=20-=20UserService=20Validat?= =?UTF-8?q?or=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/moonshot/user/service/UserService.java | 12 ++++++------ .../user/service/validator/UserValidator.java | 11 +++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java index ce627c0d..980ea377 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java @@ -1,5 +1,6 @@ package org.moonshot.user.service; +import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; import static org.moonshot.util.MDCUtil.USER_REQUEST_ORIGIN; import static org.moonshot.util.MDCUtil.get; @@ -143,18 +144,23 @@ public TokenResponse reissue(final String refreshToken) { } public void logout(final Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(UserNotFoundException::new); + validateUserAuthorization(user.getId(), userId); jwtTokenProvider.deleteRefreshToken(userId); } public void withdrawal(final Long userId) { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); + validateUserAuthorization(user.getId(), userId); user.setDeleteAt(); } public void modifyProfile(final Long userId, final UserInfoRequest request) { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); + validateUserAuthorization(user.getId(), userId); if (request.nickname() != null) { user.modifyNickname(request.nickname()); } @@ -163,12 +169,6 @@ public void modifyProfile(final Long userId, final UserInfoRequest request) { } } - public void validateUserAuthorization(final User user, final Long userId) { - if (!user.getId().equals(userId)) { - throw new AccessDeniedException(); - } - } - public UserInfoResponse getMyProfile(final Long userId) { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java b/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java new file mode 100644 index 00000000..40576226 --- /dev/null +++ b/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java @@ -0,0 +1,11 @@ +package org.moonshot.user.service.validator; + +import org.moonshot.exception.global.auth.AccessDeniedException; + +public class UserValidator { + public static void validateUserAuthorization(final Long userEntityId, final Long userId) { + if (!userEntityId.equals(userId)) { + throw new AccessDeniedException(); + } + } +} From d953e2f0ced14d203e68ca18e18d2cbcf2040bcf Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 19:20:02 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[Chore]=20#231=20-=20Objective,=20KeyResu?= =?UTF-8?q?lt=20User=EA=B4=80=EB=A0=A8=20Validator=20UserValidator?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/moonshot/keyresult/service/KeyResultService.java | 1 + .../keyresult/service/validator/KeyResultValidator.java | 6 ------ .../org/moonshot/objective/service/ObjectiveService.java | 1 + .../objective/service/validator/ObjectiveValidator.java | 6 ------ 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java index f5a9be97..d338bdc5 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java @@ -1,6 +1,7 @@ package org.moonshot.keyresult.service; import static org.moonshot.keyresult.service.validator.KeyResultValidator.*; +import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; import java.time.LocalDate; import java.util.List; diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java index cc1d2119..131bb368 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java @@ -13,12 +13,6 @@ public class KeyResultValidator { private static final int ACTIVE_KEY_RESULT_NUMBER = 3; - public static void validateUserAuthorization(final Long userEntityId, final Long userId) { - if (!userEntityId.equals(userId)) { - throw new AccessDeniedException(); - } - } - public static void validateKeyResultIndex(final int index, final int requestIndex) { if (index != requestIndex) { throw new KeyResultInvalidIndexException(); diff --git a/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java b/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java index 7914fd2c..f81c75ee 100644 --- a/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java +++ b/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java @@ -1,6 +1,7 @@ package org.moonshot.objective.service; import static org.moonshot.objective.service.validator.ObjectiveValidator.*; +import static org.moonshot.user.service.validator.UserValidator.*; import java.time.LocalDate; import java.util.Comparator; diff --git a/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java b/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java index 78f267de..28ead067 100644 --- a/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java @@ -5,12 +5,6 @@ public class ObjectiveValidator { - public static void validateUserAuthorization(Long userEntityId, Long userId) { - if (!userEntityId.equals(userId)) { - throw new AccessDeniedException(); - } - } - public static void validateIndexWithInRange(final Long objectiveCount, final int idx) { if ((objectiveCount <= idx) || (idx < 0)) { throw new ObjectiveInvalidIndexException(); From f7adba741e899645862f4b1a8373f49cfc43fd12 Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 19:34:10 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[Feat]=20#231=20-=20LogService=20Validato?= =?UTF-8?q?r=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/moonshot/log/service/LogService.java | 17 ++++++----------- .../log/service/validator/LogValidator.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java diff --git a/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java b/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java index fdc9e02d..079f228b 100644 --- a/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java +++ b/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java @@ -5,8 +5,6 @@ import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.moonshot.exception.log.InvalidLogValueException; -import org.moonshot.exception.global.auth.AccessDeniedException; import org.moonshot.exception.keyresult.KeyResultNotFoundException; import org.moonshot.keyresult.dto.request.KeyResultCreateRequestDto; import org.moonshot.keyresult.dto.request.KeyResultCreateRequestInfoDto; @@ -23,6 +21,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static org.moonshot.log.service.validator.LogValidator.validateLogNum; +import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; + + @Service @Transactional @RequiredArgsConstructor @@ -34,17 +36,10 @@ public class LogService { public Optional createRecordLog(final Long userId, final LogCreateRequestDto request) { KeyResult keyResult = keyResultRepository.findKeyResultAndObjective(request.keyResultId()) .orElseThrow(KeyResultNotFoundException::new); - if (!keyResult.getObjective().getUser().getId().equals(userId)) { - throw new AccessDeniedException(); - } + validateUserAuthorization(keyResult.getObjective().getUser().getId(), userId); Optional prevLog = logRepository.findLatestLogByKeyResultId(LogState.RECORD, request.keyResultId()); long prevNum = -1; - if (prevLog.isPresent()) { - prevNum = prevLog.get().getCurrNum(); - if(request.logNum() == prevNum) { - throw new InvalidLogValueException(); - } - } + prevLog.ifPresent(log -> validateLogNum(request.logNum(), log.getCurrNum())); Log log = logRepository.save(Log.builder() .date(LocalDateTime.now()) .state(LogState.RECORD) diff --git a/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java b/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java new file mode 100644 index 00000000..19e99f6e --- /dev/null +++ b/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java @@ -0,0 +1,13 @@ +package org.moonshot.log.service.validator; + +import org.moonshot.exception.log.InvalidLogValueException; + +public class LogValidator { + + public static void validateLogNum(Long requestNum, Long originNum) { + if (requestNum.equals(originNum)) { + throw new InvalidLogValueException(); + } + } + +} From 3e8b824323156cd48856c9555365f8bd5c29e6f0 Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 19:35:32 +0900 Subject: [PATCH 04/11] =?UTF-8?q?[Chore]=20#231=20-=20KeyResultValidator?= =?UTF-8?q?=20=EB=82=B4=EC=9D=98=20Log=EA=B4=80=EB=A0=A8=20Validator=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/moonshot/keyresult/service/KeyResultService.java | 3 ++- .../keyresult/service/validator/KeyResultValidator.java | 8 -------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java index d338bdc5..69eae456 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java @@ -1,6 +1,7 @@ package org.moonshot.keyresult.service; import static org.moonshot.keyresult.service.validator.KeyResultValidator.*; +import static org.moonshot.log.service.validator.LogValidator.validateLogNum; import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; import java.time.LocalDate; @@ -150,7 +151,7 @@ public Optional modifyKeyResult(final KeyResultModifyRequest } Log updateLog = logService.createUpdateLog(request, keyResult.getId()); - validateLogValue(request.target(), updateLog.getKeyResult().getTarget()); + validateLogNum(request.target(), updateLog.getKeyResult().getTarget()); Log prevLog = logRepository.findLatestLogByKeyResultId(LogState.RECORD, request.keyResultId()) .orElseThrow(LogNotFoundException::new); diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java index 131bb368..e15a74a5 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java @@ -3,11 +3,9 @@ import java.time.LocalDate; import java.util.List; import org.moonshot.common.model.Period; -import org.moonshot.exception.global.auth.AccessDeniedException; import org.moonshot.exception.keyresult.KeyResultInvalidIndexException; import org.moonshot.exception.keyresult.KeyResultInvalidPeriodException; import org.moonshot.exception.keyresult.KeyResultNumberExceededException; -import org.moonshot.exception.log.InvalidLogValueException; public class KeyResultValidator { @@ -38,12 +36,6 @@ public static void validateIndexUnderMaximum(final int requestIndex, final int t } } - public static void validateLogValue(Long requestTarget, Long originTarget) { - if (requestTarget.equals(originTarget)) { - throw new InvalidLogValueException(); - } - } - public static void validateKeyResultPeriod(final Period objPeriod, final LocalDate start, final LocalDate end) { if (start.isAfter(end) || start.isBefore(objPeriod.getStartAt()) || start.isAfter(objPeriod.getStartAt()) || end.isBefore(start) || end.isBefore(objPeriod.getStartAt()) || end.isAfter(objPeriod.getExpireAt())) { From 168521cf07fa134b2072059b4ac1d1dfca48be1c Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 19:57:38 +0900 Subject: [PATCH 05/11] =?UTF-8?q?[Feat]=20#231=20-=20TaskService=20Validat?= =?UTF-8?q?or=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyresult/service/KeyResultService.java | 6 ++-- .../moonshot/task/service/TaskService.java | 36 ++++++++----------- .../task/service/validator/TaskValidator.java | 29 +++++++++++++++ 3 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java index 69eae456..2c7ce757 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java @@ -2,6 +2,7 @@ import static org.moonshot.keyresult.service.validator.KeyResultValidator.*; import static org.moonshot.log.service.validator.LogValidator.validateLogNum; +import static org.moonshot.task.service.validator.TaskValidator.validateTaskIndex; import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; import java.time.LocalDate; @@ -14,7 +15,6 @@ import org.moonshot.exception.keyresult.KeyResultRequiredException; import org.moonshot.exception.log.LogNotFoundException; import org.moonshot.exception.objective.ObjectiveNotFoundException; -import org.moonshot.exception.task.TaskInvalidIndexException; import org.moonshot.keyresult.dto.request.KeyResultCreateRequestDto; import org.moonshot.keyresult.dto.request.KeyResultCreateRequestInfoDto; import org.moonshot.keyresult.dto.request.KeyResultModifyRequestDto; @@ -218,9 +218,7 @@ private void saveTasks(final KeyResult keyResult, final List nonNullTaskList = taskList.stream().filter(Objects::nonNull).toList(); for (int i = 0; i < nonNullTaskList.size(); i++) { TaskCreateRequestDto taskDto = nonNullTaskList.get(i); - if (i != taskDto.idx()) { - throw new TaskInvalidIndexException(); - } + validateTaskIndex(i, taskDto.idx()); taskService.saveTask(keyResult, taskDto); } } diff --git a/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java b/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java index 5f28dbfb..39a6cc25 100644 --- a/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java +++ b/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java @@ -2,10 +2,8 @@ import java.util.List; import lombok.RequiredArgsConstructor; -import org.moonshot.exception.global.auth.AccessDeniedException; -import org.moonshot.exception.keyresult.KeyResultInvalidIndexException; +import org.moonshot.exception.task.TaskInvalidIndexException; import org.moonshot.exception.task.TaskNotFoundException; -import org.moonshot.exception.task.TaskNumberExceededException; import org.moonshot.keyresult.model.KeyResult; import org.moonshot.keyresult.repository.KeyResultRepository; import org.moonshot.objective.dto.request.ModifyIndexRequestDto; @@ -17,29 +15,25 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static org.moonshot.task.service.validator.TaskValidator.validateActiveTaskSizeExceeded; +import static org.moonshot.task.service.validator.TaskValidator.validateIndexUnderMaximum; +import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; + @Service @Transactional @RequiredArgsConstructor public class TaskService implements IndexService { - private static final int ACTIVE_TASK_NUMBER = 3; - private final KeyResultRepository keyResultRepository; private final TaskRepository taskRepository; public void createTask(final TaskSingleCreateRequestDto request, final Long userId) { KeyResult keyResult = keyResultRepository.findKeyResultAndObjective(request.keyResultId()) .orElseThrow(); - if (!keyResult.getObjective().getUser().getId().equals(userId)) { - throw new AccessDeniedException(); - } - List taskList = taskRepository.findAllByKeyResultOrderByIdx(keyResult); + validateUserAuthorization(keyResult.getObjective().getUser().getId(), userId); - if (taskList.size() >= ACTIVE_TASK_NUMBER) { - throw new TaskNumberExceededException(); - } - if (request.idx() > taskList.size()) { - throw new KeyResultInvalidIndexException(); - } + List taskList = taskRepository.findAllByKeyResultOrderByIdx(keyResult); + validateActiveTaskSizeExceeded(taskList.size()); + validateIndexUnderMaximum(request.idx(), taskList.size()); for (int i = request.idx(); i < taskList.size(); i++) { taskList.get(i).incrementIdx(); @@ -69,12 +63,11 @@ public void saveTask(final KeyResult keyResult, final TaskCreateRequestDto reque public void modifyIdx(final ModifyIndexRequestDto request, final Long userId) { Task task = taskRepository.findTaskWithFetchJoin(request.id()) .orElseThrow(TaskNotFoundException::new); - if (task.getKeyResult().getObjective().getUser().getId().equals(userId)) { - throw new AccessDeniedException(); - } + validateUserAuthorization(task.getKeyResult().getObjective().getUser().getId(), userId); + Long taskCount = taskRepository.countAllByKeyResultId(task.getKeyResult().getId()); if (isInvalidIdx(taskCount, request.idx())) { - throw new KeyResultInvalidIndexException(); + throw new TaskInvalidIndexException(); } Integer prevIdx = task.getIdx(); if (prevIdx.equals(request.idx())) { @@ -96,9 +89,8 @@ private boolean isInvalidIdx(final Long taskCount, final int idx) { public void deleteTask(final Long userId, Long taskId) { Task task = taskRepository.findTaskWithFetchJoin(taskId) .orElseThrow(TaskNotFoundException::new); - if (task.getKeyResult().getObjective().getUser().getId().equals(userId)) { - throw new AccessDeniedException(); - } + validateUserAuthorization(task.getKeyResult().getObjective().getUser().getId(), userId); + taskRepository.deleteById(taskId); } diff --git a/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java b/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java new file mode 100644 index 00000000..7951a650 --- /dev/null +++ b/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java @@ -0,0 +1,29 @@ +package org.moonshot.task.service.validator; + +import org.moonshot.exception.keyresult.KeyResultInvalidIndexException; +import org.moonshot.exception.task.TaskInvalidIndexException; +import org.moonshot.exception.task.TaskNumberExceededException; + +public class TaskValidator { + + private static final int ACTIVE_TASK_NUMBER = 3; + + public static void validateTaskIndex(final int index, final int requestIndex) { + if (index != requestIndex) { + throw new TaskInvalidIndexException(); + } + } + + public static void validateActiveTaskSizeExceeded(final int taskListSize) { + if (taskListSize >= ACTIVE_TASK_NUMBER) { + throw new TaskNumberExceededException(); + } + } + + public static void validateIndexUnderMaximum(final int requestIndex, final int totalTaskListSize) { + if (requestIndex > totalTaskListSize) { + throw new TaskInvalidIndexException(); + } + } + +} From 24d0fb674b5561e4dd7c73fc76bcbf4bb5447e0b Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 20:04:25 +0900 Subject: [PATCH 06/11] =?UTF-8?q?[Fix]=20#231=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B9=88=EC=A4=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/moonshot/user/service/UserService.java | 4 +++- .../org/moonshot/user/service/validator/UserValidator.java | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java index 980ea377..90ec1767 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java @@ -11,7 +11,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.moonshot.discord.DiscordAppender; -import org.moonshot.exception.global.auth.AccessDeniedException; import org.moonshot.exception.global.external.discord.ErrorLogAppenderException; import org.moonshot.exception.user.UserNotFoundException; import org.moonshot.jwt.JwtTokenProvider; @@ -147,6 +146,7 @@ public void logout(final Long userId) { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); validateUserAuthorization(user.getId(), userId); + jwtTokenProvider.deleteRefreshToken(userId); } @@ -154,6 +154,7 @@ public void withdrawal(final Long userId) { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); validateUserAuthorization(user.getId(), userId); + user.setDeleteAt(); } @@ -161,6 +162,7 @@ public void modifyProfile(final Long userId, final UserInfoRequest request) { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); validateUserAuthorization(user.getId(), userId); + if (request.nickname() != null) { user.modifyNickname(request.nickname()); } diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java b/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java index 40576226..f4f6c3b7 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java @@ -3,9 +3,11 @@ import org.moonshot.exception.global.auth.AccessDeniedException; public class UserValidator { + public static void validateUserAuthorization(final Long userEntityId, final Long userId) { if (!userEntityId.equals(userId)) { throw new AccessDeniedException(); } } + } From d0d6c55476c07706c616cae15dd7021f1748d17f Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 20:05:32 +0900 Subject: [PATCH 07/11] =?UTF-8?q?[Chore]=20#231=20-=20ObjectiveValidator?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moonshot/objective/service/ObjectiveService.java | 7 +------ .../service/validator/ObjectiveValidator.java | 10 +++++++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java b/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java index f81c75ee..9991fe1c 100644 --- a/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java +++ b/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java @@ -14,7 +14,6 @@ import org.moonshot.exception.objective.DateInputRequiredException; import org.moonshot.exception.objective.InvalidExpiredAtException; import org.moonshot.exception.objective.ObjectiveNotFoundException; -import org.moonshot.exception.objective.ObjectiveNumberExceededException; import org.moonshot.exception.user.UserNotFoundException; import org.moonshot.keyresult.service.KeyResultService; import org.moonshot.objective.dto.request.ModifyIndexRequestDto; @@ -35,8 +34,6 @@ @RequiredArgsConstructor public class ObjectiveService implements IndexService { - private static final int ACTIVE_OBJECTIVE_NUMBER = 10; - private final KeyResultService keyResultService; private final UserRepository userRepository; private final ObjectiveRepository objectiveRepository; @@ -46,9 +43,7 @@ public void createObjective(final Long userId, final OKRCreateRequestDto request .orElseThrow(UserNotFoundException::new); List objectives = objectiveRepository.findAllByUserId(userId); - if (objectives.size() >= ACTIVE_OBJECTIVE_NUMBER) { - throw new ObjectiveNumberExceededException(); - } + validateActiveObjectiveSizeExceeded(objectives.size()); objectiveRepository.bulkUpdateIdxIncrease(userId); Objective newObjective = objectiveRepository.save(Objective.builder() diff --git a/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java b/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java index 28ead067..ab77612c 100644 --- a/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java @@ -1,16 +1,24 @@ package org.moonshot.objective.service.validator; -import org.moonshot.exception.global.auth.AccessDeniedException; import org.moonshot.exception.objective.ObjectiveInvalidIndexException; +import org.moonshot.exception.objective.ObjectiveNumberExceededException; public class ObjectiveValidator { + private static final int ACTIVE_OBJECTIVE_NUMBER = 10; + public static void validateIndexWithInRange(final Long objectiveCount, final int idx) { if ((objectiveCount <= idx) || (idx < 0)) { throw new ObjectiveInvalidIndexException(); } } + public static void validateActiveObjectiveSizeExceeded(final int objListSize) { + if (objListSize >= ACTIVE_OBJECTIVE_NUMBER) { + throw new ObjectiveNumberExceededException(); + } + } + public static boolean isSameIndex(final int prevIdx, final int idx) { return prevIdx == idx; } From d2632082e6bbb35fa8b5df83d532feba48c88c5f Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 20:50:52 +0900 Subject: [PATCH 08/11] =?UTF-8?q?[Chore]=20#231=20-=20Validator=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/moonshot/log/service/LogService.java | 6 ++++-- .../log/service/validator/LogValidator.java | 5 +++++ .../org/moonshot/task/service/TaskService.java | 18 ++++++------------ .../task/service/validator/TaskValidator.java | 7 ++++++- .../org/moonshot/user/service/UserService.java | 10 +++++----- .../user/service/validator/UserValidator.java | 11 +++++++++++ 6 files changed, 37 insertions(+), 20 deletions(-) diff --git a/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java b/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java index 079f228b..09ccd0e4 100644 --- a/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java +++ b/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java @@ -21,6 +21,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static org.moonshot.keyresult.service.validator.KeyResultValidator.isKeyResultAchieved; +import static org.moonshot.log.service.validator.LogValidator.isCreateLog; import static org.moonshot.log.service.validator.LogValidator.validateLogNum; import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; @@ -50,7 +52,7 @@ public Optional createRecordLog(final Long userId, final Log .build()); keyResult.modifyProgress(calculateKRProgressBar(log, keyResult.getTarget())); keyResult.getObjective().modifyProgress(calculateOProgressBar(keyResult.getObjective())); - if (keyResult.getObjective().getProgress() == 100) { + if (isKeyResultAchieved(keyResult.getObjective().getProgress())) { return Optional.of(AchieveResponseDto.of(keyResult.getObjective().getId(), keyResult.getObjective().getUser().getNickname(), calculateOProgressBar(keyResult.getObjective()))); } return Optional.empty(); @@ -111,7 +113,7 @@ public List getLogResponseDto(final List logList, final Key } private String setTitle(final long prevNum, final long currNum, final Log log, final KeyResult keyResult) { - if (log.getState() == LogState.CREATE) { + if (isCreateLog(log.getState())) { return keyResult.getTitle() + " : " + keyResult.getTarget() + keyResult.getMetric(); } else { return (prevNum == -1 ? "0" : NumberFormat.getNumberInstance().format(prevNum)) + keyResult.getMetric() diff --git a/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java b/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java index 19e99f6e..364963f9 100644 --- a/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/log/service/validator/LogValidator.java @@ -1,6 +1,7 @@ package org.moonshot.log.service.validator; import org.moonshot.exception.log.InvalidLogValueException; +import org.moonshot.log.model.LogState; public class LogValidator { @@ -10,4 +11,8 @@ public static void validateLogNum(Long requestNum, Long originNum) { } } + public static boolean isCreateLog(LogState state) { + return state == LogState.CREATE; + } + } diff --git a/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java b/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java index 39a6cc25..6fa3c143 100644 --- a/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java +++ b/moonshot-api/src/main/java/org/moonshot/task/service/TaskService.java @@ -2,7 +2,6 @@ import java.util.List; import lombok.RequiredArgsConstructor; -import org.moonshot.exception.task.TaskInvalidIndexException; import org.moonshot.exception.task.TaskNotFoundException; import org.moonshot.keyresult.model.KeyResult; import org.moonshot.keyresult.repository.KeyResultRepository; @@ -15,9 +14,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import static org.moonshot.task.service.validator.TaskValidator.validateActiveTaskSizeExceeded; -import static org.moonshot.task.service.validator.TaskValidator.validateIndexUnderMaximum; +import static org.moonshot.task.service.validator.TaskValidator.*; import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; +import static org.moonshot.validator.IndexValidator.isIndexIncreased; +import static org.moonshot.validator.IndexValidator.isSameIndex; @Service @Transactional @@ -66,26 +66,20 @@ public void modifyIdx(final ModifyIndexRequestDto request, final Long userId) { validateUserAuthorization(task.getKeyResult().getObjective().getUser().getId(), userId); Long taskCount = taskRepository.countAllByKeyResultId(task.getKeyResult().getId()); - if (isInvalidIdx(taskCount, request.idx())) { - throw new TaskInvalidIndexException(); - } + validateIndex(taskCount, request.idx()); Integer prevIdx = task.getIdx(); - if (prevIdx.equals(request.idx())) { + if (isSameIndex(prevIdx, request.idx())) { return; } task.modifyIdx(request.idx()); - if (prevIdx < request.idx()) { + if (isIndexIncreased(prevIdx, request.idx())) { taskRepository.bulkUpdateTaskIdxDecrease(prevIdx + 1, request.idx(), task.getKeyResult().getId(), task.getId()); } else { taskRepository.bulkUpdateTaskIdxIncrease(request.idx(), prevIdx, task.getKeyResult().getId(), task.getId()); } } - private boolean isInvalidIdx(final Long taskCount, final int idx) { - return (taskCount <= idx) || (idx < 0); - } - public void deleteTask(final Long userId, Long taskId) { Task task = taskRepository.findTaskWithFetchJoin(taskId) .orElseThrow(TaskNotFoundException::new); diff --git a/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java b/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java index 7951a650..091cc4d0 100644 --- a/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/task/service/validator/TaskValidator.java @@ -1,6 +1,5 @@ package org.moonshot.task.service.validator; -import org.moonshot.exception.keyresult.KeyResultInvalidIndexException; import org.moonshot.exception.task.TaskInvalidIndexException; import org.moonshot.exception.task.TaskNumberExceededException; @@ -26,4 +25,10 @@ public static void validateIndexUnderMaximum(final int requestIndex, final int t } } + public static void validateIndex(final Long taskCount, final Integer requestIndex) { + if (taskCount <= requestIndex || requestIndex < 0) { + throw new TaskInvalidIndexException(); + } + } + } diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java index 90ec1767..342ef5f6 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java @@ -1,6 +1,6 @@ package org.moonshot.user.service; -import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; +import static org.moonshot.user.service.validator.UserValidator.*; import static org.moonshot.util.MDCUtil.USER_REQUEST_ORIGIN; import static org.moonshot.util.MDCUtil.get; @@ -85,7 +85,7 @@ public SocialLoginResponse googleLogin(final SocialLoginRequest request) throws GoogleInfoResponse userResponse = googleApiClient.googleInfo("Bearer " + tokenResponse.accessToken()); Optional findUser = userRepository.findUserBySocialId(userResponse.sub()); User user; - if (findUser.isEmpty()) { + if (isNewUser(findUser)) { User newUser = userRepository.save(User.builderWithSignIn() .socialId(userResponse.sub()) .socialPlatform(request.socialPlatform()) @@ -115,7 +115,7 @@ public SocialLoginResponse kakaoLogin(final SocialLoginRequest request) { "Bearer " + tokenResponse.accessToken()); Optional findUser = userRepository.findUserBySocialId(userResponse.id()); User user; - if (findUser.isEmpty()) { + if (isNewUser(findUser)) { User newUser = userRepository.save(User.builderWithSignIn() .socialId(userResponse.id()) .socialPlatform(request.socialPlatform()) @@ -163,10 +163,10 @@ public void modifyProfile(final Long userId, final UserInfoRequest request) { .orElseThrow(UserNotFoundException::new); validateUserAuthorization(user.getId(), userId); - if (request.nickname() != null) { + if (hasChange(request.nickname())) { user.modifyNickname(request.nickname()); } - if (request.description() != null) { + if (hasChange(request.description())) { user.modifyDescription(request.description()); } } diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java b/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java index f4f6c3b7..ee46a7aa 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/validator/UserValidator.java @@ -1,6 +1,9 @@ package org.moonshot.user.service.validator; import org.moonshot.exception.global.auth.AccessDeniedException; +import org.moonshot.user.model.User; + +import java.util.Optional; public class UserValidator { @@ -10,4 +13,12 @@ public static void validateUserAuthorization(final Long userEntityId, final Long } } + public static boolean hasChange(final Object object) { + return (object != null); + } + + public static boolean isNewUser(final Optional user) { + return user.isEmpty(); + } + } From 4270b6150e30f8c65fdafcc6aeb4292e952afd3d Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 20:51:27 +0900 Subject: [PATCH 09/11] =?UTF-8?q?[Feat]=20#231=20-=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20index=20Validator=20=EB=94=B0=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyresult/service/KeyResultService.java | 6 ++++-- .../objective/service/ObjectiveService.java | 2 ++ .../service/validator/ObjectiveValidator.java | 8 -------- .../java/org/moonshot/validator/IndexValidator.java | 13 +++++++++++++ 4 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 moonshot-api/src/main/java/org/moonshot/validator/IndexValidator.java diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java index 2c7ce757..d742ae2a 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java @@ -4,6 +4,8 @@ import static org.moonshot.log.service.validator.LogValidator.validateLogNum; import static org.moonshot.task.service.validator.TaskValidator.validateTaskIndex; import static org.moonshot.user.service.validator.UserValidator.validateUserAuthorization; +import static org.moonshot.validator.IndexValidator.isIndexIncreased; +import static org.moonshot.validator.IndexValidator.isSameIndex; import java.time.LocalDate; import java.util.List; @@ -178,12 +180,12 @@ public void modifyIdx(final ModifyIndexRequestDto request, final Long userId) { validateIndex(krCount, request.idx()); Integer prevIdx = keyResult.getIdx(); - if (prevIdx.equals(request.idx())) { + if (isSameIndex(prevIdx, request.idx())) { return; } keyResult.modifyIdx(request.idx()); - if (prevIdx < request.idx()) { + if (isIndexIncreased(prevIdx, request.idx())) { keyResultRepository.bulkUpdateIdxDecrease(prevIdx + 1, request.idx(), keyResult.getObjective().getId(), keyResult.getId()); } else { keyResultRepository.bulkUpdateIdxIncrease(request.idx(), prevIdx, keyResult.getObjective().getId(), keyResult.getId()); diff --git a/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java b/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java index 9991fe1c..43c02510 100644 --- a/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java +++ b/moonshot-api/src/main/java/org/moonshot/objective/service/ObjectiveService.java @@ -2,6 +2,8 @@ import static org.moonshot.objective.service.validator.ObjectiveValidator.*; import static org.moonshot.user.service.validator.UserValidator.*; +import static org.moonshot.validator.IndexValidator.isIndexIncreased; +import static org.moonshot.validator.IndexValidator.isSameIndex; import java.time.LocalDate; import java.util.Comparator; diff --git a/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java b/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java index ab77612c..994eb5dd 100644 --- a/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/objective/service/validator/ObjectiveValidator.java @@ -19,12 +19,4 @@ public static void validateActiveObjectiveSizeExceeded(final int objListSize) { } } - public static boolean isSameIndex(final int prevIdx, final int idx) { - return prevIdx == idx; - } - - public static boolean isIndexIncreased(final int prevIdx, final int idx) { - return prevIdx < idx; - } - } diff --git a/moonshot-api/src/main/java/org/moonshot/validator/IndexValidator.java b/moonshot-api/src/main/java/org/moonshot/validator/IndexValidator.java new file mode 100644 index 00000000..1138cfd4 --- /dev/null +++ b/moonshot-api/src/main/java/org/moonshot/validator/IndexValidator.java @@ -0,0 +1,13 @@ +package org.moonshot.validator; + +public class IndexValidator { + + public static boolean isSameIndex(final int prevIdx, final int idx) { + return prevIdx == idx; + } + + public static boolean isIndexIncreased(final int prevIdx, final int idx) { + return prevIdx < idx; + } + +} From cb57fd79faf6f1e320b78a50cee18ec09f1a7a53 Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 22:23:16 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[Fix]=20#231=20-=20KeyResult=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EA=B4=80=EB=A0=A8=20=EB=B2=84=EA=B7=B8=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/moonshot/keyresult/service/KeyResultService.java | 8 ++++---- .../keyresult/service/validator/KeyResultValidator.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java index d742ae2a..48cea8ee 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/KeyResultService.java @@ -155,11 +155,11 @@ public Optional modifyKeyResult(final KeyResultModifyRequest Log updateLog = logService.createUpdateLog(request, keyResult.getId()); validateLogNum(request.target(), updateLog.getKeyResult().getTarget()); - Log prevLog = logRepository.findLatestLogByKeyResultId(LogState.RECORD, request.keyResultId()) - .orElseThrow(LogNotFoundException::new); + Optional prevLog = logRepository.findLatestLogByKeyResultId(LogState.RECORD, request.keyResultId()); keyResult.modifyTarget(request.target()); - keyResult.modifyProgress(logService.calculateKRProgressBar(prevLog, keyResult.getTarget())); - + if(prevLog.isPresent()) { + keyResult.modifyProgress(logService.calculateKRProgressBar(prevLog.get(), keyResult.getTarget())); + } short progress = logService.calculateOProgressBar(keyResult.getObjective()); keyResult.getObjective().modifyProgress(progress); diff --git a/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java b/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java index e15a74a5..83a4b698 100644 --- a/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java +++ b/moonshot-api/src/main/java/org/moonshot/keyresult/service/validator/KeyResultValidator.java @@ -37,7 +37,7 @@ public static void validateIndexUnderMaximum(final int requestIndex, final int t } public static void validateKeyResultPeriod(final Period objPeriod, final LocalDate start, final LocalDate end) { - if (start.isAfter(end) || start.isBefore(objPeriod.getStartAt()) || start.isAfter(objPeriod.getStartAt()) + if (start.isAfter(end) || start.isBefore(objPeriod.getStartAt()) || start.isAfter(objPeriod.getExpireAt()) || end.isBefore(start) || end.isBefore(objPeriod.getStartAt()) || end.isAfter(objPeriod.getExpireAt())) { throw new KeyResultInvalidPeriodException(); } From 04683615bb2dca301c239163589e5ee45f1f6365 Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Thu, 29 Feb 2024 22:47:25 +0900 Subject: [PATCH 11/11] =?UTF-8?q?[Fix]=20#233=20-=20Log=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=EB=A1=9C=EA=B7=B8=EA=B0=92=EC=9D=B4=200=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=9C=A8=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/moonshot/log/service/LogService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java b/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java index 09ccd0e4..14379f21 100644 --- a/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java +++ b/moonshot-api/src/main/java/org/moonshot/log/service/LogService.java @@ -6,6 +6,7 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import org.moonshot.exception.keyresult.KeyResultNotFoundException; +import org.moonshot.exception.log.InvalidLogValueException; import org.moonshot.keyresult.dto.request.KeyResultCreateRequestDto; import org.moonshot.keyresult.dto.request.KeyResultCreateRequestInfoDto; import org.moonshot.keyresult.dto.request.KeyResultModifyRequestDto; @@ -41,7 +42,10 @@ public Optional createRecordLog(final Long userId, final Log validateUserAuthorization(keyResult.getObjective().getUser().getId(), userId); Optional prevLog = logRepository.findLatestLogByKeyResultId(LogState.RECORD, request.keyResultId()); long prevNum = -1; - prevLog.ifPresent(log -> validateLogNum(request.logNum(), log.getCurrNum())); + if (prevLog.isPresent()) { + prevNum = prevLog.get().getCurrNum(); + validateLogNum(request.logNum(), prevNum); + } Log log = logRepository.save(Log.builder() .date(LocalDateTime.now()) .state(LogState.RECORD)