From 9d1cca2c6f5181848cc008dd2e8d31da10e31c2d Mon Sep 17 00:00:00 2001 From: thguss Date: Tue, 13 Aug 2024 15:23:53 +0900 Subject: [PATCH] [ADD] add cancel achievement logic --- .../MemberDailyRoutineAchieveResponse.java | 4 +++- .../memberroutine/entity/MemberRoutine.java | 13 ++++++++++ .../service/MemberRoutineUpdateService.java | 24 +++++++++++++++---- .../MemberRoutineAchieveServiceResponse.java | 6 +++-- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/soptie/server/memberroutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java b/src/main/java/com/soptie/server/memberroutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java index 7e4ffcbf..62368037 100644 --- a/src/main/java/com/soptie/server/memberroutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java +++ b/src/main/java/com/soptie/server/memberroutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java @@ -10,7 +10,8 @@ public record MemberDailyRoutineAchieveResponse( long routineId, boolean isAchieve, - int achieveCount + int achieveCount, + boolean hasCotton ) { public static MemberDailyRoutineAchieveResponse of(MemberRoutineAchieveServiceResponse response) { @@ -18,6 +19,7 @@ public static MemberDailyRoutineAchieveResponse of(MemberRoutineAchieveServiceRe .routineId(response.routineId()) .isAchieve(response.isAchieve()) .achieveCount(response.achieveCount()) + .hasCotton(response.hasCotton()) .build(); } } diff --git a/src/main/java/com/soptie/server/memberroutine/entity/MemberRoutine.java b/src/main/java/com/soptie/server/memberroutine/entity/MemberRoutine.java index c40daec6..cb7257f3 100644 --- a/src/main/java/com/soptie/server/memberroutine/entity/MemberRoutine.java +++ b/src/main/java/com/soptie/server/memberroutine/entity/MemberRoutine.java @@ -36,6 +36,8 @@ public class MemberRoutine { private boolean isAchieve; + private boolean isAchieveToday; + private int achieveCount; @Enumerated(value = STRING) @@ -49,6 +51,7 @@ public class MemberRoutine { public MemberRoutine(Member member, Routine routine) { this.isAchieve = false; + this.isAchieveToday = false; this.achieveCount = 0; this.type = routine.getType(); this.routineId = routine.getId(); @@ -57,6 +60,7 @@ public MemberRoutine(Member member, Routine routine) { public MemberRoutine(Member member, Challenge challenge) { this.isAchieve = false; + this.isAchieveToday = false; this.achieveCount = 0; this.type = CHALLENGE; this.routineId = challenge.getId(); @@ -65,6 +69,7 @@ public MemberRoutine(Member member, Challenge challenge) { public MemberRoutine(DeletedMemberRoutine deletedMemberRoutine) { this.isAchieve = isAchievedToday(deletedMemberRoutine); + this.isAchieveToday = isAchievedToday(deletedMemberRoutine); this.achieveCount = deletedMemberRoutine.getAchieveCount(); this.type = deletedMemberRoutine.getType(); this.routineId = deletedMemberRoutine.getRoutineId(); @@ -77,6 +82,7 @@ public MemberRoutine( ) { this.id = id; this.isAchieve = isAchieve; + this.isAchieveToday = isAchieve; this.achieveCount = achieveCount; this.type = type; this.routineId = routineId; @@ -85,11 +91,18 @@ public MemberRoutine( public void achieve() { this.isAchieve = true; + this.isAchieveToday = true; this.achieveCount++; } public void initAchieve() { this.isAchieve = false; + this.isAchieveToday = false; + } + + public void cancelAchievement() { + this.isAchieve = false; + this.achieveCount--; } public void checkMemberHas(Member member) { diff --git a/src/main/java/com/soptie/server/memberroutine/service/MemberRoutineUpdateService.java b/src/main/java/com/soptie/server/memberroutine/service/MemberRoutineUpdateService.java index 7ccb5c38..eaa2a871 100644 --- a/src/main/java/com/soptie/server/memberroutine/service/MemberRoutineUpdateService.java +++ b/src/main/java/com/soptie/server/memberroutine/service/MemberRoutineUpdateService.java @@ -1,11 +1,13 @@ package com.soptie.server.memberroutine.service; +import static com.soptie.server.member.message.ErrorCode.*; import static com.soptie.server.routine.entity.RoutineType.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.exception.MemberException; import com.soptie.server.memberroutine.adapter.MemberRoutineDeleter; import com.soptie.server.memberroutine.adapter.MemberRoutineFinder; import com.soptie.server.memberroutine.entity.MemberRoutine; @@ -27,11 +29,23 @@ public class MemberRoutineUpdateService { public MemberRoutineAchieveServiceResponse achieveMemberRoutine(MemberRoutineAchieveServiceRequest request) { val member = memberFinder.findById(request.memberId()); val memberRoutine = memberRoutineFinder.findById(request.memberRoutineId()); - memberRoutine.checkMemberHas(member); - memberRoutine.achieve(); - member.addCottonCount(memberRoutine.getType()); - deleteMemberRoutineIfTypeIsOneTime(memberRoutine); - return MemberRoutineAchieveServiceResponse.of(memberRoutine); + val isAchievedToday = memberRoutine.isAchieveToday(); + + if (memberRoutine.getMember() != member) { + throw new MemberException(INACCESSIBLE_ROUTINE); + } + + if (memberRoutine.isAchieve()) { + memberRoutine.cancelAchievement(); + } else { + if (!isAchievedToday) { + member.addCottonCount(memberRoutine.getType()); + } + memberRoutine.achieve(); + deleteMemberRoutineIfTypeIsOneTime(memberRoutine); + } + + return MemberRoutineAchieveServiceResponse.of(memberRoutine, !isAchievedToday); } public void initDailyRoutines() { diff --git a/src/main/java/com/soptie/server/memberroutine/service/dto/response/MemberRoutineAchieveServiceResponse.java b/src/main/java/com/soptie/server/memberroutine/service/dto/response/MemberRoutineAchieveServiceResponse.java index 676a4531..5f5ac920 100644 --- a/src/main/java/com/soptie/server/memberroutine/service/dto/response/MemberRoutineAchieveServiceResponse.java +++ b/src/main/java/com/soptie/server/memberroutine/service/dto/response/MemberRoutineAchieveServiceResponse.java @@ -10,14 +10,16 @@ public record MemberRoutineAchieveServiceResponse( long routineId, boolean isAchieve, - int achieveCount + int achieveCount, + boolean hasCotton ) { - public static MemberRoutineAchieveServiceResponse of(MemberRoutine routine) { + public static MemberRoutineAchieveServiceResponse of(MemberRoutine routine, boolean hasCotton) { return MemberRoutineAchieveServiceResponse.builder() .routineId(routine.getId()) .isAchieve(routine.isAchieve()) .achieveCount(routine.getAchieveCount()) + .hasCotton(hasCotton) .build(); } }