Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[REFACTOR] 회원 루틴 서비스 분리 #269

Merged
merged 3 commits into from
May 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -39,16 +42,19 @@
@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<SuccessResponse<MemberDailyRoutineCreateResponse>> createMemberDailyRoutine(
Principal principal,
@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));
Expand All @@ -60,7 +66,7 @@ public ResponseEntity<BaseResponse> deleteMemberDailyRoutines(
@RequestParam List<Long> 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()));
}

Expand All @@ -71,15 +77,16 @@ public ResponseEntity<SuccessResponse<MemberDailyRoutineAchieveResponse>> 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));
}

@GetMapping
public ResponseEntity<SuccessResponse<MemberDailyRoutineListGetResponse>> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<SuccessResponse<MemberHappinessRoutineCreateResponse>> 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()))
Expand All @@ -45,7 +51,7 @@ public ResponseEntity<SuccessResponse<MemberHappinessRoutineCreateResponse>> 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))))
Expand All @@ -55,14 +61,14 @@ public ResponseEntity<?> getMemberHappinessRoutine(Principal principal) {
@DeleteMapping("/routine/{routineId}")
public ResponseEntity<BaseResponse> 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<BaseResponse> 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()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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<Long> 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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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<MemberRoutine> filterMemberRoutines(Member member, List<Long> routineIds) {
return routineIds.stream()
.map(memberRoutineFinder::findById)
.filter(routine -> routine.getMember().equals(member))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -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<MemberHappinessRoutineGetServiceResponse> getHappinessRoutine(
MemberHappinessRoutineGetServiceRequest request
) {
val member = memberFinder.findById(request.memberId());
val memberRoutine = memberRoutineFinder.findChallengeByMember(member);
return memberRoutine.map(MemberHappinessRoutineGetServiceResponse::of);
}
}
Loading
Loading