From 1cffc1d6809bb90a7473e33029fb038367555dae Mon Sep 17 00:00:00 2001 From: goodjunseon Date: Tue, 20 Jan 2026 14:22:41 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=ED=91=9C=EC=A4=80=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/oneco/backend/mission/domain/mission/Mission.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oneco/src/main/java/com/oneco/backend/mission/domain/mission/Mission.java b/oneco/src/main/java/com/oneco/backend/mission/domain/mission/Mission.java index 3a4b43c..11ba99b 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/domain/mission/Mission.java +++ b/oneco/src/main/java/com/oneco/backend/mission/domain/mission/Mission.java @@ -106,7 +106,7 @@ private Mission( } // 미션 생성 메서드 - public static Mission create( + public static Mission of( MemberId requesterId, MemberId recipientId, FamilyRelationId familyRelationId, From da9cf24af37c1e56f163c6c9ebdf432eecbf37f6 Mon Sep 17 00:00:00 2001 From: goodjunseon Date: Tue, 20 Jan 2026 14:23:30 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=ED=91=9C=EC=A4=80=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/application/service/CreateMissionService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oneco/src/main/java/com/oneco/backend/mission/application/service/CreateMissionService.java b/oneco/src/main/java/com/oneco/backend/mission/application/service/CreateMissionService.java index 8d1b7d6..94f8e47 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/application/service/CreateMissionService.java +++ b/oneco/src/main/java/com/oneco/backend/mission/application/service/CreateMissionService.java @@ -69,7 +69,7 @@ public MissionResult request(CreateMissionCommand command) { Reward reward = Reward.of(title, command.message()); // Mission 생성시 필요한 값: FamilyRelationId, CategoryId, Period, Reward(nullable) - Mission mission = Mission.create(requesterId, recipientId, relationId, categoryId, period, reward); + Mission mission = Mission.of(requesterId, recipientId, relationId, categoryId, period, reward); // 3. 저장 missionPort.save(mission); From 91ca63897f0675ed49870176cef39d5dc7117ed7 Mon Sep 17 00:00:00 2001 From: goodjunseon Date: Tue, 20 Jan 2026 14:25:54 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EB=AF=B8=EC=85=98=20=EC=8A=B9?= =?UTF-8?q?=EC=9D=B8/=EA=B1=B0=EC=A0=88=20=EA=B3=A0=EB=8F=84=ED=99=94=20-?= =?UTF-8?q?=20=EB=AF=B8=EC=85=98=20=EC=8A=B9=EC=9D=B8=20=EC=8B=9C=EC=A0=90?= =?UTF-8?q?/=EC=8B=9C=EC=9E=91=EC=9D=BC=20=EB=B9=84=EA=B5=90=20=ED=9B=84?= =?UTF-8?q?=20=EC=A6=89=EC=8B=9C=20=EC=A7=84=ED=96=89=EC=A4=91=EC=9D=B8=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20-=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98=20=EC=8A=B9=EC=9D=B8=20=EC=8B=9C=EC=A0=90/?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=EC=9D=BC=20=EB=B9=84=EA=B5=90=20=ED=9B=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EC=A4=91=EC=9D=B8=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=EB=90=98=EB=8A=94=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../port/in/ApproveMissionUseCase.java | 1 + .../service/MissionApprovalService.java | 24 ++++++++++++++++++- .../service/MissionBatchService.java | 2 +- .../domain/exception/MissionErrorCode.java | 5 ++++ .../presentation/MissionController.java | 4 +++- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/oneco/src/main/java/com/oneco/backend/mission/application/port/in/ApproveMissionUseCase.java b/oneco/src/main/java/com/oneco/backend/mission/application/port/in/ApproveMissionUseCase.java index c22fc84..8d6dd3b 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/application/port/in/ApproveMissionUseCase.java +++ b/oneco/src/main/java/com/oneco/backend/mission/application/port/in/ApproveMissionUseCase.java @@ -5,5 +5,6 @@ public interface ApproveMissionUseCase { + // 미션 수신자는 미션 승인 또는 거절을 결정한다. MissionResult decide(ApproveMissionCommand command); } diff --git a/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java b/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java index a0618d9..265060c 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java +++ b/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java @@ -1,5 +1,7 @@ package com.oneco.backend.mission.application.service; +import java.time.LocalDate; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,9 +33,20 @@ public MissionResult decide(ApproveMissionCommand command) { MemberId recipientId = MemberId.of(command.recipientId()); validateRecipient(mission, recipientId); validateStatus(mission); + validateNotExpired(mission); if (command.accepted()) { + // 미션 승인 상태일 경우 mission.acceptApproval(); + + // 미션 시작일과 요청 수락일이 같다면 즉시 미션 진행 상태로 변경 + LocalDate startDate = mission.getPeriod().getStartDate(); + LocalDate today = LocalDate.now(); + + if (startDate.isBefore(today) || startDate.isEqual(today)) { + mission.markInProgress(); // 미션을 즉시 진행 상태로 변경 + } + } else { mission.rejectApproval(); } @@ -44,7 +57,8 @@ public MissionResult decide(ApproveMissionCommand command) { private void validateRecipient(Mission mission, MemberId recipientId) { if (!mission.getRecipientId().equals(recipientId)) { - throw BaseException.from(MissionErrorCode.MISSION_APPROVAL_FORBIDDEN); + throw BaseException.from(MissionErrorCode.MISSION_APPROVAL_FORBIDDEN, + "미션 수신자가 아닌 사용자는 승인/거절할 수 없습니다."); } } @@ -54,4 +68,12 @@ private void validateStatus(Mission mission) { "승인/거절은 APPROVAL_REQUEST 상태에서만 가능합니다."); } } + + private void validateNotExpired(Mission mission) { + LocalDate today = LocalDate.now(); + if (today.isAfter(mission.getPeriod().getEndDate())) { + throw BaseException.from(MissionErrorCode.LATE_MISSION_APPROVAL, + "미션 종료일이 지난 후에는 승인할 수 없습니다."); + } + } } diff --git a/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionBatchService.java b/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionBatchService.java index e7b2624..792b826 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionBatchService.java +++ b/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionBatchService.java @@ -80,7 +80,7 @@ public void startScheduledMissions() { long successCount = 0; // 성공 처리 건수 long errorCount = 0; // 실패 처리 중 오류 발생 건수 - // 1. 오늘이 시작일인 미션들을 조회한다. + // 1. 오늘이 시작일이면서 미션 상태가 APPROVAL_ACCEPTED인 미션들을 조회한다. List missionsToStart = missionPort.findAllMissionsStartingToday(today); // ============================= diff --git a/oneco/src/main/java/com/oneco/backend/mission/domain/exception/MissionErrorCode.java b/oneco/src/main/java/com/oneco/backend/mission/domain/exception/MissionErrorCode.java index c2e5838..b4a3530 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/domain/exception/MissionErrorCode.java +++ b/oneco/src/main/java/com/oneco/backend/mission/domain/exception/MissionErrorCode.java @@ -120,6 +120,11 @@ public enum MissionErrorCode implements ErrorCode { HttpStatus.BAD_REQUEST, "미션 ID가 유효하지 않습니다.", "MISSION_ERROR_400_INVALID_MISSION_ID" + ), + LATE_MISSION_APPROVAL( + HttpStatus.BAD_REQUEST, + "미션 종료일이 지난 후에는 승인할 수 없습니다.", + "MISSION_ERROR_400_LATE_MISSION_APPROVAL" ); private final HttpStatus httpStatus; diff --git a/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java b/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java index df77f71..b15e16b 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java +++ b/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java @@ -75,8 +75,10 @@ public ResponseEntity> createMission( description = """ - 미션 승인 또는 거절 요청을 처리한다. - 미션 수신자는 미션을 승인하거나 거절할 수 있다. - - 승인 시 미션 상태는 '진행중'으로 변경된다. + - 승인 시 미션 상태는 '승인 수락'으로 변경된다. - 거절 시 미션 상태는 '거절됨'으로 변경된다. + - 미션 승인 시점이 미션 시작일이 같을 경우 미션 상태는 즉시 '진행중'으로 변경된다. + - 미션 승인 시점이 미션 시작일보다 이후 일 경우 미션 상태는 즉시 '진행중'으로 변경된다. """ ) @ApiResponses({ From 2152da75f23266d0013860e9aced3dc5ad5ab133 Mon Sep 17 00:00:00 2001 From: goodjunseon Date: Tue, 20 Jan 2026 14:52:37 +0900 Subject: [PATCH 4/4] =?UTF-8?q?style:=20=EC=A3=BC=EC=84=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/application/service/MissionApprovalService.java | 2 +- .../oneco/backend/mission/presentation/MissionController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java b/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java index 265060c..87aa66d 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java +++ b/oneco/src/main/java/com/oneco/backend/mission/application/service/MissionApprovalService.java @@ -39,7 +39,7 @@ public MissionResult decide(ApproveMissionCommand command) { // 미션 승인 상태일 경우 mission.acceptApproval(); - // 미션 시작일과 요청 수락일이 같다면 즉시 미션 진행 상태로 변경 + // 미션 시작일이 오늘(요청 수락일)과 같거나 이전이라면 즉시 미션 진행 상태로 변경 LocalDate startDate = mission.getPeriod().getStartDate(); LocalDate today = LocalDate.now(); diff --git a/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java b/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java index b15e16b..8ee06d0 100644 --- a/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java +++ b/oneco/src/main/java/com/oneco/backend/mission/presentation/MissionController.java @@ -77,7 +77,7 @@ public ResponseEntity> createMission( - 미션 수신자는 미션을 승인하거나 거절할 수 있다. - 승인 시 미션 상태는 '승인 수락'으로 변경된다. - 거절 시 미션 상태는 '거절됨'으로 변경된다. - - 미션 승인 시점이 미션 시작일이 같을 경우 미션 상태는 즉시 '진행중'으로 변경된다. + - 미션 승인 시점이 미션 시작일이과 같을 경우 미션 상태는 즉시 '진행중'으로 변경된다. - 미션 승인 시점이 미션 시작일보다 이후 일 경우 미션 상태는 즉시 '진행중'으로 변경된다. """ )