Skip to content

Commit

Permalink
Merge pull request #110 from ghdcksgml1/feat(#104)-houseworkInfo-delete
Browse files Browse the repository at this point in the history
Feat(#104) housework info delete
  • Loading branch information
ghdcksgml1 authored Nov 17, 2023
2 parents d1d4ca9 + 1da017f commit baea901
Show file tree
Hide file tree
Showing 17 changed files with 694 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@
import com.heachi.admin.common.exception.HeachiException;
import com.heachi.admin.common.response.JsonResult;
import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoCreateRequest;
import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoDeleteType;
import com.heachi.housework.api.service.auth.AuthExternalService;
import com.heachi.housework.api.service.housework.info.HouseworkInfoService;
import com.heachi.housework.api.service.housework.info.request.HouseworkInfoCreateServiceRequest;
import com.heachi.housework.api.service.housework.info.request.HouseworkInfoDeleteRequest;
import com.heachi.housework.api.service.housework.todo.request.TodoSelectRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

@Slf4j
@RequiredArgsConstructor
@RequestMapping("/housework")
Expand All @@ -35,4 +40,23 @@ public JsonResult<?> createHouseworkInfo(@RequestHeader(name = "Authorization")
return JsonResult.failOf(e.getMessage());
}
}

@PostMapping("/delete/{groupId}")
public JsonResult<?> deleteHouseworkInfo(@RequestHeader(name = "Authorization") String authorization,
@PathVariable(name = "groupId") Long groupId,
@RequestParam(name = "date") LocalDate date,
@RequestParam(name = "todoId") Long todoId,
@RequestParam(name = "deleteType") HouseworkInfoDeleteType deleteType) {
try {
// 유저 인증 & 그룹원(ACCEPT)인지 권한 확인
authExternalService.userAuthenticateAndGroupMatch(authorization, groupId);
houseworkInfoService.deleteHouseworkInfo(
HouseworkInfoDeleteRequest.builder().groupId(groupId).date(date).todoId(todoId).deleteType(deleteType).build());

return JsonResult.successOf("Housework Delete Success.");
} catch (HeachiException e) {
return JsonResult.failOf(e.getMessage());
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.heachi.housework.api.controller.housework.info.request;

public enum HouseworkInfoDeleteType {
ALL, ONE
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.heachi.housework.api.service.housework.info;

import com.heachi.admin.common.exception.ExceptionMessage;
import com.heachi.admin.common.exception.HeachiException;
import com.heachi.admin.common.exception.group.info.GroupInfoException;
import com.heachi.admin.common.exception.group.member.GroupMemberException;
import com.heachi.admin.common.exception.housework.HouseworkException;
import com.heachi.admin.common.utils.DayOfWeekUtils;
import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoDeleteType;
import com.heachi.housework.api.service.housework.info.request.HouseworkInfoCreateServiceRequest;
import com.heachi.housework.api.service.housework.info.request.HouseworkInfoDeleteRequest;
import com.heachi.mysql.define.group.info.GroupInfo;
import com.heachi.mysql.define.group.info.repository.GroupInfoRepository;
import com.heachi.mysql.define.group.member.GroupMember;
Expand All @@ -27,8 +30,10 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Slf4j
Expand Down Expand Up @@ -145,4 +150,88 @@ public void createHouseworkInfo(HouseworkInfoCreateServiceRequest request) {
throw e;
}
}

@Transactional(readOnly = false)
public void deleteHouseworkInfo(HouseworkInfoDeleteRequest request) {
Long groupId = request.getGroupId();
LocalDate requestDate = request.getDate();
Long todoId = request.getTodoId();
HouseworkInfoDeleteType deleteType = request.getDeleteType();


try {
// HouseworkTodo 조회 -> HouseworkInfo도 fetch Join 함께 조회
HouseworkTodo requestTodo = houseworkTodoRepository.findHouseworkTodoByIdJoinFetchHouseworkInfo(todoId).orElseThrow(() -> {
log.warn(">>>> HouseworkTodo Not Found : {}", ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND.getText());

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

HouseworkInfo houseworkInfo = requestTodo.getHouseworkInfo();

// 단건 집안일(HOUSEWORK_PERIOD_DAY)이거나 비단건 집안일이지만 해당 건만 삭제하고 싶을 경우
if (houseworkInfo == null || deleteType == HouseworkInfoDeleteType.ONE) {
// HouseworkTodoStatus를 DELETE로 변경
requestTodo.deleteHouseworkTodo();

// 요청 날짜의 todoList를 조회 후 dirtyBit 체킹
todoListRepository.findByGroupInfoIdAndDate(groupId, requestDate)
.ifPresent(todoList -> {
todoList.checkDirtyBit();
todoListRepository.save(todoList);
log.info(">>>> dirtyBit Checking TodoList id: {}", todoList.getId());
});

// 비단건 집안일(HOUSEWORK_PERIOD_DAY를 제외한 모든 경우)이고 반복되는 모든 건을 삭제하고 싶을 경우
} else if (deleteType == HouseworkInfoDeleteType.ALL) {
// HouseworkInfo를 외래키로 가진 HouseworkMember 삭제
houseworkMemberRepository.deleteByHouseworkInfo(houseworkInfo);

// HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제
houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(houseworkInfo.getId());

// HouseworkInfo 삭제
houseworkInfoRepository.deleteById(houseworkInfo.getId());
log.info(">>>> HouseworkInfo Deleted: {}", houseworkInfo.getId());

// requestDate 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경
houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(houseworkInfo.getId()).stream()
.filter(todo -> todo.getDate().isAfter(requestDate))
.forEach(HouseworkTodo::deleteHouseworkTodo);

// groupId로 TodoList 조회 후 요청한 requestTodo를 가진 TodoList를 필터링한 후 dirtyBit Checking
todoListRepository.findByGroupInfoId(groupId).stream()
.filter(todoList -> // PERIOD에 맞는 TodoList 선별
switch (requestTodo.getHouseworkInfo().getType()) {
case HOUSEWORK_PERIOD_DAY -> false;
case HOUSEWORK_PERIOD_EVERYDAY -> true;
case HOUSEWORK_PERIOD_WEEK ->
DayOfWeekUtils.equals(houseworkInfo.getWeekDate(), todoList.getDate());
case HOUSEWORK_PERIOD_MONTH -> Arrays.stream(houseworkInfo.getMonthDate().split(","))
.anyMatch(d -> Integer.parseInt(d) == todoList.getDate().getDayOfMonth());
})
.forEach(todoList -> { // dirtyBit Checking
todoList.checkDirtyBit();
todoListRepository.save(todoList);
log.info(">>>> dirtyBit Checking TodoList id: {}", todoList.getId());
});

/* redis에서 _IdIn 지원하지 않음 -> 이렇게 한번에 조회하려면 RedisTemplate 사용이 필요해 보입니다.
todoListRepository.findByTodoList_IdIn(todoList.stream()
.map(HouseworkTodo::getId)
.collect(Collectors.toList()))
.forEach(tList -> { // dirtyBit Checking
tList.checkDirtyBit();
todoListRepository.save(tList);
log.info(">>>> dirtyBit Checking TodoList id: {}", tList.getId());
});*/

}

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

throw e;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.heachi.housework.api.service.housework.info.request;

import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoDeleteType;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDate;

@Getter
public class HouseworkInfoDeleteRequest {
private Long groupId;
private LocalDate date;
private Long todoId;
private HouseworkInfoDeleteType deleteType;

@Builder
public HouseworkInfoDeleteRequest(Long groupId, LocalDate date, Long todoId, HouseworkInfoDeleteType deleteType) {
this.groupId = groupId;
this.date = date;
this.todoId = todoId;
this.deleteType = deleteType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@
import com.heachi.mysql.define.user.constant.UserPlatformType;
import com.heachi.mysql.define.user.constant.UserRole;
import com.heachi.mysql.define.user.repository.UserRepository;
import com.heachi.redis.define.housework.todo.Todo;
import com.heachi.redis.define.housework.todo.TodoList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestConstructor;

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

import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestConstructor;

Expand Down Expand Up @@ -144,6 +148,17 @@ public static HouseworkInfo generateCustomHouseworkInfo(HouseworkCategory catego
.build();
}

public static HouseworkInfo generateCustom2HouseworkInfo(HouseworkCategory category, GroupInfo groupInfo, String title, HouseworkPeriodType type) {

return HouseworkInfo.builder()
.houseworkCategory(category)
.title(title)
.detail("빨래 돌리기")
.type(type)
.endTime(LocalTime.of(18,0))
.build();
}

public static HouseworkMember generateHouseworkMember(GroupMember groupMember, HouseworkInfo houseworkInfo) {

return HouseworkMember.builder()
Expand All @@ -156,4 +171,13 @@ public static HouseworkTodo generateHouseworkTodo(HouseworkInfo houseworkInfo, G

return HouseworkTodo.makeTodoReferInfo(houseworkInfo, groupInfo, date);
}

public static TodoList generateTodoList(Long groupId, LocalDate date, List<Todo> todoList) {
return TodoList.builder()
.groupInfoId(groupId)
.date(date)
.todoList(todoList)
.build();

}
}
Loading

0 comments on commit baea901

Please sign in to comment.