diff --git a/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java b/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java index a78e49f9..89bd159d 100644 --- a/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java +++ b/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java @@ -11,7 +11,8 @@ import com.soptie.server.member.exception.MemberException; import com.soptie.server.member.repository.MemberRepository; import com.soptie.server.memberDoll.service.MemberDollService; -import com.soptie.server.memberRoutine.service.MemberRoutineService; +import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; + import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ public class MemberServiceImpl implements MemberService { private final MemberDollService memberDollService; - private final MemberRoutineService memberRoutineService; + private final MemberRoutineCreateService memberRoutineCreateService; private final MemberRepository memberRepository; private final ConversationRepository conversationRepository; @@ -36,7 +37,7 @@ public class MemberServiceImpl implements MemberService { public void createMemberProfile(MemberProfileCreateServiceRequest request) { val member = findMember(request.memberId()); member.checkMemberDollNonExist(); - memberRoutineService.createDailyRoutines(member, request.routines()); + memberRoutineCreateService.createDailyRoutines(member, request.routines()); memberDollService.createMemberDoll(member, request.dollType(), request.name()); } diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java index a3e74798..cee42cf1 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java +++ b/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java @@ -24,8 +24,11 @@ import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineCreateResponse; import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineListGetResponse; -import com.soptie.server.memberRoutine.service.MemberRoutineService; +import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.memberRoutine.service.MemberRoutineDeleteService; +import com.soptie.server.memberRoutine.service.MemberRoutineReadService; +import com.soptie.server.memberRoutine.service.MemberRoutineUpdateService; import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; @@ -39,7 +42,10 @@ @RequestMapping("/api/v1/routines/daily/member") public class MemberDailyRoutineController implements MemberDailyRoutineApi { - private final MemberRoutineService memberRoutineService; + private final MemberRoutineCreateService memberRoutineCreateService; + private final MemberRoutineReadService memberRoutineReadService; + private final MemberRoutineUpdateService memberRoutineUpdateService; + private final MemberRoutineDeleteService memberRoutineDeleteService; @PostMapping public ResponseEntity> createMemberDailyRoutine( @@ -47,8 +53,8 @@ public ResponseEntity> createM @RequestBody MemberDailyRoutineCreateRequest request ) { val memberId = Long.parseLong(principal.getName()); - val response = MemberDailyRoutineCreateResponse - .of(memberRoutineService.createDailyRoutine(MemberDailyRoutineCreateServiceRequest.of(memberId, request))); + val response = MemberDailyRoutineCreateResponse.of(memberRoutineCreateService.createDailyRoutine( + MemberDailyRoutineCreateServiceRequest.of(memberId, request))); return ResponseEntity .created(UriGenerator.getURI("/api/v1/routines/daily/member/", response.routineId())) .body(success(SUCCESS_CREATE_ROUTINE.getMessage(), response)); @@ -60,7 +66,7 @@ public ResponseEntity deleteMemberDailyRoutines( @RequestParam List routines ) { val memberId = Long.parseLong(principal.getName()); - memberRoutineService.deleteMemberRoutines(MemberRoutinesDeleteServiceRequest.of(memberId, routines)); + memberRoutineDeleteService.deleteMemberRoutines(MemberRoutinesDeleteServiceRequest.of(memberId, routines)); return ResponseEntity.ok(success(SUCCESS_DELETE_ROUTINE.getMessage())); } @@ -71,7 +77,8 @@ public ResponseEntity> achiev ) { val memberId = Long.parseLong(principal.getName()); val response = MemberDailyRoutineAchieveResponse - .of(memberRoutineService.achieveMemberRoutine(MemberRoutineAchieveServiceRequest.of(memberId, routineId))); + .of(memberRoutineUpdateService.achieveMemberRoutine( + MemberRoutineAchieveServiceRequest.of(memberId, routineId))); return ResponseEntity.ok(success(SUCCESS_ACHIEVE_ROUTINE.getMessage(), response)); } @@ -79,7 +86,7 @@ public ResponseEntity> achiev public ResponseEntity> getMemberDailyRoutines(Principal principal) { val memberId = Long.parseLong(principal.getName()); val response = MemberDailyRoutineListGetResponse - .of(memberRoutineService.getDailyRoutines(MemberDailyRoutineListGetServiceRequest.of(memberId))); + .of(memberRoutineReadService.getDailyRoutines(MemberDailyRoutineListGetServiceRequest.of(memberId))); return ResponseEntity.ok(success(SUCCESS_GET_ROUTINE.getMessage(), response)); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java index 2a2bd7f0..08e302f1 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java +++ b/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java @@ -7,7 +7,10 @@ import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberHappinessRoutineRequest; import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberHappinessRoutineCreateResponse; import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberHappinessRoutineGetResponse; -import com.soptie.server.memberRoutine.service.MemberRoutineService; +import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; +import com.soptie.server.memberRoutine.service.MemberRoutineDeleteService; +import com.soptie.server.memberRoutine.service.MemberRoutineReadService; +import com.soptie.server.memberRoutine.service.MemberRoutineUpdateService; import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; @@ -29,13 +32,16 @@ @RequestMapping("/api/v1/routines/happiness/member") public class MemberHappinessRoutineController implements MemberHappinessRoutineApi { - private final MemberRoutineService memberRoutineService; + private final MemberRoutineCreateService memberRoutineCreateService; + private final MemberRoutineReadService memberRoutineReadService; + private final MemberRoutineUpdateService memberRoutineUpdateService; + private final MemberRoutineDeleteService memberRoutineDeleteService; @PostMapping public ResponseEntity> createMemberHappinessRoutine( Principal principal, @RequestBody MemberHappinessRoutineRequest request) { val memberId = Long.parseLong(principal.getName()); - val response = MemberHappinessRoutineCreateResponse.of(memberRoutineService.createHappinessRoutine( + val response = MemberHappinessRoutineCreateResponse.of(memberRoutineCreateService.createHappinessRoutine( MemberHappinessRoutineCreateServiceRequest.of(memberId, request))); return ResponseEntity .created(UriGenerator.getURI("/api/v1/routines/happiness/member", response.routineId())) @@ -45,7 +51,7 @@ public ResponseEntity> cre @GetMapping public ResponseEntity getMemberHappinessRoutine(Principal principal) { val memberId = Long.parseLong(principal.getName()); - return memberRoutineService.getHappinessRoutine(MemberHappinessRoutineGetServiceRequest.of(memberId)) + return memberRoutineReadService.getHappinessRoutine(MemberHappinessRoutineGetServiceRequest.of(memberId)) .map(response -> ResponseEntity.ok(SuccessResponse.success( SUCCESS_GET_ROUTINE.getMessage(), MemberHappinessRoutineGetResponse.of(response)))) @@ -55,14 +61,14 @@ public ResponseEntity getMemberHappinessRoutine(Principal principal) { @DeleteMapping("/routine/{routineId}") public ResponseEntity deleteMemberHappinessRoutine(Principal principal, @PathVariable Long routineId) { val memberId = Long.parseLong(principal.getName()); - memberRoutineService.deleteMemberRoutine(MemberRoutineDeleteServiceRequest.of(memberId, routineId)); + memberRoutineDeleteService.deleteMemberRoutine(MemberRoutineDeleteServiceRequest.of(memberId, routineId)); return ResponseEntity.ok(success(SUCCESS_DELETE_ROUTINE.getMessage())); } @PatchMapping("/routine/{routineId}") public ResponseEntity achieveMemberHappinessRoutine(Principal principal, @PathVariable Long routineId) { val memberId = Long.parseLong(principal.getName()); - memberRoutineService.achieveMemberRoutine(MemberRoutineAchieveServiceRequest.of(memberId, routineId)); + memberRoutineUpdateService.achieveMemberRoutine(MemberRoutineAchieveServiceRequest.of(memberId, routineId)); return ResponseEntity.ok(success(SUCCESS_ACHIEVE_ROUTINE.getMessage())); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java b/src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java index 3d9f058a..f308ff33 100644 --- a/src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java +++ b/src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java @@ -4,7 +4,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import com.soptie.server.memberRoutine.service.MemberRoutineService; +import com.soptie.server.memberRoutine.service.MemberRoutineUpdateService; import lombok.RequiredArgsConstructor; @@ -13,10 +13,10 @@ @RequiredArgsConstructor public class MemberDailyRoutineScheduler { - private final MemberRoutineService memberRoutineService; + private final MemberRoutineUpdateService memberRoutineUpdateService; @Scheduled(cron = "${softie.cron.init.routine}") public void initMemberDailyRoutines() { - memberRoutineService.initDailyRoutines(); + memberRoutineUpdateService.initDailyRoutines(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineCreateService.java b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineCreateService.java new file mode 100644 index 00000000..2f135ae0 --- /dev/null +++ b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineCreateService.java @@ -0,0 +1,70 @@ +package com.soptie.server.memberRoutine.service; + +import static com.soptie.server.routine.message.RoutineErrorCode.*; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.entity.Member; +import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; +import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver; +import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; +import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineCreateServiceResponse; +import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineCreateServiceResponse; +import com.soptie.server.routine.adapter.ChallengeFinder; +import com.soptie.server.routine.adapter.RoutineFinder; +import com.soptie.server.routine.entity.Routine; +import com.soptie.server.routine.exception.RoutineException; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@Service +@RequiredArgsConstructor +@Transactional +public class MemberRoutineCreateService { + + private final MemberRoutineSaver memberRoutineSaver; + private final MemberRoutineFinder memberRoutineFinder; + private final MemberFinder memberFinder; + private final RoutineFinder routineFinder; + private final ChallengeFinder challengeFinder; + + public MemberDailyRoutineCreateServiceResponse createDailyRoutine(MemberDailyRoutineCreateServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + val routine = routineFinder.findById(request.routineId()); + checkMemberHasSameRoutineAlready(member, routine); + val savedMemberRoutine = memberRoutineSaver.checkHasDeletedAndSave(member, routine); + return MemberDailyRoutineCreateServiceResponse.of(savedMemberRoutine); + } + + public void createDailyRoutines(Member member, List routineIds) { + routineIds.forEach(id -> memberRoutineSaver.checkHasDeletedAndSave(member, routineFinder.findById(id))); + } + + public MemberHappinessRoutineCreateServiceResponse createHappinessRoutine( + MemberHappinessRoutineCreateServiceRequest request + ) { + val member = memberFinder.findById(request.memberId()); + checkMemberHasChallengeAlready(member); + val challenge = challengeFinder.findById(request.challengeId()); + val savedMemberRoutine = memberRoutineSaver.checkHasDeletedAndSave(member, challenge); + return MemberHappinessRoutineCreateServiceResponse.of(savedMemberRoutine); + } + + private void checkMemberHasSameRoutineAlready(Member member, Routine routine) { + if (memberRoutineFinder.isExist(member, routine)) { + throw new RoutineException(DUPLICATED_ROUTINE); + } + } + + private void checkMemberHasChallengeAlready(Member member) { + if (memberRoutineFinder.existMemberChallenge(member)) { + throw new RoutineException(CANNOT_ADD_MEMBER_ROUTINE); + } + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineDeleteService.java b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineDeleteService.java new file mode 100644 index 00000000..2668428f --- /dev/null +++ b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineDeleteService.java @@ -0,0 +1,47 @@ +package com.soptie.server.memberRoutine.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.entity.Member; +import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; +import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; +import com.soptie.server.memberRoutine.entity.MemberRoutine; +import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineDeleteServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@Service +@RequiredArgsConstructor +@Transactional +public class MemberRoutineDeleteService { + + private final MemberRoutineFinder memberRoutineFinder; + private final MemberRoutineDeleter memberRoutineDeleter; + private final MemberFinder memberFinder; + + public void deleteMemberRoutines(MemberRoutinesDeleteServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + val routines = filterMemberRoutines(member, request.routineIds()); + routines.forEach(memberRoutineDeleter::softDelete); + } + + public void deleteMemberRoutine(MemberRoutineDeleteServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + val memberRoutine = memberRoutineFinder.findById(request.routineId()); + memberRoutine.checkMemberHas(member); + memberRoutineDeleter.softDelete(memberRoutine); + } + + private List filterMemberRoutines(Member member, List routineIds) { + return routineIds.stream() + .map(memberRoutineFinder::findById) + .filter(routine -> routine.getMember().equals(member)) + .toList(); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineReadService.java b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineReadService.java new file mode 100644 index 00000000..c5a8c837 --- /dev/null +++ b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineReadService.java @@ -0,0 +1,39 @@ +package com.soptie.server.memberRoutine.service; + +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; +import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; +import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse; +import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineGetServiceResponse; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberRoutineReadService { + + private final MemberRoutineFinder memberRoutineFinder; + private final MemberFinder memberFinder; + + public MemberDailyRoutineListGetServiceResponse getDailyRoutines(MemberDailyRoutineListGetServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + val routines = memberRoutineFinder.findDailyRoutinesByMember(member); + return MemberDailyRoutineListGetServiceResponse.of(routines); + } + + public Optional getHappinessRoutine( + MemberHappinessRoutineGetServiceRequest request + ) { + val member = memberFinder.findById(request.memberId()); + val memberRoutine = memberRoutineFinder.findChallengeByMember(member); + return memberRoutine.map(MemberHappinessRoutineGetServiceResponse::of); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineService.java b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineService.java deleted file mode 100644 index 81bd0e2e..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineService.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.soptie.server.memberRoutine.service; - -import static com.soptie.server.routine.entity.RoutineType.*; -import static com.soptie.server.routine.message.RoutineErrorCode.*; - -import java.util.List; -import java.util.Optional; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.soptie.server.member.adapter.MemberFinder; -import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; -import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineDeleteServiceRequest; -import com.soptie.server.memberRoutine.service.dto.response.MemberRoutineAchieveServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineCreateServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineCreateServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineGetServiceResponse; -import com.soptie.server.routine.adapter.ChallengeFinder; -import com.soptie.server.routine.adapter.RoutineFinder; -import com.soptie.server.routine.entity.Routine; -import com.soptie.server.routine.exception.RoutineException; - -import lombok.RequiredArgsConstructor; -import lombok.val; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class MemberRoutineService { - - private final MemberRoutineSaver memberRoutineSaver; - private final MemberRoutineFinder memberRoutineFinder; - private final MemberRoutineDeleter memberRoutineDeleter; - private final MemberFinder memberFinder; - private final RoutineFinder routineFinder; - private final ChallengeFinder challengeFinder; - - @Transactional - public MemberDailyRoutineCreateServiceResponse createDailyRoutine(MemberDailyRoutineCreateServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - val routine = routineFinder.findById(request.routineId()); - checkMemberHasSameRoutineAlready(member, routine); - val savedMemberRoutine = memberRoutineSaver.checkHasDeletedAndSave(member, routine); - return MemberDailyRoutineCreateServiceResponse.of(savedMemberRoutine); - } - - @Transactional - public void createDailyRoutines(Member member, List routineIds) { - routineIds.forEach(id -> memberRoutineSaver.checkHasDeletedAndSave(member, routineFinder.findById(id))); - } - - @Transactional - public void deleteMemberRoutines(MemberRoutinesDeleteServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - val routines = filterMemberRoutines(member, request.routineIds()); - routines.forEach(memberRoutineDeleter::softDelete); - } - - @Transactional - 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); - } - - public MemberDailyRoutineListGetServiceResponse getDailyRoutines(MemberDailyRoutineListGetServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - val routines = memberRoutineFinder.findDailyRoutinesByMember(member); - return MemberDailyRoutineListGetServiceResponse.of(routines); - } - - @Transactional - public void initDailyRoutines() { - val routines = memberRoutineFinder.findAchieved(); - routines.forEach(MemberRoutine::initAchieve); - } - - @Transactional - public MemberHappinessRoutineCreateServiceResponse createHappinessRoutine( - MemberHappinessRoutineCreateServiceRequest request - ) { - val member = memberFinder.findById(request.memberId()); - checkMemberHasChallengeAlready(member); - val challenge = challengeFinder.findById(request.challengeId()); - val savedMemberRoutine = memberRoutineSaver.checkHasDeletedAndSave(member, challenge); - return MemberHappinessRoutineCreateServiceResponse.of(savedMemberRoutine); - } - - public Optional getHappinessRoutine( - MemberHappinessRoutineGetServiceRequest request - ) { - val member = memberFinder.findById(request.memberId()); - val memberRoutine = memberRoutineFinder.findChallengeByMember(member); - return memberRoutine.map(MemberHappinessRoutineGetServiceResponse::of); - } - - @Transactional - public void deleteMemberRoutine(MemberRoutineDeleteServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - val memberRoutine = memberRoutineFinder.findById(request.routineId()); - memberRoutine.checkMemberHas(member); - memberRoutineDeleter.softDelete(memberRoutine); - } - - private List filterMemberRoutines(Member member, List routineIds) { - return routineIds.stream() - .map(memberRoutineFinder::findById) - .filter(routine -> routine.getMember().equals(member)) - .toList(); - } - - private void checkMemberHasSameRoutineAlready(Member member, Routine routine) { - if (memberRoutineFinder.isExist(member, routine)) { - throw new RoutineException(DUPLICATED_ROUTINE); - } - } - - public void checkMemberHasChallengeAlready(Member member) { - if (memberRoutineFinder.existMemberChallenge(member)) { - throw new RoutineException(CANNOT_ADD_MEMBER_ROUTINE); - } - } - - private void deleteMemberRoutineIfTypeIsOneTime(MemberRoutine memberRoutine) { - if (memberRoutine.getType().equals(CHALLENGE)) { - memberRoutineDeleter.softDelete(memberRoutine); - } - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineUpdateService.java b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineUpdateService.java new file mode 100644 index 00000000..ce16db46 --- /dev/null +++ b/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineUpdateService.java @@ -0,0 +1,67 @@ +package com.soptie.server.memberRoutine.service; + +import static com.soptie.server.routine.entity.RoutineType.*; +import static com.soptie.server.routine.message.RoutineErrorCode.*; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.entity.Member; +import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; +import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; +import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver; +import com.soptie.server.memberRoutine.entity.MemberRoutine; +import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineDeleteServiceRequest; +import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; +import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineCreateServiceResponse; +import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse; +import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineCreateServiceResponse; +import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineGetServiceResponse; +import com.soptie.server.memberRoutine.service.dto.response.MemberRoutineAchieveServiceResponse; +import com.soptie.server.routine.adapter.ChallengeFinder; +import com.soptie.server.routine.adapter.RoutineFinder; +import com.soptie.server.routine.entity.Routine; +import com.soptie.server.routine.exception.RoutineException; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@Service +@RequiredArgsConstructor +@Transactional +public class MemberRoutineUpdateService { + + private final MemberRoutineFinder memberRoutineFinder; + private final MemberRoutineDeleter memberRoutineDeleter; + private final MemberFinder memberFinder; + + 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); + } + + public void initDailyRoutines() { + val routines = memberRoutineFinder.findAchieved(); + routines.forEach(MemberRoutine::initAchieve); + } + + private void deleteMemberRoutineIfTypeIsOneTime(MemberRoutine memberRoutine) { + if (memberRoutine.getType().equals(CHALLENGE)) { + memberRoutineDeleter.softDelete(memberRoutine); + } + } +} diff --git a/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java b/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java index 4f8aa306..8bc580e7 100644 --- a/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java +++ b/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java @@ -15,7 +15,7 @@ import com.soptie.server.member.repository.MemberRepository; import com.soptie.server.memberDoll.entity.MemberDoll; import com.soptie.server.memberDoll.service.MemberDollServiceImpl; -import com.soptie.server.memberRoutine.service.MemberRoutineService; +import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; import com.soptie.server.support.fixture.ConversationFixture; import com.soptie.server.support.fixture.DollFixture; import com.soptie.server.support.fixture.MemberDollFixture; @@ -43,7 +43,7 @@ class MemberServiceImplTest { private MemberServiceImpl memberService; @Mock - private MemberRoutineService memberRoutineService; + private MemberRoutineCreateService memberRoutineCreateService; @Mock private MemberDollServiceImpl memberDollService; @@ -64,14 +64,14 @@ class MemberServiceImplTest { String name = "memberDoll"; List routines = List.of(2L, 3L, 4L); MemberProfileCreateRequest request = new MemberProfileCreateRequest(dollType, name, routines); - doNothing().when(memberRoutineService).createDailyRoutines(member, List.of(2L, 3L, 4L)); + doNothing().when(memberRoutineCreateService).createDailyRoutines(member, List.of(2L, 3L, 4L)); doNothing().when(memberDollService).createMemberDoll(member, dollType, name); // when memberService.createMemberProfile(MemberProfileCreateServiceRequest.of(memberId, request)); // then - verify(memberRoutineService).createDailyRoutines(member, routines); + verify(memberRoutineCreateService).createDailyRoutines(member, routines); verify(memberDollService).createMemberDoll(member, dollType, name); } diff --git a/src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java b/src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java index 8acfbb82..5ce45b1a 100644 --- a/src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java +++ b/src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java @@ -29,7 +29,7 @@ class MemberRoutineServiceTest { @InjectMocks - private MemberRoutineService memberRoutineService; + private MemberRoutineUpdateService memberRoutineUpdateService; @Mock private MemberFinder memberFinder; @@ -65,7 +65,7 @@ void shouldUpdateAchieveCountAndCottonCountWhenAchieveDailyRoutine() { ); // when - memberRoutineService.achieveMemberRoutine(request); + memberRoutineUpdateService.achieveMemberRoutine(request); // then assertThat(memberRoutine.isAchieve()).isTrue(); @@ -99,7 +99,7 @@ void shouldUpdateAchieveCountAndCottonCountWhenAchieveHappinessRoutine() { ); // when - memberRoutineService.achieveMemberRoutine(request); + memberRoutineUpdateService.achieveMemberRoutine(request); // then assertThat(memberRoutine.isAchieve()).isTrue(); @@ -119,7 +119,7 @@ void updateAchieveFalseAchievedMemberRoutine() { doReturn(memberRoutines).when(memberRoutineFinder).findAchieved(); // when - memberRoutineService.initDailyRoutines(); + memberRoutineUpdateService.initDailyRoutines(); // then assertThat(memberRoutines.get(0).isAchieve()).isFalse(); diff --git a/src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java b/src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java index 4518a256..1f2c7791 100644 --- a/src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java @@ -22,7 +22,9 @@ import com.soptie.server.memberRoutine.entity.MemberRoutine; import com.soptie.server.memberRoutine.repository.DeletedMemberRoutineRepository; import com.soptie.server.memberRoutine.repository.MemberRoutineRepository; -import com.soptie.server.memberRoutine.service.MemberRoutineService; +import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; +import com.soptie.server.memberRoutine.service.MemberRoutineDeleteService; +import com.soptie.server.memberRoutine.service.MemberRoutineReadService; import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; @@ -50,7 +52,13 @@ public class MemberRoutineServiceIntegrationTest { @Autowired - MemberRoutineService memberRoutineService; + MemberRoutineCreateService memberRoutineCreateService; + + @Autowired + MemberRoutineReadService memberRoutineReadService; + + @Autowired + MemberRoutineDeleteService memberRoutineDeleteService; @Autowired MemberRepository memberRepository; @@ -92,7 +100,7 @@ void createHasNotDeletedDailyRoutine() { ); // when - memberRoutineService.createDailyRoutine(request); + memberRoutineCreateService.createDailyRoutine(request); // then assertThat(memberRoutineRepository @@ -119,7 +127,7 @@ void createHasDeletedDailyRoutine() { ); // when - memberRoutineService.createDailyRoutine(request); + memberRoutineCreateService.createDailyRoutine(request); // then final MemberRoutine found = memberRoutineRepository @@ -143,7 +151,7 @@ void cannotCreateDailyRoutineIfAlreadyHave() { ); // when & then - assertThatThrownBy(() -> memberRoutineService.createDailyRoutine(request)) + assertThatThrownBy(() -> memberRoutineCreateService.createDailyRoutine(request)) .isInstanceOf(RoutineException.class) .hasMessage("[RoutineException] : " + DUPLICATED_ROUTINE.getMessage()); } @@ -178,7 +186,7 @@ void createHasNotDeletedHappinessRoutine() { ); // when - memberRoutineService.createHappinessRoutine(request); + memberRoutineCreateService.createHappinessRoutine(request); // then assertThat(memberRoutineRepository @@ -205,7 +213,7 @@ void createHasDeletedDailyRoutine() { ); // when - memberRoutineService.createHappinessRoutine(request); + memberRoutineCreateService.createHappinessRoutine(request); // then final MemberRoutine found = memberRoutineRepository @@ -230,7 +238,7 @@ void cannotCreateChallengeRoutineIfAlreadyHaveOne() { ); // when & then - assertThatThrownBy(() -> memberRoutineService.createHappinessRoutine(request)) + assertThatThrownBy(() -> memberRoutineCreateService.createHappinessRoutine(request)) .isInstanceOf(RoutineException.class) .hasMessage("[RoutineException] : " + CANNOT_ADD_MEMBER_ROUTINE.getMessage()); } @@ -267,7 +275,7 @@ void deleteMemberDailyRoutines() { ); // when - memberRoutineService.deleteMemberRoutines(request); + memberRoutineDeleteService.deleteMemberRoutines(request); // then assertThat(memberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId())).isFalse(); @@ -308,7 +316,7 @@ void getMemberDailyRoutinesByMember() { MemberDailyRoutineListGetServiceRequest request = MemberDailyRoutineListGetServiceRequest.of(member1.getId()); // when - final MemberDailyRoutineListGetServiceResponse actual = memberRoutineService.getDailyRoutines(request); + final MemberDailyRoutineListGetServiceResponse actual = memberRoutineReadService.getDailyRoutines(request); // then List contents = actual.routines().stream().map(MemberDailyRoutineServiceResponse::content).toList(); @@ -346,7 +354,7 @@ void getMemberHappinessRoutine() { MemberHappinessRoutineGetServiceRequest request = MemberHappinessRoutineGetServiceRequest.of(member.getId()); // when - final Optional actual = memberRoutineService + final Optional actual = memberRoutineReadService .getHappinessRoutine(request); // then @@ -364,7 +372,7 @@ void getEmptyWhenMemberHasNotHappinessRoutine() { MemberHappinessRoutineGetServiceRequest request = MemberHappinessRoutineGetServiceRequest.of(member.getId()); // when - final Optional actual = memberRoutineService + final Optional actual = memberRoutineReadService .getHappinessRoutine(request); // then