From b7ecb6e33eefcb71d06423fb6dcd1328bcb8fdcd Mon Sep 17 00:00:00 2001 From: jusung-c Date: Wed, 15 Nov 2023 21:28:09 +0900 Subject: [PATCH 01/15] =?UTF-8?q?chore(#111):=20API=20Response=20Example?= =?UTF-8?q?=20value=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../heachi/auth/api/controller/auth/AuthController.java | 8 ++++++++ .../api/controller/group/info/GroupInfoController.java | 7 +++++++ .../controller/group/member/GroupMemberController.java | 5 +++++ .../housework/category/HouseworkCategoryController.java | 6 ++++++ .../api/controller/housework/todo/TodoController.java | 7 +++++++ 5 files changed, 33 insertions(+) diff --git a/heachi-core/auth-api/src/main/java/com/heachi/auth/api/controller/auth/AuthController.java b/heachi-core/auth-api/src/main/java/com/heachi/auth/api/controller/auth/AuthController.java index aefc698e..591a4fdf 100644 --- a/heachi-core/auth-api/src/main/java/com/heachi/auth/api/controller/auth/AuthController.java +++ b/heachi-core/auth-api/src/main/java/com/heachi/auth/api/controller/auth/AuthController.java @@ -13,6 +13,10 @@ import com.heachi.auth.api.service.state.LoginStateService; import com.heachi.mysql.define.user.User; import com.heachi.mysql.define.user.constant.UserPlatformType; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -40,6 +44,7 @@ public JsonResult loginPage( return JsonResult.successOf(loginPage); } + @ApiResponse(responseCode = "200", description = "로그인 성공", content = @Content(schema = @Schema(implementation = AuthServiceLoginResponse.class))) @GetMapping("/{platformType}/login") public JsonResult login( @PathVariable("platformType") UserPlatformType platformType, @@ -53,6 +58,7 @@ public JsonResult login( return JsonResult.successOf(loginResponse); } + @ApiResponse(responseCode = "200", description = "회원가입 성공", content = @Content(schema = @Schema(implementation = AuthServiceLoginResponse.class))) @PostMapping("/register") public JsonResult register( @Valid @RequestBody AuthRegisterRequest request) { @@ -62,6 +68,7 @@ public JsonResult register( return JsonResult.successOf(registerResponse); } + @ApiResponse(responseCode = "200", description = "회원 정보 불러오기 성공", content = @Content(schema = @Schema(implementation = UserSimpleInfoResponse.class))) @GetMapping("/info") public JsonResult userInfo(@AuthenticationPrincipal User user) { @@ -90,6 +97,7 @@ public JsonResult userDelete(@AuthenticationPrincipal User user) { return JsonResult.successOf(); } + @ApiResponse(responseCode = "200", description = "토큰 재발급 성공", content = @Content(schema = @Schema(implementation = ReissueAccessTokenResponse.class))) @PostMapping("/reissue") public JsonResult reissueAccessToken(@RequestHeader(name = "Authorization") String token) { List tokens = Arrays.asList(token.split(" ")); diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/info/GroupInfoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/info/GroupInfoController.java index 7a886577..8e69dde8 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/info/GroupInfoController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/info/GroupInfoController.java @@ -5,6 +5,10 @@ import com.heachi.housework.api.controller.group.info.request.GroupInfoRegisterRequest; import com.heachi.housework.api.service.auth.AuthExternalService; import com.heachi.housework.api.service.group.info.GroupInfoService; +import com.heachi.housework.api.service.group.info.response.GroupInfoUserGroupServiceResponse; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; @@ -19,6 +23,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Slf4j @RestController @RequiredArgsConstructor @@ -47,6 +53,7 @@ public JsonResult createGroupInfo(@RequestHeader(name = "Authorization") Stri } // User가 가입한 Group 정보를 리턴한다. + @ApiResponse(responseCode = "200", description = "그룹 리스트 조회 성공", content = @Content(schema = @Schema(implementation = GroupInfoUserGroupServiceResponse.class, type = "array"))) @GetMapping("/list") public JsonResult userGroupInfoList(@RequestHeader(name = "Authorization") String authorization) { UserInfoResponse userInfo = authExternalService.userAuthenticate(authorization); diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java index f67a5868..03d88db7 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java @@ -4,6 +4,10 @@ import com.heachi.housework.api.controller.group.member.response.GroupMemberResponse; import com.heachi.housework.api.service.auth.AuthExternalService; import com.heachi.housework.api.service.group.member.GroupMemberService; +import com.heachi.redis.define.housework.todo.TodoList; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -18,6 +22,7 @@ public class GroupMemberController { private final AuthExternalService authExternalService; private final GroupMemberService groupMemberService; + @ApiResponse(responseCode = "200", description = "Group Member 리스트 조회 성공", content = @Content(schema = @Schema(implementation = GroupMemberResponse.class, type = "array"))) @GetMapping("/{groupId}") public JsonResult groupMemberList(@RequestHeader(name = "Authorization") String authorization, @PathVariable(name = "groupId") Long groupId) { diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java index 9252cead..dffe6824 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java @@ -1,7 +1,12 @@ package com.heachi.housework.api.controller.housework.category; import com.heachi.admin.common.response.JsonResult; +import com.heachi.housework.api.controller.group.member.response.GroupMemberResponse; import com.heachi.housework.api.service.housework.category.HouseworkCategoryService; +import com.heachi.housework.api.service.housework.category.response.HouseworkCategoryResponse; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; @@ -16,6 +21,7 @@ public class HouseworkCategoryController { private final HouseworkCategoryService houseworkCategoryService; + @ApiResponse(responseCode = "200", description = "카테고리 리스트 조회 성공", content = @Content(schema = @Schema(implementation = HouseworkCategoryResponse.class, type = "array"))) @GetMapping("/") public JsonResult selectCategory() { diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java index c3127e64..ec736e3f 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java @@ -4,10 +4,16 @@ import com.heachi.external.clients.auth.response.UserInfoResponse; import com.heachi.housework.api.controller.housework.todo.request.VerifyTodoRequest; import com.heachi.housework.api.service.auth.AuthExternalService; +import com.heachi.housework.api.service.group.info.response.GroupInfoUserGroupServiceResponse; import com.heachi.housework.api.service.housework.todo.TodoService; import com.heachi.housework.api.service.housework.todo.request.TodoSelectRequest; import com.heachi.housework.api.service.housework.todo.request.VerifyTodoServiceRequest; +import com.heachi.redis.define.housework.todo.TodoList; import com.heachi.s3.api.service.AwsS3Service; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,6 +32,7 @@ public class TodoController { private final AwsS3Service awsS3Service; // Todo List 가져오기 + @ApiResponse(responseCode = "200", description = "Todo List 조회 성공", content = @Content(schema = @Schema(implementation = TodoList.class))) @GetMapping("/{groupId}") public JsonResult selectTodo(@RequestHeader(name = "Authorization") String authorization, @PathVariable(name = "groupId") Long groupId, From 14ede550f3256bc823809e2e5c55fcdaa422d3df Mon Sep 17 00:00:00 2001 From: jusung-c Date: Wed, 15 Nov 2023 22:21:54 +0900 Subject: [PATCH 02/15] =?UTF-8?q?chore(#111):=20Response=20List=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=9D=98=20=EC=98=88=EC=8B=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=95=88=EB=90=98=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/group/member/GroupMemberController.java | 3 ++- .../housework/category/HouseworkCategoryController.java | 3 ++- .../api/controller/housework/todo/TodoController.java | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java index 03d88db7..f7011573 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/group/member/GroupMemberController.java @@ -5,6 +5,7 @@ import com.heachi.housework.api.service.auth.AuthExternalService; import com.heachi.housework.api.service.group.member.GroupMemberService; import com.heachi.redis.define.housework.todo.TodoList; +import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -22,7 +23,7 @@ public class GroupMemberController { private final AuthExternalService authExternalService; private final GroupMemberService groupMemberService; - @ApiResponse(responseCode = "200", description = "Group Member 리스트 조회 성공", content = @Content(schema = @Schema(implementation = GroupMemberResponse.class, type = "array"))) + @ApiResponse(responseCode = "200", description = "Group Member 리스트 조회 성공", content = @Content(array = @ArraySchema(schema = @Schema(implementation = GroupMemberResponse.class)))) @GetMapping("/{groupId}") public JsonResult groupMemberList(@RequestHeader(name = "Authorization") String authorization, @PathVariable(name = "groupId") Long groupId) { diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java index dffe6824..bb5a2f82 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/category/HouseworkCategoryController.java @@ -4,6 +4,7 @@ import com.heachi.housework.api.controller.group.member.response.GroupMemberResponse; import com.heachi.housework.api.service.housework.category.HouseworkCategoryService; import com.heachi.housework.api.service.housework.category.response.HouseworkCategoryResponse; +import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -21,7 +22,7 @@ public class HouseworkCategoryController { private final HouseworkCategoryService houseworkCategoryService; - @ApiResponse(responseCode = "200", description = "카테고리 리스트 조회 성공", content = @Content(schema = @Schema(implementation = HouseworkCategoryResponse.class, type = "array"))) + @ApiResponse(responseCode = "200", description = "Group Member 리스트 조회 성공", content = @Content(array = @ArraySchema(schema = @Schema(implementation = HouseworkCategoryResponse.class)))) @GetMapping("/") public JsonResult selectCategory() { diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java index ec736e3f..887d57ea 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java @@ -10,9 +10,12 @@ import com.heachi.housework.api.service.housework.todo.request.VerifyTodoServiceRequest; import com.heachi.redis.define.housework.todo.TodoList; import com.heachi.s3.api.service.AwsS3Service; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -32,7 +35,7 @@ public class TodoController { private final AwsS3Service awsS3Service; // Todo List 가져오기 - @ApiResponse(responseCode = "200", description = "Todo List 조회 성공", content = @Content(schema = @Schema(implementation = TodoList.class))) + @ApiResponse(responseCode = "200", description = "성공적으로 Todo List를 조회함", content = @Content(schema = @Schema(implementation = TodoList.class))) @GetMapping("/{groupId}") public JsonResult selectTodo(@RequestHeader(name = "Authorization") String authorization, @PathVariable(name = "groupId") Long groupId, From 070f79a13ccbd88f548f8408566ad8b3c9e3ca06 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Thu, 16 Nov 2023 14:16:36 +0900 Subject: [PATCH 03/15] =?UTF-8?q?test(#114):=20=EB=8D=94=EB=AF=B8=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20insert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/heachi/mysql/define/Initializer.java | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java new file mode 100644 index 00000000..4c5573f7 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java @@ -0,0 +1,127 @@ +package com.heachi.mysql.define; + +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; +import com.heachi.mysql.define.group.member.constant.GroupMemberRole; +import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; +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.todo.HouseworkTodo; +import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; +import com.heachi.mysql.define.user.User; +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Component +public class Initializer implements ApplicationRunner { + @Autowired private UserRepository userRepository; + @Autowired private GroupInfoRepository groupInfoRepository; + @Autowired private GroupMemberRepository groupMemberRepository; + @Autowired private HouseworkCategoryRepository houseworkCategoryRepository; + @Autowired private HouseworkInfoRepository houseworkInfoRepository; + @Autowired private HouseworkMemberRepository houseworkMemberRepository; + @Autowired private HouseworkTodoRepository houseworkTodoRepository; + + @Override + public void run(ApplicationArguments args) throws Exception { + User user = userRepository.save(generateCustomUser("김준영", "kjy@naver.com", "010-0000-0000")); + User user2 = userRepository.save(generateCustomUser("구지원", "itkoo@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + GroupMember groupMember2 = groupMemberRepository.save(generateGroupMember(user2, groupInfo)); + + HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkCategory houseworkCategory2 = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateCustomHouseworkInfo(houseworkCategory, groupInfo, "청소기 돌리기", HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY)); + HouseworkInfo houseworkInfo2 = houseworkInfoRepository.save(generateCustomHouseworkInfo(houseworkCategory2, groupInfo, "쓰레기 버리기", HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY)); + + houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); + houseworkMemberRepository.save(generateHouseworkMember(groupMember2, houseworkInfo)); + houseworkMemberRepository.save(generateHouseworkMember(groupMember2, houseworkInfo2)); + + HouseworkTodo houseworkTodo = houseworkTodoRepository.save(generateHouseworkTodo(houseworkInfo, groupInfo, LocalDate.now())); + HouseworkTodo houseworkTodo2 = houseworkTodoRepository.save(generateHouseworkTodo(houseworkInfo2, groupInfo, LocalDate.now())); + } + + public static User generateCustomUser(String name, String email, String phoneNumber) { + return User.builder() + .platformId("1111") + .platformType(UserPlatformType.KAKAO) + .role(UserRole.USER) + .name(name) + .email(email) + .phoneNumber(phoneNumber) + .profileImageUrl("https://google.com") + .pushAlarmYn(true) + .build(); + } + + public static GroupInfo generateGroupInfo(User user) { + + return GroupInfo.builder() + .user(user) + .bgColor("bbbbbb") + .colorCode("111111") + .gradient("csscssscss") + .name("준영하우스") + .info("hello!") + .build(); + } + + public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { + + return GroupMember.builder() + .groupInfo(groupInfo) + .user(user) + .role(GroupMemberRole.GROUP_MEMBER) + .status(GroupMemberStatus.ACCEPT) + .build(); + } + + public static HouseworkCategory generateCustomHouseworkCategory(String name) { + + return HouseworkCategory.builder() + .name(name) + .build(); + } + + public static HouseworkInfo generateCustomHouseworkInfo(HouseworkCategory category, GroupInfo groupInfo, String title, HouseworkPeriodType type) { + + return HouseworkInfo.builder() + .houseworkCategory(category) + .groupInfo(groupInfo) + .title(title) + .detail("빨래 돌리기") + .type(type) + .endTime(LocalTime.of(18,0)) + .build(); + } + + public static HouseworkMember generateHouseworkMember(GroupMember groupMember, HouseworkInfo houseworkInfo) { + + return HouseworkMember.builder() + .houseworkInfo(houseworkInfo) + .groupMember(groupMember) + .build(); + } + + public static HouseworkTodo generateHouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, LocalDate date) { + + return HouseworkTodo.makeTodoReferInfo(houseworkInfo, groupInfo, date); + } +} From e2436b1aa9e8b40137e6f36c638afec901661515 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Thu, 16 Nov 2023 14:19:11 +0900 Subject: [PATCH 04/15] =?UTF-8?q?test(#114):=20=EB=B0=B0=ED=8F=AC=20DB=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EC=97=90=EB=A7=8C=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/heachi/mysql/define/Initializer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java index 4c5573f7..b4f57c3c 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.time.LocalDate; @@ -38,6 +39,7 @@ public class Initializer implements ApplicationRunner { @Autowired private HouseworkTodoRepository houseworkTodoRepository; @Override + @Profile("prod") public void run(ApplicationArguments args) throws Exception { User user = userRepository.save(generateCustomUser("김준영", "kjy@naver.com", "010-0000-0000")); User user2 = userRepository.save(generateCustomUser("구지원", "itkoo@naver.com", "010-1111-1111")); From 0cfbe8cfb941a809e3e434e220bd5d237061e6c0 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Thu, 16 Nov 2023 15:19:43 +0900 Subject: [PATCH 05/15] =?UTF-8?q?test(#111):=20502=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=83=9D=EA=B2=A8=EC=84=9C=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/heachi/mysql/define/Initializer.java | 129 ------------------ 1 file changed, 129 deletions(-) delete mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java deleted file mode 100644 index b4f57c3c..00000000 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/Initializer.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.heachi.mysql.define; - -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; -import com.heachi.mysql.define.group.member.constant.GroupMemberRole; -import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; -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.todo.HouseworkTodo; -import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; -import com.heachi.mysql.define.user.User; -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 org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; - -import java.time.LocalDate; -import java.time.LocalTime; - -@Component -public class Initializer implements ApplicationRunner { - @Autowired private UserRepository userRepository; - @Autowired private GroupInfoRepository groupInfoRepository; - @Autowired private GroupMemberRepository groupMemberRepository; - @Autowired private HouseworkCategoryRepository houseworkCategoryRepository; - @Autowired private HouseworkInfoRepository houseworkInfoRepository; - @Autowired private HouseworkMemberRepository houseworkMemberRepository; - @Autowired private HouseworkTodoRepository houseworkTodoRepository; - - @Override - @Profile("prod") - public void run(ApplicationArguments args) throws Exception { - User user = userRepository.save(generateCustomUser("김준영", "kjy@naver.com", "010-0000-0000")); - User user2 = userRepository.save(generateCustomUser("구지원", "itkoo@naver.com", "010-1111-1111")); - GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); - GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); - GroupMember groupMember2 = groupMemberRepository.save(generateGroupMember(user2, groupInfo)); - - HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); - HouseworkCategory houseworkCategory2 = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); - HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateCustomHouseworkInfo(houseworkCategory, groupInfo, "청소기 돌리기", HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY)); - HouseworkInfo houseworkInfo2 = houseworkInfoRepository.save(generateCustomHouseworkInfo(houseworkCategory2, groupInfo, "쓰레기 버리기", HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY)); - - houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); - houseworkMemberRepository.save(generateHouseworkMember(groupMember2, houseworkInfo)); - houseworkMemberRepository.save(generateHouseworkMember(groupMember2, houseworkInfo2)); - - HouseworkTodo houseworkTodo = houseworkTodoRepository.save(generateHouseworkTodo(houseworkInfo, groupInfo, LocalDate.now())); - HouseworkTodo houseworkTodo2 = houseworkTodoRepository.save(generateHouseworkTodo(houseworkInfo2, groupInfo, LocalDate.now())); - } - - public static User generateCustomUser(String name, String email, String phoneNumber) { - return User.builder() - .platformId("1111") - .platformType(UserPlatformType.KAKAO) - .role(UserRole.USER) - .name(name) - .email(email) - .phoneNumber(phoneNumber) - .profileImageUrl("https://google.com") - .pushAlarmYn(true) - .build(); - } - - public static GroupInfo generateGroupInfo(User user) { - - return GroupInfo.builder() - .user(user) - .bgColor("bbbbbb") - .colorCode("111111") - .gradient("csscssscss") - .name("준영하우스") - .info("hello!") - .build(); - } - - public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { - - return GroupMember.builder() - .groupInfo(groupInfo) - .user(user) - .role(GroupMemberRole.GROUP_MEMBER) - .status(GroupMemberStatus.ACCEPT) - .build(); - } - - public static HouseworkCategory generateCustomHouseworkCategory(String name) { - - return HouseworkCategory.builder() - .name(name) - .build(); - } - - public static HouseworkInfo generateCustomHouseworkInfo(HouseworkCategory category, GroupInfo groupInfo, String title, HouseworkPeriodType type) { - - return HouseworkInfo.builder() - .houseworkCategory(category) - .groupInfo(groupInfo) - .title(title) - .detail("빨래 돌리기") - .type(type) - .endTime(LocalTime.of(18,0)) - .build(); - } - - public static HouseworkMember generateHouseworkMember(GroupMember groupMember, HouseworkInfo houseworkInfo) { - - return HouseworkMember.builder() - .houseworkInfo(houseworkInfo) - .groupMember(groupMember) - .build(); - } - - public static HouseworkTodo generateHouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, LocalDate date) { - - return HouseworkTodo.makeTodoReferInfo(houseworkInfo, groupInfo, date); - } -} From ece55a96908a309013ae20987742a527443967e2 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sat, 18 Nov 2023 17:59:08 +0900 Subject: [PATCH 06/15] =?UTF-8?q?feat(#105):=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=98=B8=EC=B6=9C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info/HouseworkInfoController.java | 12 +++- .../housework/info/HouseworkInfoService.java | 36 ++++++++-- .../HouseworkInfoUpdatePageResponse.java | 67 +++++++++++++++++++ .../HouseworkCategoryRepository.java | 2 + .../HouseworkCategoryRepositoryTest.java | 41 ++++++++++++ 5 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/response/HouseworkInfoUpdatePageResponse.java create mode 100644 heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepositoryTest.java diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java index 30817367..708731ed 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java @@ -8,7 +8,6 @@ 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; @@ -59,4 +58,15 @@ public JsonResult deleteHouseworkInfo(@RequestHeader(name = "Authorization") } } + + @GetMapping("/update/{groupId}") + public JsonResult updateHouseworkInfo(@RequestHeader(name = "Authorization") String authorization, + @PathVariable(name = "groupId") Long groupId, + @RequestParam(name = "date") LocalDate date, + @RequestParam(name = "todoId") Long todoId) { + // 유저 인증 & 그룹원(ACCEPT)인지 권한 확인 + authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); + + return JsonResult.successOf(houseworkInfoService.updateHouseworkPage(todoId)); + } } diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index 6ab30a5c..a2dc581b 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -9,6 +9,7 @@ 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.housework.api.service.housework.info.response.HouseworkInfoUpdatePageResponse; 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; @@ -23,7 +24,6 @@ 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; @@ -33,7 +33,6 @@ import java.time.LocalDate; import java.util.Arrays; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -107,6 +106,7 @@ public void createHouseworkInfo(HouseworkInfoCreateServiceRequest request) { // HOUSEWORK_INFO 저장 HouseworkInfo houseworkInfo = houseworkInfoRepository.save(HouseworkInfo.builder() + .groupInfo(groupInfo) .houseworkCategory(category) .title(request.getTitle()) .detail(request.getDetail()) @@ -207,8 +207,9 @@ public void deleteHouseworkInfo(HouseworkInfoDeleteRequest request) { 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()); + case HOUSEWORK_PERIOD_MONTH -> + Arrays.stream(houseworkInfo.getMonthDate().split(",")) + .anyMatch(d -> Integer.parseInt(d) == todoList.getDate().getDayOfMonth()); }) .forEach(todoList -> { // dirtyBit Checking todoList.checkDirtyBit(); @@ -234,4 +235,31 @@ public void deleteHouseworkInfo(HouseworkInfoDeleteRequest request) { throw e; } } + + public HouseworkInfoUpdatePageResponse updateHouseworkPage(Long todoId) { + // HouseworkTodo 조회 -> HouseworkInfo도 fetch Join 함께 조회 + HouseworkTodo requestTodo = houseworkTodoRepository.findHouseworkTodoByIdJoinFetchHouseworkInfo(todoId).orElseThrow(() -> { + log.warn(">>>> HouseworkTodo Not Found : {}", ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND.getText()); + + return new HouseworkException(ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND); + }); + + HouseworkInfo houseworkInfo = requestTodo.getHouseworkInfo(); + + // 담장자 그룹 멤버 Id 리스트 조회 + List groupMemberIdList = groupMemberRepository.findGroupMemberListByGroupMemberIdList(Arrays.stream(requestTodo.getHouseworkMember().split(",")) + .map(Long::parseLong) + .collect(Collectors.toList())).stream().map(GroupMember::getId).toList(); + + // 단건 집안일의 경우 + if (houseworkInfo == null) { + // 카테고리 조회 + HouseworkCategory category = houseworkCategoryRepository.findHouseworkCategoryByName(requestTodo.getCategory()); + + return HouseworkInfoUpdatePageResponse.of(requestTodo, category, groupMemberIdList); + + } else { // 비단건 집안일의 경우 + return HouseworkInfoUpdatePageResponse.of(houseworkInfo, groupMemberIdList); + } + } } \ No newline at end of file diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/response/HouseworkInfoUpdatePageResponse.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/response/HouseworkInfoUpdatePageResponse.java new file mode 100644 index 00000000..5db8c7b8 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/response/HouseworkInfoUpdatePageResponse.java @@ -0,0 +1,67 @@ +package com.heachi.housework.api.service.housework.info.response; + +import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoCreateRequest; +import com.heachi.housework.api.service.housework.category.response.HouseworkCategoryResponse; +import com.heachi.housework.api.service.housework.info.request.HouseworkInfoCreateServiceRequest; +import com.heachi.mysql.define.housework.category.HouseworkCategory; +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +@Getter +@ToString +public class HouseworkInfoUpdatePageResponse { + String title; + Long houseworkCategoryId; + List groupMemberIdList; + HouseworkPeriodType type; + LocalDate localDate; + String weekDate; + String monthDate; + LocalTime endTime; + + @Builder + public HouseworkInfoUpdatePageResponse(String title, Long houseworkCategoryId, List groupMemberIdList, HouseworkPeriodType type, LocalDate localDate, String weekDate, String monthDate, LocalTime endTime) { + this.title = title; + this.houseworkCategoryId = houseworkCategoryId; + this.groupMemberIdList = groupMemberIdList; + this.type = type; + this.localDate = localDate; + this.weekDate = weekDate; + this.monthDate = monthDate; + this.endTime = endTime; + } + + public static HouseworkInfoUpdatePageResponse of(HouseworkTodo todo, HouseworkCategory category, List groupMemberIdList) { + + return HouseworkInfoUpdatePageResponse.builder() + .title(todo.getTitle()) + .houseworkCategoryId(category.getId()) + .groupMemberIdList(groupMemberIdList) + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) + .localDate(todo.getDate()) + .endTime(todo.getEndTime()) + .build(); + } + + public static HouseworkInfoUpdatePageResponse of(HouseworkInfo info, List groupMemberIdList) { + + return HouseworkInfoUpdatePageResponse.builder() + .title(info.getTitle()) + .houseworkCategoryId(info.getHouseworkCategory().getId()) + .groupMemberIdList(groupMemberIdList) + .type(info.getType()) + .localDate(info.getDayDate()) + .weekDate(info.getWeekDate()) + .monthDate(info.getMonthDate()) + .endTime(info.getEndTime()) + .build(); + } +} \ No newline at end of file diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java index 9e5bd1a9..790090f4 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java @@ -4,4 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface HouseworkCategoryRepository extends JpaRepository { + // 카테고리 이름으로 조회 + public HouseworkCategory findHouseworkCategoryByName(String categoryName); } diff --git a/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepositoryTest.java b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepositoryTest.java new file mode 100644 index 00000000..22ca3c44 --- /dev/null +++ b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepositoryTest.java @@ -0,0 +1,41 @@ +package com.heachi.mysql.define.housework.category.repository; + +import com.heachi.mysql.TestConfig; +import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import com.heachi.mysql.define.housework.category.HouseworkCategory; +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.repository.HouseworkTodoRepository; +import com.heachi.mysql.define.user.repository.UserRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class HouseworkCategoryRepositoryTest extends TestConfig { + + @Autowired + private HouseworkCategoryRepository houseworkCategoryRepository; + + @AfterEach + void tearDown() { + houseworkCategoryRepository.deleteAllInBatch(); + } + + + @Test + @DisplayName("카테고리 이름으로 조회 성공 테스트") + void test1() { + // given + HouseworkCategory category = houseworkCategoryRepository.save(generateHouseworkCategory()); + + // when & then + assertThat(houseworkCategoryRepository.findHouseworkCategoryByName(category.getName()).equals("집안일")); + } +} \ No newline at end of file From 40ce3ebf6a2bfd2fd9dde9694df7a029252f72c3 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sat, 18 Nov 2023 19:44:38 +0900 Subject: [PATCH 07/15] =?UTF-8?q?test(#105):=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=98=B8=EC=B6=9C=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info/HouseworkInfoServiceTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java index aa47ce3c..10f03ab2 100644 --- a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java @@ -9,6 +9,7 @@ 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.housework.api.service.housework.info.response.HouseworkInfoUpdatePageResponse; 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; @@ -581,4 +582,79 @@ void deleteHouseworkInfoWhenNotPeriodDay() { // 집안일이 조회되지 않아야 한다. assertThat(houseworkInfoRepository.findById(vacuum.getId())).isEmpty(); } + + @Test + @DisplayName("수정 페이지에 내려줄 정보를 잘 불러온다. - 단건 집안일의 경우") + void updateHouseworkWithPeriodDay() { + /* + given + */ + User A = userRepository.save(generateCustomUser("aaa@naver.com", "010-0000-0000")); + User B = userRepository.save(generateCustomUser("bbb@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(A)); + GroupMember gA = groupMemberRepository.save(generateGroupMember(A, groupInfo)); + GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); + HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(null) // 단건은 HouseworkInfo가 존재하지 않는다. + .groupInfo(groupInfo) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(inWork.getName()) + .title("title") + .detail("detail") + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(LocalDate.of(2023, 11, 18)) + .endTime(LocalTime.of(16, 30)) + .build()); + + + // when + HouseworkInfoUpdatePageResponse response = houseworkInfoService.updateHouseworkPage(todo.getId()); + + // then + assertThat(response.getTitle()).isEqualTo("title"); + assertThat(response.getHouseworkCategoryId()).isEqualTo(inWork.getId()); + assertThat(response.getType()).isEqualTo(HouseworkPeriodType.HOUSEWORK_PERIOD_DAY); + assertThat(response.getLocalDate()).isEqualTo(todo.getDate()); + assertThat(response.getWeekDate()).isNull(); + assertThat(response.getMonthDate()).isNull(); + assertThat(response.getEndTime()).isEqualTo(todo.getEndTime()); + } + + @Test + @DisplayName("수정 페이지에 내려줄 정보를 잘 불러온다. - 비단건 집안일의 경우") + void updateHouseworkWithPeriodNotDay() { + /* + given + */ + User A = userRepository.save(generateCustomUser("aaa@naver.com", "010-0000-0000")); + User B = userRepository.save(generateCustomUser("bbb@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(A)); + GroupMember gA = groupMemberRepository.save(generateGroupMember(A, groupInfo)); + GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); + HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkInfo h = houseworkInfoRepository.save(generateCustom2HouseworkInfo(inWork, groupInfo, "test", HouseworkPeriodType.HOUSEWORK_PERIOD_WEEK)); + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(h) // 단건은 HouseworkInfo가 존재하지 않는다. + .groupInfo(groupInfo) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(h.getHouseworkCategory().getName()) + .title(h.getTitle()) + .detail(h.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(LocalDate.now()) + .endTime(LocalTime.of(16, 30)) + .build()); + + + // when + HouseworkInfoUpdatePageResponse response = houseworkInfoService.updateHouseworkPage(todo.getId()); + + // then + assertThat(response.getTitle()).isEqualTo("test"); + assertThat(response.getHouseworkCategoryId()).isEqualTo(h.getHouseworkCategory().getId()); + assertThat(response.getType()).isEqualTo(h.getType()); + assertThat(response.getLocalDate()).isEqualTo(h.getDayDate()); + assertThat(response.getEndTime()).isEqualTo(h.getEndTime()); + } } \ No newline at end of file From d11ada19fc40d7d1108ee8827cbdd83a86ab3bc0 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sun, 19 Nov 2023 03:12:12 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat(#105):=20=EC=88=98=EC=A0=95=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info/HouseworkInfoController.java | 36 +- .../housework/info/HouseworkInfoService.java | 330 +++++++++++++----- .../HouseworkInfoCreateServiceRequest.java | 15 + .../HouseworkInfoUpdateServiceRequest.java | 62 ++++ .../define/housework/info/HouseworkInfo.java | 14 + .../repository/HouseworkMemberRepository.java | 4 +- .../HouseworkMemberRepositoryCustom.java | 11 + .../HouseworkMemberRepositoryCustomImpl.java | 39 +++ .../define/housework/todo/HouseworkTodo.java | 10 + 9 files changed, 418 insertions(+), 103 deletions(-) create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java index 708731ed..4a0a87d0 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/info/HouseworkInfoController.java @@ -8,6 +8,7 @@ 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.info.request.HouseworkInfoUpdateServiceRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,7 +51,12 @@ public JsonResult deleteHouseworkInfo(@RequestHeader(name = "Authorization") // 유저 인증 & 그룹원(ACCEPT)인지 권한 확인 authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); houseworkInfoService.deleteHouseworkInfo( - HouseworkInfoDeleteRequest.builder().groupId(groupId).date(date).todoId(todoId).deleteType(deleteType).build()); + HouseworkInfoDeleteRequest.builder() + .groupId(groupId) + .date(date) + .todoId(todoId) + .deleteType(deleteType) + .build()); return JsonResult.successOf("Housework Delete Success."); } catch (HeachiException e) { @@ -62,11 +68,31 @@ public JsonResult deleteHouseworkInfo(@RequestHeader(name = "Authorization") @GetMapping("/update/{groupId}") public JsonResult updateHouseworkInfo(@RequestHeader(name = "Authorization") String authorization, @PathVariable(name = "groupId") Long groupId, - @RequestParam(name = "date") LocalDate date, @RequestParam(name = "todoId") Long todoId) { - // 유저 인증 & 그룹원(ACCEPT)인지 권한 확인 - authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); + try { + // 유저 인증 & 그룹원(ACCEPT)인지 권한 확인 + authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); + + return JsonResult.successOf(houseworkInfoService.updateHouseworkPage(todoId)); + } catch (HeachiException e) { + return JsonResult.failOf(e.getMessage()); + } + } + + @PostMapping("/update/{groupId}") + public JsonResult updateHouseworkInfo(@RequestHeader(name = "Authorization") String authorization, + @PathVariable(name = "groupId") Long groupId, + @RequestParam(name = "date") LocalDate date, + @RequestParam(name = "todoId") Long todoId, + @Valid @RequestBody HouseworkInfoCreateRequest request) { + try { + // 유저 인증 & 그룹원(ACCEPT)인지 권한 확인 + authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); + houseworkInfoService.updateHousework(HouseworkInfoUpdateServiceRequest.of(request, groupId, todoId, date)); - return JsonResult.successOf(houseworkInfoService.updateHouseworkPage(todoId)); + return JsonResult.successOf("Housework Update Success."); + } catch (HeachiException e) { + return JsonResult.failOf(e.getMessage()); + } } } diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index a2dc581b..25c59575 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -1,14 +1,17 @@ package com.heachi.housework.api.service.housework.info; +import ch.qos.logback.core.joran.conditional.IfAction; 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.HouseworkInfoCreateRequest; 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.housework.api.service.housework.info.request.HouseworkInfoUpdateServiceRequest; import com.heachi.housework.api.service.housework.info.response.HouseworkInfoUpdatePageResponse; import com.heachi.mysql.define.group.info.GroupInfo; import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; @@ -31,9 +34,12 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; +import java.util.stream.Stream; @Slf4j @Service @@ -95,53 +101,12 @@ public void createHouseworkInfo(HouseworkInfoCreateServiceRequest request) { .build()); // 해당 HouseworkTodo에 맞는 groupInfoId와 Date가 캐싱되어있다면, dirtyBit를 true로 바꿔줘야함. - todoListRepository.findByGroupInfoIdAndDate(request.getGroupId(), request.getDayDate()) - // Todo가 캐싱되어 있다면, dirtyBit 체킹 - .ifPresent(todoList -> { - todoList.checkDirtyBit(); - todoListRepository.save(todoList); - log.info(">>>> dirtyBit Checking TodoList id: {}", todoList.getId()); - }); + dirtyBitCheckWithDate(request.getGroupId(), request.getDayDate()); } else { + // HouseworkInfo 생성 & 담당자 지정 해주기 - HouseworkMember 생성 + houseworkInfoCreateAndHouseworkMemberCreate(request, groupInfo, category, groupMemberList); - // HOUSEWORK_INFO 저장 - HouseworkInfo houseworkInfo = houseworkInfoRepository.save(HouseworkInfo.builder() - .groupInfo(groupInfo) - .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); - - // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 - todoListRepository.findByGroupInfoId(request.getGroupId()).stream() - .filter(todoList -> // PERIOD에 맞는 TodoList 선별 - switch (request.getType()) { - case HOUSEWORK_PERIOD_DAY -> false; - case HOUSEWORK_PERIOD_EVERYDAY -> true; - case HOUSEWORK_PERIOD_WEEK -> - DayOfWeekUtils.equals(request.getWeekDate(), todoList.getDate()); - case HOUSEWORK_PERIOD_MONTH -> Arrays.stream(request.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()); - }); + dirtyBitCheckWithGroupIdAndRequest(request.getGroupId(), request.getType(), request.getWeekDate(), request.getMonthDate()); } } catch (RuntimeException e) { @@ -175,58 +140,14 @@ public void deleteHouseworkInfo(HouseworkInfoDeleteRequest request) { requestTodo.deleteHouseworkTodo(); // 요청 날짜의 todoList를 조회 후 dirtyBit 체킹 - todoListRepository.findByGroupInfoIdAndDate(groupId, requestDate) - .ifPresent(todoList -> { - todoList.checkDirtyBit(); - todoListRepository.save(todoList); - log.info(">>>> dirtyBit Checking TodoList id: {}", todoList.getId()); - }); + dirtyBitCheckWithDate(groupId, requestDate); // 비단건 집안일(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()); - });*/ + // houseworkInfo의 외래키, 연관 관계 전부 해제 후 삭제한다. 그리고 현재 시점 이후의 HouseworkTodo를 DELETE로 변경한다. + houseworkInfoDeleteClean(houseworkInfo); + dirtyBitCheckWithGroupIdAndRequest(groupId, requestTodo.getHouseworkInfo().getType(), houseworkInfo.getWeekDate(), houseworkInfo.getMonthDate()); } } catch (HeachiException e) { @@ -240,8 +161,7 @@ public HouseworkInfoUpdatePageResponse updateHouseworkPage(Long todoId) { // HouseworkTodo 조회 -> HouseworkInfo도 fetch Join 함께 조회 HouseworkTodo requestTodo = houseworkTodoRepository.findHouseworkTodoByIdJoinFetchHouseworkInfo(todoId).orElseThrow(() -> { log.warn(">>>> HouseworkTodo Not Found : {}", ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND.getText()); - - return new HouseworkException(ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND); + throw new HouseworkException(ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND); }); HouseworkInfo houseworkInfo = requestTodo.getHouseworkInfo(); @@ -262,4 +182,224 @@ public HouseworkInfoUpdatePageResponse updateHouseworkPage(Long todoId) { return HouseworkInfoUpdatePageResponse.of(houseworkInfo, groupMemberIdList); } } + + public void updateHousework(HouseworkInfoUpdateServiceRequest request) { + Long groupId = request.getGroupId(); + Long todoId = request.getTodoId(); + LocalDate date = request.getDate(); + + // 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 requestInfo = requestTodo.getHouseworkInfo(); + + // GroupInfo + GroupInfo groupInfo = groupInfoRepository.findById(request.getGroupId()).orElseThrow(() -> { + log.warn(">>>> GroupInfo Not Found : {}", ExceptionMessage.GROUP_INFO_NOT_FOUND.getText()); + + throw new GroupInfoException(ExceptionMessage.GROUP_INFO_NOT_FOUND); + }); + + // houseworkCategory + HouseworkCategory category = houseworkCategoryRepository.findById(request.getHouseworkCategoryId()).orElseThrow(() -> { + log.warn(">>>> HouseworkTodo Not Found : {}", ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND.getText()); + throw new HouseworkException(ExceptionMessage.HOUSEWORK_TODO_NOT_FOUND); + }); + + // 담당자로 지정할 GroupMember 리스트 조회 + List groupMemberList = groupMemberRepository.findGroupMemberListByGroupMemberIdList(request.getGroupMemberIdList()); + + // GroupMember 한건이라도 조회 실패시 예외 발생 + if (groupMemberList.size() != request.getGroupMemberIdList().size()) { + log.warn(">>>> GroupMember Not Found : {}", ExceptionMessage.GROUP_MEMBER_NOT_FOUND.getText()); + + throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_NOT_FOUND); + } + + // 담당자로 지정할 GroupMember의 Id들을 ","으로 연결한 문자열 + String groupMemberIdListString = request.getGroupMemberIdList().stream() + .map(Objects::toString) + .collect(Collectors.joining(",")); + + // 단건 집안일의 경우 + if (requestInfo == null) { + // -> 단건 집안일 + if (request.getType() == HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) { + requestTodo.updateHouseworkTodo( + request.getTitle(), + request.getDetail(), + category.getName(), // 수정하고 싶은 카테고리 + groupMemberIdListString, // 수정하고 싶은 담당자 리스트 + request.getDate(), + request.getEndTime() + ); + + // 요청 날짜의 todoList dirtyBit 체킹 + dirtyBitCheckWithDate(groupId, requestTodo.getDate()); + + // 수정 날짜의 todoList dirtyBit 체킹 + dirtyBitCheckWithDate(groupId, request.getDayDate()); + } + + // -> 비단건 집안일 + else { + // HouseworkTodoStatus를 DELETE로 변경 + requestTodo.deleteHouseworkTodo(); + + // 요청 날짜의 todoList를 조회 후 dirtyBit 체킹 + dirtyBitCheckWithDate(groupId, requestTodo.getDate()); + + // HouseworkInfo 생성 & 담당자 지정 해주기 - HouseworkMember 생성 + houseworkInfoCreateAndHouseworkMemberCreate(HouseworkInfoCreateServiceRequest.of(request), groupInfo, category, groupMemberList); + + // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 + dirtyBitCheckWithGroupIdAndRequest(request.getGroupId(), request.getType(), request.getWeekDate(), request.getMonthDate()); + } + } + + // 비단건 집안일의 경우 + else { + // -> 단건 집안일 + if (request.getType() == HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) { + // houseworkInfo의 외래키, 연관 관계 전부 해제 후 삭제한다. 그리고 현재 시점 이후의 HouseworkTodo를 DELETE로 변경한다. + houseworkInfoDeleteClean(requestInfo); + + dirtyBitCheckWithGroupIdAndRequest(groupId, requestTodo.getHouseworkInfo().getType(), requestInfo.getWeekDate(), requestInfo.getMonthDate()); + + + // HouseworkTodo 생성 + houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(null) + .groupInfo(groupInfo) + .houseworkMember(groupMemberIdListString) + .category(category.getName()) + .title(request.getTitle()) + .detail(request.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(request.getDayDate()) + .endTime(request.getEndTime()) + .build()); + + // 해당 HouseworkTodo에 맞는 groupInfoId와 Date가 캐싱되어있다면, dirtyBit를 true로 바꿔줘야함. + dirtyBitCheckWithDate(request.getGroupId(), request.getDayDate()); + + } + + // -> 비단건 집안일 + else { + // 기존의 담당자 리스트가 groupMemberIdList와 동일하지 않다면(담당자가 바뀌었다면) houseworkMember 전부 삭제 + boolean isHMUpdate = houseworkMemberRepository.deleteHouseworkMemberIfGroupMemberIdIn(requestInfo, request.getGroupMemberIdList()); + + // HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제 + houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(requestInfo.getId()); + + // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 + houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() + .filter(todo -> todo.getDate().isAfter(LocalDate.now())) + .forEach(HouseworkTodo::deleteHouseworkTodo); + + // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 -> 수정 전 날짜 기준 + dirtyBitCheckWithGroupIdAndRequest(groupId, requestInfo.getType(), requestInfo.getWeekDate(), requestInfo.getMonthDate()); + + // HouseworkInfo 수정 메서드 사용해 수정 + requestInfo.updateHouseworkInfo(request.getTitle(), request.getDetail(), + category, request.getType(), request.getDate(), request.getEndTime(), requestInfo.getWeekDate(), requestInfo.getMonthDate()); + + // HouseworkMember 생성 - 담당자 지정 + if (!isHMUpdate) { + // HOUSEWORK_MEMBER 저장 - 담당자 지정 + groupMemberList.stream() + .map(gm -> HouseworkMember.builder() + .groupMember(gm) + .houseworkInfo(requestInfo) + .build()) + .forEach(houseworkMemberRepository::save); + } + + // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 -> 수정 후 날짜 기준 + dirtyBitCheckWithGroupIdAndRequest(request.getGroupId(), request.getType(), request.getWeekDate(), request.getMonthDate()); + } + + + } + + + } + + // houseworkInfo의 외래키, 연관 관계 전부 해제 후 삭제한다. 그리고 현재 시점 이후의 HouseworkTodo를 DELETE로 변경한다. + private void houseworkInfoDeleteClean(HouseworkInfo requestInfo) { + // HouseworkInfo를 외래키로 가진 HouseworkMember 삭제 + houseworkMemberRepository.deleteByHouseworkInfo(requestInfo); + + // HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제 + houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(requestInfo.getId()); + + // HouseworkInfo 삭제 + houseworkInfoRepository.deleteById(requestInfo.getId()); + log.info(">>>> HouseworkInfo Deleted: {}", requestInfo.getId()); + + // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 + houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() + .filter(todo -> todo.getDate().isAfter(LocalDate.now())) + .forEach(HouseworkTodo::deleteHouseworkTodo); + } + + // 해당 HouseworkTodo에 맞는 groupInfoId와 Date가 캐싱되어있다면, dirtyBit를 true로 바꿔줘야함. + private void dirtyBitCheckWithDate(Long groupId, LocalDate requestDate) { + todoListRepository.findByGroupInfoIdAndDate(groupId, requestDate) + .ifPresent(todoList -> { + todoList.checkDirtyBit(); + todoListRepository.save(todoList); + log.info(">>>> dirtyBit Checking TodoList id: {}", todoList.getId()); + }); + } + + // HouseworkInfo 생성 & 담당자 지정 해주기 - HouseworkMember 생성 + private void houseworkInfoCreateAndHouseworkMemberCreate(HouseworkInfoCreateServiceRequest request, GroupInfo groupInfo, HouseworkCategory category, List groupMemberList) { + // HOUSEWORK_INFO 저장 + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(HouseworkInfo.builder() + .groupInfo(groupInfo) + .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()); + + // HOUSEWORK_MEMBER 저장 - 담당자 지정 + groupMemberList.stream() + .map(gm -> HouseworkMember.builder() + .groupMember(gm) + .houseworkInfo(houseworkInfo) + .build()) + .forEach(houseworkMemberRepository::save); + } + + + // groupId로 todoList를 조회해서 PeriodType으로 필터링 후 일치하는 todoList dirtyBit 체킹 (groupId, periodType, 수정할 weekDate, 수정할 monthDate) + private void dirtyBitCheckWithGroupIdAndRequest(Long groupId, HouseworkPeriodType houseworkPeriodType, String weekDate, String monthDate) { + todoListRepository.findByGroupInfoId(groupId).stream() + .filter(todoList -> // PERIOD에 맞는 TodoList 선별 + switch (houseworkPeriodType) { + case HOUSEWORK_PERIOD_DAY -> false; + case HOUSEWORK_PERIOD_EVERYDAY -> true; + case HOUSEWORK_PERIOD_WEEK -> DayOfWeekUtils.equals(weekDate, todoList.getDate()); + case HOUSEWORK_PERIOD_MONTH -> Arrays.stream(monthDate.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()); + }); + } } \ No newline at end of file diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoCreateServiceRequest.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoCreateServiceRequest.java index 44888ff5..9096ae5e 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoCreateServiceRequest.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoCreateServiceRequest.java @@ -57,4 +57,19 @@ public static HouseworkInfoCreateServiceRequest of(HouseworkInfoCreateRequest re .groupId(groupId) .build(); } + + public static HouseworkInfoCreateServiceRequest of(HouseworkInfoUpdateServiceRequest request) { + return HouseworkInfoCreateServiceRequest.builder() + .groupMemberIdList(request.getGroupMemberIdList()) + .houseworkCategoryId(request.getHouseworkCategoryId()) + .title(request.getTitle()) + .detail(request.getDetail()) + .type(request.getType()) + .dayDate(request.getDayDate()) + .weekDate(request.getWeekDate()) + .monthDate(request.getMonthDate()) + .endTime(request.getEndTime()) + .groupId(request.getGroupId()) + .build(); + } } diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java new file mode 100644 index 00000000..23c29bf0 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java @@ -0,0 +1,62 @@ +package com.heachi.housework.api.service.housework.info.request; + +import com.heachi.housework.api.controller.housework.info.request.HouseworkInfoCreateRequest; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; + +@Getter +public class HouseworkInfoUpdateServiceRequest { + private List groupMemberIdList; + private Long houseworkCategoryId; + private String title; + private String detail; + private HouseworkPeriodType type; + private LocalDate dayDate; + private String weekDate; + private String monthDate; + private LocalTime endTime; + + private Long groupId; + private Long todoId; + private LocalDate date; + + @Builder + public HouseworkInfoUpdateServiceRequest(List groupMemberIdList, Long houseworkCategoryId, String title, String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, String monthDate, LocalTime endTime, Long groupId, Long todoId, LocalDate date) { + this.groupMemberIdList = 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; + this.groupId = groupId; + this.todoId = todoId; + this.date = date; + } + + public static HouseworkInfoUpdateServiceRequest of(HouseworkInfoCreateRequest request, Long groupId, Long todoId, LocalDate date) { + + return HouseworkInfoUpdateServiceRequest.builder() + .groupMemberIdList(request.getGroupMemberIdList()) + .houseworkCategoryId(request.getHouseworkCategoryId()) + .title(request.getTitle()) + .detail(request.getDetail()) + .type(request.getType()) + .dayDate(request.getDayDate()) + .weekDate(request.getWeekDate()) + .monthDate(request.getMonthDate()) + .endTime(request.getEndTime()) + .groupId(groupId) + .todoId(todoId) + .date(date) + .build(); + } +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java index 0f5d4158..13246e4b 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java @@ -74,4 +74,18 @@ private HouseworkInfo(GroupInfo groupInfo, HouseworkCategory houseworkCategory, this.monthDate = monthDate; this.endTime = endTime; } + + public void updateHouseworkInfo(String title, String detail, HouseworkCategory category, + HouseworkPeriodType type, LocalDate date, LocalTime endTime, + String weekDate, String monthDate) { + this.title = title; + this.detail = detail; + this.houseworkCategory = category; + this.type = type; + this.dayDate = date; + this.weekDate = weekDate; + this.monthDate = monthDate; + this.endTime = endTime; + + } } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java index 50940e3e..fd822f3a 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java @@ -5,10 +5,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; -public interface HouseworkMemberRepository extends JpaRepository { +public interface HouseworkMemberRepository extends JpaRepository, HouseworkMemberRepositoryCustom { // houseworkInfo와 일치하는 값들을 삭제한다. - @Transactional public void deleteByHouseworkInfo(HouseworkInfo houseworkInfo); - } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java new file mode 100644 index 00000000..86d74b77 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java @@ -0,0 +1,11 @@ +package com.heachi.mysql.define.housework.member.repository; + +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.member.HouseworkMember; + +import java.util.List; + +public interface HouseworkMemberRepositoryCustom { + // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 houseworkMember 전부 삭제 후 false 리턴 + public boolean deleteHouseworkMemberIfGroupMemberIdIn(HouseworkInfo info, List groupMemberIdList); +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java new file mode 100644 index 00000000..ba740378 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java @@ -0,0 +1,39 @@ +package com.heachi.mysql.define.housework.member.repository; + +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.member.HouseworkMember; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +import static com.heachi.mysql.define.group.member.QGroupMember.groupMember; +import static com.heachi.mysql.define.housework.member.QHouseworkMember.houseworkMember; + +@Component +@RequiredArgsConstructor +public class HouseworkMemberRepositoryCustomImpl implements HouseworkMemberRepositoryCustom { + private final JPAQueryFactory queryFactory; + private final HouseworkMemberRepository houseworkMemberRepository; + + + @Override + public boolean deleteHouseworkMemberIfGroupMemberIdIn(HouseworkInfo info, List groupIdList) { + List houseworkMemberList = queryFactory.selectFrom(houseworkMember) + .where(houseworkMember.houseworkInfo.eq(info)).fetch(); + List houseworkGroupMemberIdList = houseworkMemberList.stream() + .map(hm -> hm.getGroupMember().getId()) + .collect(Collectors.toList()); + + // houseworkGroupMemberIdList의 요소들이 groupIdList의 요소들과 정확히 일치하면 true 리턴 + if (groupIdList.containsAll(houseworkGroupMemberIdList)) { + return true; + } else { + // 다르다면 HouseworkMember 전부 삭제 + houseworkMemberRepository.deleteAll(houseworkMemberList); + return false; + } + } +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java index 28091d6f..c25059ed 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java @@ -121,4 +121,14 @@ public static HouseworkTodo makeTodoReferInfo(HouseworkInfo houseworkInfo, Group .endTime(houseworkInfo.getEndTime()) .build(); } + + + public void updateHouseworkTodo(String title, String detail, String category, String groupMemberIdList, LocalDate date, LocalTime endTime) { + this.title = title; + this.detail = detail; + this.category = category; + this.houseworkMember = groupMemberIdList; + this.date = date; + this.endTime = endTime; + } } From 31cca664ce097ae5d27593fef590a20be374eeb6 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sun, 19 Nov 2023 15:19:43 +0900 Subject: [PATCH 09/15] =?UTF-8?q?refactor(#105):=20=EB=B9=88=20=EC=8B=B8?= =?UTF-8?q?=EC=9D=B4=ED=81=B4=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/housework/info/HouseworkInfoService.java | 7 ++++++- .../repository/HouseworkMemberRepositoryCustom.java | 2 +- .../HouseworkMemberRepositoryCustomImpl.java | 11 ++--------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index 25c59575..1854a496 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -292,9 +292,14 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { // -> 비단건 집안일 else { - // 기존의 담당자 리스트가 groupMemberIdList와 동일하지 않다면(담당자가 바뀌었다면) houseworkMember 전부 삭제 + // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 false 리턴 boolean isHMUpdate = houseworkMemberRepository.deleteHouseworkMemberIfGroupMemberIdIn(requestInfo, request.getGroupMemberIdList()); + // 담당자가 바뀔 것이므로 이전 담당자 리스트 삭제 + if (!isHMUpdate) { + houseworkMemberRepository.deleteByHouseworkInfo(requestInfo); + } + // HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제 houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(requestInfo.getId()); diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java index 86d74b77..87c29789 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java @@ -6,6 +6,6 @@ import java.util.List; public interface HouseworkMemberRepositoryCustom { - // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 houseworkMember 전부 삭제 후 false 리턴 + // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 false 리턴 public boolean deleteHouseworkMemberIfGroupMemberIdIn(HouseworkInfo info, List groupMemberIdList); } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java index ba740378..390534b5 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java @@ -6,17 +6,16 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; -import static com.heachi.mysql.define.group.member.QGroupMember.groupMember; import static com.heachi.mysql.define.housework.member.QHouseworkMember.houseworkMember; @Component @RequiredArgsConstructor public class HouseworkMemberRepositoryCustomImpl implements HouseworkMemberRepositoryCustom { private final JPAQueryFactory queryFactory; - private final HouseworkMemberRepository houseworkMemberRepository; @Override @@ -28,12 +27,6 @@ public boolean deleteHouseworkMemberIfGroupMemberIdIn(HouseworkInfo info, List(groupIdList).containsAll(houseworkGroupMemberIdList); } } From 3689e721e21a419363b9854e512dd4b1fcf583e0 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sun, 19 Nov 2023 15:46:35 +0900 Subject: [PATCH 10/15] =?UTF-8?q?refactor(#105):=20=ED=98=BC=EB=8F=99?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=B3=80=EC=88=98=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housework/info/HouseworkInfoService.java | 31 ++++----- .../HouseworkInfoUpdateServiceRequest.java | 9 ++- .../info/HouseworkInfoServiceTest.java | 68 ++++++++++++++++++- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index 1854a496..165b917d 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -1,13 +1,11 @@ package com.heachi.housework.api.service.housework.info; -import ch.qos.logback.core.joran.conditional.IfAction; 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.HouseworkInfoCreateRequest; 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; @@ -34,12 +32,10 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import java.util.stream.Stream; @Slf4j @Service @@ -186,7 +182,8 @@ public HouseworkInfoUpdatePageResponse updateHouseworkPage(Long todoId) { public void updateHousework(HouseworkInfoUpdateServiceRequest request) { Long groupId = request.getGroupId(); Long todoId = request.getTodoId(); - LocalDate date = request.getDate(); + LocalDate requestDate = request.getRequestDate(); // 요청 날짜 + LocalDate updateDate = request.getDayDate(); // 수정할 날짜 // HouseworkTodo 조회 -> HouseworkInfo도 fetch Join 함께 조회 HouseworkTodo requestTodo = houseworkTodoRepository.findHouseworkTodoByIdJoinFetchHouseworkInfo(todoId).orElseThrow(() -> { @@ -235,15 +232,15 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { request.getDetail(), category.getName(), // 수정하고 싶은 카테고리 groupMemberIdListString, // 수정하고 싶은 담당자 리스트 - request.getDate(), + updateDate, request.getEndTime() ); // 요청 날짜의 todoList dirtyBit 체킹 - dirtyBitCheckWithDate(groupId, requestTodo.getDate()); + dirtyBitCheckWithDate(groupId, requestDate); // 수정 날짜의 todoList dirtyBit 체킹 - dirtyBitCheckWithDate(groupId, request.getDayDate()); + dirtyBitCheckWithDate(groupId, updateDate); } // -> 비단건 집안일 @@ -252,13 +249,13 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { requestTodo.deleteHouseworkTodo(); // 요청 날짜의 todoList를 조회 후 dirtyBit 체킹 - dirtyBitCheckWithDate(groupId, requestTodo.getDate()); + dirtyBitCheckWithDate(groupId, requestDate); // HouseworkInfo 생성 & 담당자 지정 해주기 - HouseworkMember 생성 houseworkInfoCreateAndHouseworkMemberCreate(HouseworkInfoCreateServiceRequest.of(request), groupInfo, category, groupMemberList); // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 - dirtyBitCheckWithGroupIdAndRequest(request.getGroupId(), request.getType(), request.getWeekDate(), request.getMonthDate()); + dirtyBitCheckWithGroupIdAndRequest(groupId, request.getType(), request.getWeekDate(), request.getMonthDate()); } } @@ -281,22 +278,22 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { .title(request.getTitle()) .detail(request.getDetail()) .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) - .date(request.getDayDate()) + .date(updateDate) .endTime(request.getEndTime()) .build()); // 해당 HouseworkTodo에 맞는 groupInfoId와 Date가 캐싱되어있다면, dirtyBit를 true로 바꿔줘야함. - dirtyBitCheckWithDate(request.getGroupId(), request.getDayDate()); + dirtyBitCheckWithDate(request.getGroupId(), updateDate); } // -> 비단건 집안일 else { // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 false 리턴 - boolean isHMUpdate = houseworkMemberRepository.deleteHouseworkMemberIfGroupMemberIdIn(requestInfo, request.getGroupMemberIdList()); + boolean isUpdateHouseworkMember = houseworkMemberRepository.deleteHouseworkMemberIfGroupMemberIdIn(requestInfo, request.getGroupMemberIdList()); // 담당자가 바뀔 것이므로 이전 담당자 리스트 삭제 - if (!isHMUpdate) { + if (!isUpdateHouseworkMember) { houseworkMemberRepository.deleteByHouseworkInfo(requestInfo); } @@ -305,7 +302,7 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() - .filter(todo -> todo.getDate().isAfter(LocalDate.now())) + .filter(todo -> todo.getDate().isAfter(LocalDate.now())) // 호출 시점 날짜 .forEach(HouseworkTodo::deleteHouseworkTodo); // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 -> 수정 전 날짜 기준 @@ -313,10 +310,10 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { // HouseworkInfo 수정 메서드 사용해 수정 requestInfo.updateHouseworkInfo(request.getTitle(), request.getDetail(), - category, request.getType(), request.getDate(), request.getEndTime(), requestInfo.getWeekDate(), requestInfo.getMonthDate()); + category, request.getType(), updateDate, request.getEndTime(), requestInfo.getWeekDate(), requestInfo.getMonthDate()); // HouseworkMember 생성 - 담당자 지정 - if (!isHMUpdate) { + if (!isUpdateHouseworkMember) { // HOUSEWORK_MEMBER 저장 - 담당자 지정 groupMemberList.stream() .map(gm -> HouseworkMember.builder() diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java index 23c29bf0..46411a23 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/request/HouseworkInfoUpdateServiceRequest.java @@ -7,7 +7,6 @@ import java.time.LocalDate; import java.time.LocalTime; -import java.util.ArrayList; import java.util.List; @Getter @@ -24,10 +23,10 @@ public class HouseworkInfoUpdateServiceRequest { private Long groupId; private Long todoId; - private LocalDate date; + private LocalDate requestDate; @Builder - public HouseworkInfoUpdateServiceRequest(List groupMemberIdList, Long houseworkCategoryId, String title, String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, String monthDate, LocalTime endTime, Long groupId, Long todoId, LocalDate date) { + public HouseworkInfoUpdateServiceRequest(List groupMemberIdList, Long houseworkCategoryId, String title, String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, String monthDate, LocalTime endTime, Long groupId, Long todoId, LocalDate requestDate) { this.groupMemberIdList = groupMemberIdList; this.houseworkCategoryId = houseworkCategoryId; this.title = title; @@ -39,7 +38,7 @@ public HouseworkInfoUpdateServiceRequest(List groupMemberIdList, Long hous this.endTime = endTime; this.groupId = groupId; this.todoId = todoId; - this.date = date; + this.requestDate = requestDate; } public static HouseworkInfoUpdateServiceRequest of(HouseworkInfoCreateRequest request, Long groupId, Long todoId, LocalDate date) { @@ -56,7 +55,7 @@ public static HouseworkInfoUpdateServiceRequest of(HouseworkInfoCreateRequest re .endTime(request.getEndTime()) .groupId(groupId) .todoId(todoId) - .date(date) + .requestDate(date) .build(); } } diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java index 10f03ab2..4d022253 100644 --- a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java @@ -9,6 +9,7 @@ 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.housework.api.service.housework.info.request.HouseworkInfoUpdateServiceRequest; import com.heachi.housework.api.service.housework.info.response.HouseworkInfoUpdatePageResponse; import com.heachi.mysql.define.group.info.GroupInfo; import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; @@ -635,7 +636,7 @@ void updateHouseworkWithPeriodNotDay() { HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); HouseworkInfo h = houseworkInfoRepository.save(generateCustom2HouseworkInfo(inWork, groupInfo, "test", HouseworkPeriodType.HOUSEWORK_PERIOD_WEEK)); HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() - .houseworkInfo(h) // 단건은 HouseworkInfo가 존재하지 않는다. + .houseworkInfo(h) .groupInfo(groupInfo) .houseworkMember(gA.getId() + "," + gB.getId()) .category(h.getHouseworkCategory().getName()) @@ -657,4 +658,69 @@ void updateHouseworkWithPeriodNotDay() { assertThat(response.getLocalDate()).isEqualTo(h.getDayDate()); assertThat(response.getEndTime()).isEqualTo(h.getEndTime()); } + + @Test + @DisplayName("단건 집안일을 단건 집안일로 변경했을 경우 HouseworkTodo가 수정된다.") + void updateHouseworkWithDayToDay() { + // given + // 단건 집안일 + User A = userRepository.save(generateCustomUser("aaa@naver.com", "010-0000-0000")); + User B = userRepository.save(generateCustomUser("bbb@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(A)); + GroupMember gA = groupMemberRepository.save(generateGroupMember(A, groupInfo)); + GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); + HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkCategory outWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(null) // 단건은 HouseworkInfo가 존재하지 않는다. + .groupInfo(groupInfo) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(inWork.getName()) + .title("title") + .detail("detail") + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(LocalDate.of(2023, 11, 18)) + .endTime(LocalTime.of(16, 30)) + .build()); + List todos = new ArrayList<>(); + todos.add(Todo.builder().id(todo.getId()).build()); + TodoList todoList = todoListRepository.save(generateTodoList(groupInfo.getId(), LocalDate.of(2023, 11, 18), todos)); + + // 수정 요청 DTO + HouseworkInfoUpdateServiceRequest request = HouseworkInfoUpdateServiceRequest.builder() + .groupMemberIdList(Arrays.asList(gA.getId())) // 담당자 변경 + .houseworkCategoryId(outWork.getId()) // 카테고리 변경 + .title("updateTitle") // 제목 변경 + .detail("updateDetail") // detail 변경 + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) // 단건 -> 단건 + .dayDate(LocalDate.of(2023, 11, 19)) // 변경 + .endTime(LocalTime.of(18, 30)) // 마감 시간 변경 + .groupId(groupInfo.getId()) + .todoId(todo.getId()) + .requestDate(LocalDate.of(2023, 11, 18)) + .build(); + + // when + houseworkInfoService.updateHousework(request); + + + } + + @Test + @DisplayName("단건 집안일을 비단건 집안일로 변경했을 경우 HouseworkTodo가 삭제되고 HouseworkInfo가 생성된다.") + void updateHouseworkWithDayToNotDay() { + + } + + @Test + @DisplayName("비단건 집안일을 단건 집안일로 변경했을 경우 HouseworkInfo가 삭제되고 HouseworkTodo가 생성된다.") + void updateHouseworkWithNotDayToDay() { + + } + + @Test + @DisplayName("비단건 집안일을 비단건 집안일로 변경했을 경우 이전의 HouseworkTodo들이 삭제되고 HouseworkInfo가 수정된다.") + void updateHouseworkWithNotDayToNotDay() { + + } } \ No newline at end of file From 09b0e11d27cc5020b9d0c1f4bb7c522610592385 Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sun, 19 Nov 2023 15:59:47 +0900 Subject: [PATCH 11/15] =?UTF-8?q?refactor(#105):=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=ED=8A=B8=EB=9E=9C=EC=9E=AD?= =?UTF-8?q?=EC=85=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/service/housework/info/HouseworkInfoService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index 165b917d..08768fe0 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -153,6 +153,7 @@ public void deleteHouseworkInfo(HouseworkInfoDeleteRequest request) { } } + @Transactional(readOnly = false) public HouseworkInfoUpdatePageResponse updateHouseworkPage(Long todoId) { // HouseworkTodo 조회 -> HouseworkInfo도 fetch Join 함께 조회 HouseworkTodo requestTodo = houseworkTodoRepository.findHouseworkTodoByIdJoinFetchHouseworkInfo(todoId).orElseThrow(() -> { @@ -179,6 +180,7 @@ public HouseworkInfoUpdatePageResponse updateHouseworkPage(Long todoId) { } } + @Transactional(readOnly = false) public void updateHousework(HouseworkInfoUpdateServiceRequest request) { Long groupId = request.getGroupId(); Long todoId = request.getTodoId(); From 548c0763c07798d67167bca42b397fd434c14d6d Mon Sep 17 00:00:00 2001 From: jusung-c Date: Sun, 19 Nov 2023 18:37:13 +0900 Subject: [PATCH 12/15] =?UTF-8?q?refactor(#105):=20DELETE=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EB=A1=9C=20=EB=B3=80=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에는 관계 해제 후 관계로 조회한 투두를DELETE 상태로 변경해줘서 아무일도 일어나지 않았었다. 관계 해제 전에 DELETE로 변경해줘야 했다. --- .../service/housework/info/HouseworkInfoService.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index 08768fe0..0482062d 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -304,7 +304,7 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() - .filter(todo -> todo.getDate().isAfter(LocalDate.now())) // 호출 시점 날짜 + .filter(todo -> todo.getDate().isAfter(LocalDate.now().minusDays(1))) // 호출 시점 날짜 .forEach(HouseworkTodo::deleteHouseworkTodo); // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 -> 수정 전 날짜 기준 @@ -340,6 +340,12 @@ private void houseworkInfoDeleteClean(HouseworkInfo requestInfo) { // HouseworkInfo를 외래키로 가진 HouseworkMember 삭제 houseworkMemberRepository.deleteByHouseworkInfo(requestInfo); + // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 + houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() + .filter(todo -> todo.getDate().isAfter(LocalDate.now().minusDays(1))) + .collect(Collectors.toList()) + .forEach(HouseworkTodo::deleteHouseworkTodo); + // HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제 houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(requestInfo.getId()); @@ -347,10 +353,6 @@ private void houseworkInfoDeleteClean(HouseworkInfo requestInfo) { houseworkInfoRepository.deleteById(requestInfo.getId()); log.info(">>>> HouseworkInfo Deleted: {}", requestInfo.getId()); - // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 - houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() - .filter(todo -> todo.getDate().isAfter(LocalDate.now())) - .forEach(HouseworkTodo::deleteHouseworkTodo); } // 해당 HouseworkTodo에 맞는 groupInfoId와 Date가 캐싱되어있다면, dirtyBit를 true로 바꿔줘야함. From f130fbe49a16811b74541716caebb649a43d352f Mon Sep 17 00:00:00 2001 From: jusung-c Date: Mon, 20 Nov 2023 00:04:55 +0900 Subject: [PATCH 13/15] =?UTF-8?q?test(#105):=20=EC=88=98=EC=A0=95=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housework/info/HouseworkInfoService.java | 11 +- .../info/HouseworkInfoServiceTest.java | 272 +++++++++++++++++- .../repository/HouseworkMemberRepository.java | 5 + .../HouseworkMemberRepositoryCustom.java | 3 +- .../HouseworkMemberRepositoryCustomImpl.java | 2 +- 5 files changed, 280 insertions(+), 13 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java index 0482062d..f98ea935 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/info/HouseworkInfoService.java @@ -292,21 +292,22 @@ public void updateHousework(HouseworkInfoUpdateServiceRequest request) { // -> 비단건 집안일 else { // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 false 리턴 - boolean isUpdateHouseworkMember = houseworkMemberRepository.deleteHouseworkMemberIfGroupMemberIdIn(requestInfo, request.getGroupMemberIdList()); + boolean isUpdateHouseworkMember = houseworkMemberRepository.isSameHouseworkMemberIdAndGroupMemberId(requestInfo, request.getGroupMemberIdList()); // 담당자가 바뀔 것이므로 이전 담당자 리스트 삭제 if (!isUpdateHouseworkMember) { houseworkMemberRepository.deleteByHouseworkInfo(requestInfo); } - // HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제 - houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(requestInfo.getId()); - // 호출 시점 이후의 HouseworkTodo를 HOUSEWORK_TODO_DELETE로 상태 변경 houseworkTodoRepository.findHouseworkTodoByHouseworkInfo(requestInfo.getId()).stream() - .filter(todo -> todo.getDate().isAfter(LocalDate.now().minusDays(1))) // 호출 시점 날짜 + .filter(todo -> todo.getDate().isAfter(LocalDate.now().minusDays(1))) + .collect(Collectors.toList()) .forEach(HouseworkTodo::deleteHouseworkTodo); + // HouseworkInfo를 외래키로 가진 HouseworkTodo의 houseworkInfo 필드값 null로 변환해 관계 해제 + houseworkTodoRepository.updateHouseworkTodoByHouseworkInfoId(requestInfo.getId()); + // findByGroupInfoId를 통해 해당 그룹의 캐싱된 객체 조회 -> 수정 전 날짜 기준 dirtyBitCheckWithGroupIdAndRequest(groupId, requestInfo.getType(), requestInfo.getWeekDate(), requestInfo.getMonthDate()); diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java index 4d022253..b2b25a15 100644 --- a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/info/HouseworkInfoServiceTest.java @@ -671,6 +671,10 @@ void updateHouseworkWithDayToDay() { GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); HouseworkCategory outWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); + + LocalDate requestDate = LocalDate.of(2023, 11, 18); + LocalDate updateDate = LocalDate.of(2023, 11, 19); + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() .houseworkInfo(null) // 단건은 HouseworkInfo가 존재하지 않는다. .groupInfo(groupInfo) @@ -679,12 +683,12 @@ void updateHouseworkWithDayToDay() { .title("title") .detail("detail") .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) - .date(LocalDate.of(2023, 11, 18)) + .date(requestDate) .endTime(LocalTime.of(16, 30)) .build()); List todos = new ArrayList<>(); todos.add(Todo.builder().id(todo.getId()).build()); - TodoList todoList = todoListRepository.save(generateTodoList(groupInfo.getId(), LocalDate.of(2023, 11, 18), todos)); + todoListRepository.save(generateTodoList(groupInfo.getId(), requestDate, todos)); // 수정 요청 DTO HouseworkInfoUpdateServiceRequest request = HouseworkInfoUpdateServiceRequest.builder() @@ -693,34 +697,292 @@ void updateHouseworkWithDayToDay() { .title("updateTitle") // 제목 변경 .detail("updateDetail") // detail 변경 .type(HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) // 단건 -> 단건 - .dayDate(LocalDate.of(2023, 11, 19)) // 변경 + .dayDate(updateDate) // 변경 .endTime(LocalTime.of(18, 30)) // 마감 시간 변경 .groupId(groupInfo.getId()) .todoId(todo.getId()) - .requestDate(LocalDate.of(2023, 11, 18)) + .requestDate(requestDate) .build(); // when houseworkInfoService.updateHousework(request); + HouseworkTodo findTodo = houseworkTodoRepository.findHouseworkTodoByIdAndGroupMemberId(todo.getId(), groupInfo.getId()).get(); - + // then + assertThat(findTodo).isNotNull(); + assertThat(findTodo.getHouseworkInfo()).isNull(); + assertThat(findTodo.getCategory()).isEqualTo(outWork.getName()); + assertThat(findTodo.getHouseworkMember()).isEqualTo(gA.getId().toString()); + assertThat(findTodo.getTitle()).isEqualTo("updateTitle"); + assertThat(findTodo.getDetail()).isEqualTo("updateDetail"); + assertThat(findTodo.getDate()).isEqualTo(updateDate); + assertThat(findTodo.getEndTime()).isEqualTo(LocalTime.of(18, 30)); + + TodoList todoList = todoListRepository.findByGroupInfoIdAndDate(groupInfo.getId(), requestDate).get(); + assertThat(todoList.isDirtyBit()).isTrue(); } @Test @DisplayName("단건 집안일을 비단건 집안일로 변경했을 경우 HouseworkTodo가 삭제되고 HouseworkInfo가 생성된다.") void updateHouseworkWithDayToNotDay() { + // given + // 단건 집안일 + User A = userRepository.save(generateCustomUser("aaa@naver.com", "010-0000-0000")); + User B = userRepository.save(generateCustomUser("bbb@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(A)); + GroupMember gA = groupMemberRepository.save(generateGroupMember(A, groupInfo)); + GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); + HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkCategory outWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); + + LocalDate requestDate = LocalDate.of(2023, 11, 18); + LocalDate updateDate = LocalDate.of(2023, 11, 19); + + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(null) // 단건은 HouseworkInfo가 존재하지 않는다. + .groupInfo(groupInfo) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(inWork.getName()) + .title("title") + .detail("detail") + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(requestDate) + .endTime(LocalTime.of(16, 30)) + .build()); + List todos = new ArrayList<>(); + todos.add(Todo.builder().id(todo.getId()).build()); + todoListRepository.save(generateTodoList(groupInfo.getId(), requestDate, todos)); + + // 수정 요청 DTO + HouseworkInfoUpdateServiceRequest request = HouseworkInfoUpdateServiceRequest.builder() + .groupMemberIdList(Arrays.asList(gA.getId())) // 담당자 변경 + .houseworkCategoryId(outWork.getId()) // 카테고리 변경 + .title("updateTitle") // 제목 변경 + .detail("updateDetail") // detail 변경 + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_WEEK) // 단건 -> 비단건 + .weekDate("3") + .dayDate(updateDate) // 변경 + .endTime(LocalTime.of(18, 30)) // 마감 시간 변경 + .groupId(groupInfo.getId()) + .todoId(todo.getId()) + .requestDate(requestDate) + .build(); + + // when + houseworkInfoService.updateHousework(request); + + // then + // 기존 TODO가 DELETE로 잘 변경되었는지 확인 + HouseworkTodo findTodo = houseworkTodoRepository.findHouseworkTodoByIdAndGroupMemberId(todo.getId(), groupInfo.getId()).get(); + assertThat(findTodo).isNotNull(); + assertThat(findTodo.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_DELETE); + + // 생성된 HouseworkInfo 확인 + HouseworkInfo findInfo = houseworkInfoRepository.findHouseworkInfoByIdJoinFetchHouseworkMembers(1L).get(); + assertThat(findInfo).isNotNull(); + assertThat(findInfo.getHouseworkCategory().getId()).isEqualTo(outWork.getId()); + + // 요청 날짜 캐싱 확인 + TodoList requestTodoList = todoListRepository.findByGroupInfoIdAndDate(groupInfo.getId(), requestDate).get(); + assertThat(requestTodoList.isDirtyBit()).isTrue(); + } @Test @DisplayName("비단건 집안일을 단건 집안일로 변경했을 경우 HouseworkInfo가 삭제되고 HouseworkTodo가 생성된다.") void updateHouseworkWithNotDayToDay() { + // given + LocalDate requestDate = LocalDate.of(2023, 12, 19); + LocalTime requestTime = LocalTime.of(16, 30); + LocalTime updateTime = LocalTime.of(20, 0); + + // 비단건 집안일 + User A = userRepository.save(generateCustomUser("aaa@naver.com", "010-0000-0000")); + User B = userRepository.save(generateCustomUser("bbb@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(A)); + GroupMember gA = groupMemberRepository.save(generateGroupMember(A, groupInfo)); + GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); + HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkCategory outWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); + HouseworkInfo info = houseworkInfoRepository.save(HouseworkInfo.builder() + .groupInfo(groupInfo).houseworkCategory(inWork).title("빨래").detail("빨래하기") + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_MONTH) + .monthDate("19").endTime(requestTime).build()); + houseworkMemberRepository.save(generateHouseworkMember(gA, info)); + houseworkMemberRepository.save(generateHouseworkMember(gB, info)); + + // 12월 19일 날짜의 Todo + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(info) + .groupInfo(info.getGroupInfo()) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(info.getHouseworkCategory().getName()) + .title(info.getTitle()) + .detail(info.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(requestDate) + .endTime(requestTime) + .build()); + + // 내년 1월 19일 날짜의 Todo + HouseworkTodo todo2 = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(info) + .groupInfo(info.getGroupInfo()) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(info.getHouseworkCategory().getName()) + .title(info.getTitle()) + .detail(info.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(LocalDate.of(2024, 1, 19)) + .endTime(requestTime) + .build()); + + + // 요청 날짜의 TodoList 생성 + List todos = new ArrayList<>(); + todos.add(Todo.builder().id(todo.getId()).build()); + todoListRepository.save(generateTodoList(groupInfo.getId(), requestDate, todos)); + + // 수정 요청 DTO + HouseworkInfoUpdateServiceRequest request = HouseworkInfoUpdateServiceRequest.builder() + .groupMemberIdList(Arrays.asList(gA.getId())) // 담당자 변경 + .houseworkCategoryId(outWork.getId()) // 카테고리 변경 + .title("updateTitle") // 제목 변경 + .detail("updateDetail") // detail 변경 + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_DAY) // 비단건 -> 단건 + .dayDate(LocalDate.now()) // 오늘 날짜의 단건 집안일로 변경 + .endTime(updateTime) // 마감 시간 변경 + .groupId(groupInfo.getId()) + .todoId(todo.getId()) + .requestDate(requestDate) + .build(); + // when + houseworkInfoService.updateHousework(request); + + // then + // 기존의 HouseworkInfo가 잘 삭제되었는지 확인 + HouseworkInfo findInfo = houseworkInfoRepository.findHouseworkInfoByIdJoinFetchHouseworkMembers(info.getId()).orElse(null); + assertThat(findInfo).isNull(); + + // 기존의 HouseworkTodo의 상태가 DELETE로 변경되었는지 확인 + HouseworkTodo findTodo = houseworkTodoRepository.findById(todo.getId()).get(); + assertThat(findTodo.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_DELETE); + + HouseworkTodo findTodo2 = houseworkTodoRepository.findById(todo2.getId()).get(); + assertThat(findTodo.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_DELETE); + + // 요청 날짜 캐싱 확인 + TodoList requestTodoList = todoListRepository.findByGroupInfoIdAndDate(groupInfo.getId(), requestDate).get(); + assertThat(requestTodoList.isDirtyBit()).isTrue(); + + // 생성된 단건 집안일 확인 + HouseworkTodo saveTodo = houseworkTodoRepository.findByGroupInfoAndDate(groupInfo.getId(), LocalDate.now()).get(0); + assertThat(saveTodo).isNotNull(); + assertThat(saveTodo.getHouseworkInfo()).isNull(); + assertThat(saveTodo.getCategory()).isEqualTo(outWork.getName()); + assertThat(saveTodo.getHouseworkMember()).isEqualTo(gA.getId().toString()); + assertThat(saveTodo.getTitle()).isEqualTo("updateTitle"); + assertThat(saveTodo.getDetail()).isEqualTo("updateDetail"); + assertThat(saveTodo.getDate()).isEqualTo(LocalDate.now()); + assertThat(saveTodo.getEndTime()).isEqualTo(updateTime); } @Test @DisplayName("비단건 집안일을 비단건 집안일로 변경했을 경우 이전의 HouseworkTodo들이 삭제되고 HouseworkInfo가 수정된다.") void updateHouseworkWithNotDayToNotDay() { + // given + LocalDate requestDate = LocalDate.of(2023, 12, 19); + LocalTime requestTime = LocalTime.of(16, 30); + LocalTime updateTime = LocalTime.of(20, 0); + + // 비단건 집안일 + User A = userRepository.save(generateCustomUser("aaa@naver.com", "010-0000-0000")); + User B = userRepository.save(generateCustomUser("bbb@naver.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(A)); + GroupMember gA = groupMemberRepository.save(generateGroupMember(A, groupInfo)); + GroupMember gB = groupMemberRepository.save(generateGroupMember(B, groupInfo)); + HouseworkCategory inWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집안일")); + HouseworkCategory outWork = houseworkCategoryRepository.save(generateCustomHouseworkCategory("집 밖의 일")); + HouseworkInfo info = houseworkInfoRepository.save(HouseworkInfo.builder() + .groupInfo(groupInfo).houseworkCategory(inWork).title("빨래").detail("빨래하기") + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_MONTH) + .monthDate("19").endTime(requestTime).build()); + HouseworkMember hA = houseworkMemberRepository.save(generateHouseworkMember(gA, info)); + HouseworkMember hB = houseworkMemberRepository.save(generateHouseworkMember(gB, info)); + + // 12월 19일 날짜의 Todo + HouseworkTodo todo = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(info) + .groupInfo(info.getGroupInfo()) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(info.getHouseworkCategory().getName()) + .title(info.getTitle()) + .detail(info.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(requestDate) + .endTime(requestTime) + .build()); + + // 내년 1월 19일 날짜의 Todo + HouseworkTodo todo2 = houseworkTodoRepository.save(HouseworkTodo.builder() + .houseworkInfo(info) + .groupInfo(info.getGroupInfo()) + .houseworkMember(gA.getId() + "," + gB.getId()) + .category(info.getHouseworkCategory().getName()) + .title(info.getTitle()) + .detail(info.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(LocalDate.of(2024, 1, 19)) + .endTime(requestTime) + .build()); + + + // 요청 날짜의 TodoList 생성 + List todos = new ArrayList<>(); + todos.add(Todo.builder().id(todo.getId()).build()); + todoListRepository.save(generateTodoList(groupInfo.getId(), requestDate, todos)); + + // 수정 요청 DTO + HouseworkInfoUpdateServiceRequest request = HouseworkInfoUpdateServiceRequest.builder() + .groupMemberIdList(Arrays.asList(gA.getId())) // 담당자 변경 + .houseworkCategoryId(outWork.getId()) // 카테고리 변경 + .title("updateTitle") // 제목 변경 + .detail("updateDetail") // detail 변경 + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY) // 매달 하는 집안일 -> 매일 하는 집안일 + .endTime(updateTime) // 마감 시간 변경 + .groupId(groupInfo.getId()) + .todoId(todo.getId()) + .requestDate(requestDate) + .build(); + + // when + houseworkInfoService.updateHousework(request); + + // then + // 이전 담당자 리스트 삭제되었는지 확인 + assertThat(houseworkMemberRepository.findById(hA.getId())).isEmpty(); + assertThat(houseworkMemberRepository.findById(hB.getId())).isEmpty(); + + // 기존의 HouseworkTodo의 상태가 DELETE로 변경되었는지 확인 + HouseworkTodo findTodo = houseworkTodoRepository.findById(todo.getId()).get(); + assertThat(findTodo.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_DELETE); + + HouseworkTodo findTodo2 = houseworkTodoRepository.findById(todo2.getId()).get(); + assertThat(findTodo.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_DELETE); + + // 생성된 HouseworkInfo 확인 + HouseworkInfo findInfo = houseworkInfoRepository.findHouseworkInfoByIdJoinFetchHouseworkMembers(1L).get(); + assertThat(findInfo).isNotNull(); + assertThat(findInfo.getHouseworkCategory().getId()).isEqualTo(outWork.getId()); + + // 생성된 HouseworkMember 확인 + assertThat(houseworkMemberRepository.findByHouseworkInfo(findInfo).size()).isEqualTo(1); + + // 요청 날짜 캐싱 확인 + TodoList requestTodoList = todoListRepository.findByGroupInfoIdAndDate(groupInfo.getId(), requestDate).get(); + assertThat(requestTodoList.isDirtyBit()).isTrue(); } } \ No newline at end of file diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java index fd822f3a..f4dfe47c 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java @@ -5,8 +5,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + public interface HouseworkMemberRepository extends JpaRepository, HouseworkMemberRepositoryCustom { // houseworkInfo와 일치하는 값들을 삭제한다. public void deleteByHouseworkInfo(HouseworkInfo houseworkInfo); + + // houseworkInfo를 외래키로 가진 HouseworkMember 리스트 조회 + public List findByHouseworkInfo(HouseworkInfo houseworkInfo); } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java index 87c29789..d13fc77a 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustom.java @@ -1,11 +1,10 @@ package com.heachi.mysql.define.housework.member.repository; import com.heachi.mysql.define.housework.info.HouseworkInfo; -import com.heachi.mysql.define.housework.member.HouseworkMember; import java.util.List; public interface HouseworkMemberRepositoryCustom { // hosueworkInfo의 담당자 리스트를 뽑은 후 groupMemberIdList와 동일하지 않다면 false 리턴 - public boolean deleteHouseworkMemberIfGroupMemberIdIn(HouseworkInfo info, List groupMemberIdList); + public boolean isSameHouseworkMemberIdAndGroupMemberId(HouseworkInfo info, List groupMemberIdList); } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java index 390534b5..6b0e80c0 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java @@ -19,7 +19,7 @@ public class HouseworkMemberRepositoryCustomImpl implements HouseworkMemberRepos @Override - public boolean deleteHouseworkMemberIfGroupMemberIdIn(HouseworkInfo info, List groupIdList) { + public boolean isSameHouseworkMemberIdAndGroupMemberId(HouseworkInfo info, List groupIdList) { List houseworkMemberList = queryFactory.selectFrom(houseworkMember) .where(houseworkMember.houseworkInfo.eq(info)).fetch(); List houseworkGroupMemberIdList = houseworkMemberList.stream() From 46eed036c9662b27c0ebf12d094bb26cb1b2ca2c Mon Sep 17 00:00:00 2001 From: Jusung Lee <32183520@dankook.ac.kr> Date: Wed, 22 Nov 2023 15:29:58 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor(#105):=20housework=EC=97=90=20@E?= =?UTF-8?q?nableJpaAuditing=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/heachi/auth/config/security/SecurityConfig.java | 2 +- .../java/com/heachi/housework/HeachiHouseworkApplication.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/heachi-core/auth-api/src/main/java/com/heachi/auth/config/security/SecurityConfig.java b/heachi-core/auth-api/src/main/java/com/heachi/auth/config/security/SecurityConfig.java index 2798ba79..5946e991 100644 --- a/heachi-core/auth-api/src/main/java/com/heachi/auth/config/security/SecurityConfig.java +++ b/heachi-core/auth-api/src/main/java/com/heachi/auth/config/security/SecurityConfig.java @@ -32,7 +32,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti // register .requestMatchers("/auth/register").hasAnyAuthority("UNAUTH") // Others - .anyRequest().hasAnyAuthority("USER", "CHEMIST", "CENTER") + .anyRequest().hasAnyAuthority("USER") ) .sessionManagement((sessionManagement) -> sessionManagement diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java index f712b970..0fac6026 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java @@ -3,8 +3,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication(scanBasePackages = "com.heachi", exclude = SecurityAutoConfiguration.class) +@EnableJpaAuditing // JPA Auditing 기능 활성화 - BaseEntity public class HeachiHouseworkApplication { public static void main(String[] args) { From 96f9af7930fbda58e14d0ab7a37c67cbab16924c Mon Sep 17 00:00:00 2001 From: Jusung Lee <32183520@dankook.ac.kr> Date: Thu, 23 Nov 2023 16:22:09 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor(#105):=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/repository/HouseworkMemberRepository.java | 1 + .../repository/HouseworkMemberRepositoryCustomImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java index f4dfe47c..2009e364 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java @@ -10,6 +10,7 @@ public interface HouseworkMemberRepository extends JpaRepository, HouseworkMemberRepositoryCustom { // houseworkInfo와 일치하는 값들을 삭제한다. + @Transactional public void deleteByHouseworkInfo(HouseworkInfo houseworkInfo); // houseworkInfo를 외래키로 가진 HouseworkMember 리스트 조회 diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java index 6b0e80c0..e0d4f60f 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepositoryCustomImpl.java @@ -19,7 +19,7 @@ public class HouseworkMemberRepositoryCustomImpl implements HouseworkMemberRepos @Override - public boolean isSameHouseworkMemberIdAndGroupMemberId(HouseworkInfo info, List groupIdList) { + public boolean isSameHouseworkMemberIdAndGroupMemberId(HouseworkInfo info, List groupMemberIdList) { List houseworkMemberList = queryFactory.selectFrom(houseworkMember) .where(houseworkMember.houseworkInfo.eq(info)).fetch(); List houseworkGroupMemberIdList = houseworkMemberList.stream() @@ -27,6 +27,6 @@ public boolean isSameHouseworkMemberIdAndGroupMemberId(HouseworkInfo info, List< .collect(Collectors.toList()); // houseworkGroupMemberIdList의 요소들이 groupIdList의 요소들과 정확히 일치하면 true 리턴 - return new HashSet<>(groupIdList).containsAll(houseworkGroupMemberIdList); + return new HashSet<>(groupMemberIdList).containsAll(houseworkGroupMemberIdList); } }