Skip to content

Commit

Permalink
refactor(#69): 피드백 부분 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
ghdcksgml1 committed Oct 20, 2023
1 parent 0b65104 commit 7ccc043
Show file tree
Hide file tree
Showing 7 changed files with 137 additions and 65 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.heachi.housework.api.controller.housework.info;

import com.heachi.admin.common.exception.HeachiException;
import com.heachi.admin.common.exception.auth.AuthException;
import com.heachi.admin.common.exception.housework.HouseworkException;
import com.heachi.admin.common.response.JsonResult;
import com.heachi.external.clients.auth.response.UserInfoResponse;
import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoCreateRequest;
import com.heachi.housework.api.service.auth.AuthExternalService;
import com.heachi.housework.api.service.housework.info.HouseworkInfoService;
Expand All @@ -22,19 +19,18 @@ public class HouseworkInfoController {
private final AuthExternalService authExternalService;

@PostMapping("/{groupId}")
public JsonResult<?> createHouseworkInfo(
@RequestHeader(name = "Authorization") String authorization,
@PathVariable(name = "groupId") Long groupId,
@RequestBody HouseworkInfoCreateRequest request
public JsonResult<?> createHouseworkInfo(@RequestHeader(name = "Authorization") String authorization,
@PathVariable(name = "groupId") Long groupId,
@RequestBody HouseworkInfoCreateRequest request
) {
// Auth 서버로 요청자 인증 요청 - 해당 그룹원인지 판별하고 상태가 ACCEPT인지 확인
try {
authExternalService.userAuthenticateAndGroupMatch(authorization, groupId);

houseworkInfoService.createHouseworkInfo(HouseworkInfoCreateServiceRequest.of(request));

return JsonResult.successOf("Housework Create Success.");
} catch (HeachiException e) {

return JsonResult.failOf(e.getMessage());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public class HouseworkInfoCreateRequest {
private String title; // 집안일 제목
private String detail; // 집안일 내용

@Enumerated(EnumType.STRING)
@NotNull
@Enumerated(EnumType.STRING)
private HouseworkPeriodType type; // 집안일 주기 타입 (한번, 매일, 매주, 매달)

private LocalDate dayDate; // 단건: 날짜 정보
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,85 +3,110 @@
import com.heachi.admin.common.exception.ExceptionMessage;
import com.heachi.admin.common.exception.group.member.GroupMemberException;
import com.heachi.admin.common.exception.housework.HouseworkException;
import com.heachi.external.clients.auth.response.UserInfoResponse;
import com.heachi.housework.api.service.housework.info.request.HouseworkInfoCreateServiceRequest;
import com.heachi.mysql.define.group.info.repository.GroupInfoRepository;
import com.heachi.mysql.define.group.member.GroupMember;
import com.heachi.mysql.define.group.member.repository.GroupMemberRepository;
import com.heachi.mysql.define.housework.category.HouseworkCategory;
import com.heachi.mysql.define.housework.category.repository.HouseworkCategoryRepository;
import com.heachi.mysql.define.housework.info.HouseworkInfo;
import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType;
import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository;
import com.heachi.mysql.define.housework.member.HouseworkMember;
import com.heachi.mysql.define.housework.member.repository.HouseworkMemberRepository;
import com.heachi.mysql.define.housework.save.repository.HouseworkSaveRepository;
import com.heachi.mysql.define.user.repository.UserRepository;
import com.heachi.mysql.define.housework.todo.HouseworkTodo;
import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus;
import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository;
import com.heachi.redis.define.housework.todo.TodoList;
import com.heachi.redis.define.housework.todo.repository.TodoListRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Slf4j
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class HouseworkInfoService {
private final UserRepository userRepository;
private final GroupInfoRepository groupInfoRepository;
private final HouseworkSaveRepository houseworkSaveRepository;
private final HouseworkInfoRepository houseworkInfoRepository;
private final HouseworkMemberRepository houseworkMemberRepository;
private final GroupMemberRepository groupMemberRepository;
private final HouseworkCategoryRepository houseworkCategoryRepository;
private final HouseworkTodoRepository houseworkTodoRepository;

private final TodoListRepository todoListRepository;

@Transactional(readOnly = false)
public void createHouseworkInfo(HouseworkInfoCreateServiceRequest request) {
try {
// HOUSEWORK_CATEGORY 조회
HouseworkCategory category = houseworkCategoryRepository.findById(request.getHouseworkCategoryId()).orElseThrow(() -> {
log.warn(">>>> HouseworkCategory Not Found : {}", ExceptionMessage.HOUSEWORK_CATEGORY_NOT_FOUND);
log.warn(">>>> HouseworkCategory Not Found : {}", ExceptionMessage.HOUSEWORK_CATEGORY_NOT_FOUND.getText());

throw new HouseworkException(ExceptionMessage.HOUSEWORK_CATEGORY_NOT_FOUND);
});

// HOUSEWORK_INFO 생성
HouseworkInfo houseworkInfo = HouseworkInfo.builder()
.houseworkCategory(category)
.title(request.getTitle())
.detail(request.getDetail())
.type(request.getType())
.dayDate(request.getDayDate())
.weekDate(request.getWeekDate())
.monthDate(request.getMonthDate())
.endTime(request.getEndTime())
.build();

// HOUSEWORK_INFO 저장
HouseworkInfo savedHousework = houseworkInfoRepository.save(houseworkInfo);
log.info(">>>> HouseworkInfo Create: {}", savedHousework);


// 담당자 지정 - HOUSEWORK_MEMBER 생성
List<GroupMember> groupMemberList = groupMemberRepository.findGroupMemberListByGroupMemberIdList(request.getGroupMemberIdList());

// 한 건이라도 조회 실패시 예외 발생
if (groupMemberList.size() != request.getGroupMemberIdList().size()) {
log.warn(">>>> GourpMember Not Found : {}", ExceptionMessage.GROUP_MEMBER_NOT_FOUND);
log.warn(">>>> GourpMember Not Found : {}", ExceptionMessage.GROUP_MEMBER_NOT_FOUND.getText());

throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_NOT_FOUND);
}

for (GroupMember gm : groupMemberList) {
HouseworkMember hm = HouseworkMember.builder()
.groupMember(gm)
.houseworkInfo(houseworkInfo)
.build();
// HOUSEWORK_MEMBER 저장
houseworkMemberRepository.save(hm);
// 딱 한번 하는 집안일의 경우 HOUSEWORK_INFO를 생성해줄 필요 없이, 바로 HOUSEWORK_TODO로 생성
if (request.getType() == HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) {

// HouseworkTodo 생성
houseworkTodoRepository.save(HouseworkTodo.builder()
.houseworkInfo(null) // 단건은 HouseworkInfo가 존재하지 않는다.
.groupInfo(groupMemberList.isEmpty() ? null : groupMemberList.get(0).getGroupInfo())
.houseworkMember(groupMemberList.stream()
.map(gm -> gm.getId().toString())
.collect(Collectors.joining(",")))
.category(category.getName())
.title(request.getTitle())
.detail(request.getDetail())
.status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE)
.date(request.getDayDate())
.endTime(request.getEndTime())
.build());

// TODO: 해당 HouseworkTodo에 맞는 groupInfoId와 Date가 캐싱되어있다면, dirtyBit를 true로 바꿔줘야함.

return ;
}

// HOUSEWORK_INFO 저장
HouseworkInfo houseworkInfo = houseworkInfoRepository.save(HouseworkInfo.builder()
.houseworkCategory(category)
.title(request.getTitle())
.detail(request.getDetail())
.type(request.getType())
.dayDate(request.getDayDate())
.weekDate(request.getWeekDate())
.monthDate(request.getMonthDate())
.endTime(request.getEndTime())
.build());
log.info(">>>> HouseworkInfo Create: {}", houseworkInfo.getId());

groupMemberList.stream()
.map(gm -> HouseworkMember.builder()
.groupMember(gm)
.houseworkInfo(houseworkInfo)
.build())
// HOUSEWORK_MEMBER 저장
.forEach(houseworkMemberRepository::save);

} catch (RuntimeException e) {
log.warn(">>>> Housework Add Fail : {}", e.getMessage());

throw e;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,10 @@

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HouseworkInfoCreateServiceRequest {
private List<Long> groupMemberIdList;
private Long houseworkCategoryId;
Expand All @@ -26,7 +24,23 @@ public class HouseworkInfoCreateServiceRequest {
private String monthDate;
private LocalTime endTime;

@Builder
private HouseworkInfoCreateServiceRequest(List<Long> groupMemberIdList, Long houseworkCategoryId, String title,
String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate,
String monthDate, LocalTime endTime) {
this.groupMemberIdList = groupMemberIdList == null ? new ArrayList<>() : groupMemberIdList;
this.houseworkCategoryId = houseworkCategoryId;
this.title = title;
this.detail = detail;
this.type = type;
this.dayDate = dayDate;
this.weekDate = weekDate;
this.monthDate = monthDate;
this.endTime = endTime;
}

public static HouseworkInfoCreateServiceRequest of(HouseworkInfoCreateRequest request) {

return HouseworkInfoCreateServiceRequest.builder()
.groupMemberIdList(request.getGroupMemberIdList())
.houseworkCategoryId(request.getHouseworkCategoryId())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType;
import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository;
import com.heachi.mysql.define.housework.member.repository.HouseworkMemberRepository;
import com.heachi.mysql.define.housework.todo.HouseworkTodo;
import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository;
import com.heachi.mysql.define.user.User;
import com.heachi.mysql.define.user.repository.UserRepository;
import org.junit.jupiter.api.AfterEach;
Expand All @@ -30,6 +32,7 @@
import org.springframework.boot.test.mock.mockito.MockBean;
import reactor.core.publisher.Mono;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -43,23 +46,14 @@
@SpringBootTest
class HouseworkInfoServiceTest extends TestConfig {

@Autowired
private GroupMemberRepository groupMemberRepository;

@Autowired
private UserRepository userRepository;

@Autowired
private HouseworkInfoRepository houseworkInfoRepository;

@Autowired
private HouseworkInfoService houseworkInfoService;
@Autowired
private HouseworkCategoryRepository houseworkCategoryRepository;
@Autowired
private GroupInfoRepository groupInfoRepository;
@Autowired
private HouseworkMemberRepository houseworkMemberRepository;
@Autowired private GroupMemberRepository groupMemberRepository;
@Autowired private UserRepository userRepository;
@Autowired private HouseworkInfoRepository houseworkInfoRepository;
@Autowired private HouseworkInfoService houseworkInfoService;
@Autowired private HouseworkCategoryRepository houseworkCategoryRepository;
@Autowired private GroupInfoRepository groupInfoRepository;
@Autowired private HouseworkMemberRepository houseworkMemberRepository;
@Autowired private HouseworkTodoRepository houseworkTodoRepository;

@AfterEach
void tearDown() {
Expand Down Expand Up @@ -175,4 +169,42 @@ void createHouseworkInfoFailWhenNotFoundGroupMember() {
GroupMemberException exception = assertThrows(GroupMemberException.class, () -> houseworkInfoService.createHouseworkInfo(request));
assertEquals(exception.getMessage(), ExceptionMessage.GROUP_MEMBER_NOT_FOUND.getText());
}

@Test
@DisplayName("딱 한번하는 집안일의 경우, HOUSEWORK_INFO가 생성되지 않고, HOUSEWORK_TODO가 바로 생성된다.")
void createHouseworkInfoWhenPeriodDay() {
// given
HouseworkCategory category = generateHouseworkCategory();
houseworkCategoryRepository.save(category);

User user = generateUser();
userRepository.save(user);

GroupInfo groupInfo = generateGroupInfo(user);
groupInfoRepository.save(groupInfo);

GroupMember groupMember = generateGroupMember(user, groupInfo);
groupMemberRepository.save(groupMember);

HouseworkInfoCreateServiceRequest request = HouseworkInfoCreateServiceRequest.builder()
.houseworkCategoryId(category.getId())
.groupMemberIdList(null)
.type(HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) // 단건
.title("Test")
.detail("Test")
.dayDate(LocalDate.now())
.weekDate(null)
.monthDate(null)
.endTime(LocalTime.now())
.build();

// when
houseworkInfoService.createHouseworkInfo(request);
List<HouseworkInfo> infoList = houseworkInfoRepository.findAll();
List<HouseworkTodo> todoList = houseworkTodoRepository.findAll();

// then
assertThat(infoList.size()).isEqualTo(0);
assertThat(todoList.size()).isEqualTo(1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface GroupMemberRepositoryCustom {
// GroupId를 통해 그룹의 구성원을 리턴해주는 쿼리
public List<GroupMember> findGroupMemberByGroupId(Long groupId);

// HouseworkInfo 조회하는데 List<GroupMember>로 조회한다. - 집안일 추가시 담당자 지정을 위해 필요
// 그룹 멤버의 ID 리스트에 해당하는 그룹멤버들을 조회한다. (그룹원인 경우만 = ACCEPT) - 집안일 추가시 담당자 지정을 위해 필요
public List<GroupMember> findGroupMemberListByGroupMemberIdList(List<Long> groupMemberIdList);

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.heachi.mysql.define.group.member.repository;

import com.heachi.mysql.define.group.info.QGroupInfo;
import com.heachi.mysql.define.group.member.GroupMember;
import com.heachi.mysql.define.group.member.constant.GroupMemberStatus;
import com.querydsl.jpa.JPAExpressions;
Expand All @@ -9,6 +10,7 @@

import java.util.List;

import static com.heachi.mysql.define.group.info.QGroupInfo.*;
import static com.heachi.mysql.define.group.member.QGroupMember.groupMember;
import static com.heachi.mysql.define.user.QUser.user;

Expand Down Expand Up @@ -45,9 +47,12 @@ public List<GroupMember> findGroupMemberByGroupId(Long groupId) {

@Override
public List<GroupMember> findGroupMemberListByGroupMemberIdList(List<Long> groupMemberIdList) {
// select gm from groupMember gm where gm.id in groupMemberIdList

// select gm from groupMember gm where gm.id in groupMemberIdList and gm.status = 'ACCEPT'
return queryFactory.selectFrom(groupMember)
.where(groupMember.id.in(groupMemberIdList))
.innerJoin(groupMember.groupInfo, groupInfo).fetchJoin()
.where(groupMember.id.in(groupMemberIdList)
.and(groupMember.status.eq(GroupMemberStatus.ACCEPT)))
.fetch();
}
}

0 comments on commit 7ccc043

Please sign in to comment.