From b2bd023d883f6e8c4f0a6fd4da436b3451f8075f Mon Sep 17 00:00:00 2001 From: Youth <109585620+Youthhing@users.noreply.github.com> Date: Fri, 6 Sep 2024 13:28:34 +0900 Subject: [PATCH] =?UTF-8?q?Fix:=20=EB=8F=99=EC=9D=98=ED=95=9C=20=EC=A0=95?= =?UTF-8?q?=EC=B1=85=EC=9D=B4=20=EB=B3=B4=EC=9D=B4=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0=20(#145)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 회원 정책과 기록 연관관계 제거 * fix: 동의한 회원 정책을 반환하지 않는 오류 수정 * refactor: 정책 동의 메서드 수정 --- .../domain/auth/entity/MemberPolicy.java | 13 ++--- .../domain/auth/service/PolicyService.java | 57 +++++++++++-------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/auth/entity/MemberPolicy.java b/src/main/java/org/cotato/csquiz/domain/auth/entity/MemberPolicy.java index 08af68b5..d009559c 100644 --- a/src/main/java/org/cotato/csquiz/domain/auth/entity/MemberPolicy.java +++ b/src/main/java/org/cotato/csquiz/domain/auth/entity/MemberPolicy.java @@ -34,18 +34,17 @@ public class MemberPolicy extends BaseTimeEntity { @JoinColumn(name = "member_id") private Member member; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "policy_id") - private Policy policy; + @Column(name = "policy_id", nullable = false) + private Long policyId; - private MemberPolicy(Boolean isChecked, Member member, Policy policy) { + private MemberPolicy(Boolean isChecked, Member member, Long policyId) { this.isChecked = isChecked; this.member = member; - this.policy = policy; + this.policyId = policyId; this.checkTime = LocalDateTime.now(); } - public static MemberPolicy of(Boolean isChecked, Member member, Policy policy){ - return new MemberPolicy(isChecked, member, policy); + public static MemberPolicy of(Boolean isChecked, Member member, Long policyId) { + return new MemberPolicy(isChecked, member, policyId); } } diff --git a/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java b/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java index 3f123863..b649973b 100644 --- a/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java +++ b/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java @@ -1,11 +1,10 @@ package org.cotato.csquiz.domain.auth.service; +import jakarta.persistence.EntityNotFoundException; import java.util.List; -import java.util.Map; -import java.util.function.Function; +import java.util.Set; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.cotato.csquiz.api.policy.dto.CheckMemberPoliciesRequest; import org.cotato.csquiz.api.policy.dto.CheckPolicyRequest; import org.cotato.csquiz.api.policy.dto.FindMemberPolicyResponse; import org.cotato.csquiz.api.policy.dto.PoliciesResponse; @@ -34,7 +33,7 @@ public FindMemberPolicyResponse findUnCheckedPolicies(final Long memberId) { // 회원이 체크한 정책 List checkedPolicies = memberPolicyRepository.findAllByMemberId(memberId).stream() .filter(MemberPolicy::getIsChecked) - .map(MemberPolicy::getId) + .map(MemberPolicy::getPolicyId) .toList(); List uncheckedEssentialPolicies = policyRepository.findAllByPolicyType(PolicyType.ESSENTIAL) @@ -43,7 +42,8 @@ public FindMemberPolicyResponse findUnCheckedPolicies(final Long memberId) { .map(PolicyInfoResponse::from) .toList(); - List uncheckedOptionalPolicies = policyRepository.findAllByPolicyType(PolicyType.OPTIONAL).stream() + List uncheckedOptionalPolicies = policyRepository.findAllByPolicyType(PolicyType.OPTIONAL) + .stream() .filter(policy -> !checkedPolicies.contains(policy.getId())) .map(PolicyInfoResponse::from) .toList(); @@ -52,47 +52,54 @@ public FindMemberPolicyResponse findUnCheckedPolicies(final Long memberId) { } @Transactional - public void checkPolicies(Long memberId, List policies) { + public void checkPolicies(Long memberId, List checkedPolicies) { Member findMember = memberService.findById(memberId); - List policyIds = policies.stream() + List policyIds = checkedPolicies.stream() .map(CheckPolicyRequest::policyId) .toList(); + List policies = policyRepository.findAllByIdIn(policyIds); + + if (policies.size() != policyIds.size()) { + throw new EntityNotFoundException("해당 정책을 찾을 수 없습니다."); + } + // 해당 정책에 이미 체크했는지 확인 if (isAlreadyChecked(findMember, policyIds)) { throw new AppException(ErrorCode.ALREADY_POLICY_CHECK); } + // 필수 정책에 체크하지 않았는지 확인 + validateCheckEssentialPolicies(getEssentialPolicies(policies), policyIds); - Map policyMap = policyRepository.findAllByIdIn(policyIds).stream() - .collect(Collectors.toMap(Policy::getId, Function.identity())); - - List memberPolicies = policies.stream() - .map(policyRequest -> MemberPolicy.of(policyRequest.isChecked(), findMember, - policyMap.get(policyRequest.policyId()))) + List memberPolicies = checkedPolicies.stream() + .map(policyRequest -> MemberPolicy.of(policyRequest.isChecked(), findMember, policyRequest.policyId())) .toList(); - if (hasDisagreementInEssential(memberPolicies)) { + memberPolicyRepository.saveAll(memberPolicies); + } + + private void validateCheckEssentialPolicies(List essentialPolicies, List checkedPolicyIds) { + Set essentialIds = essentialPolicies.stream() + .map(Policy::getId) + .collect(Collectors.toUnmodifiableSet()); + + if (checkedPolicyIds.stream().anyMatch(id -> !essentialIds.contains(id))) { throw new AppException(ErrorCode.SHOULD_AGREE_POLICY); } + } - memberPolicyRepository.saveAll(memberPolicies); + private List getEssentialPolicies(List policies) { + return policies.stream() + .filter(policy -> policy.getPolicyType() == PolicyType.ESSENTIAL) + .toList(); } private boolean isAlreadyChecked(Member findMember, List policyIds) { return memberPolicyRepository.findAllByMemberId(findMember.getId()).stream() - .map(MemberPolicy::getPolicy) - .map(Policy::getId) + .map(MemberPolicy::getPolicyId) .anyMatch(policyIds::contains); } - private boolean hasDisagreementInEssential(List checkedPolicies) { - return checkedPolicies.stream() - .filter(checkedPolicy -> checkedPolicy.getIsChecked().equals(false)) - .map(MemberPolicy::getPolicy) - .map(Policy::getPolicyType) - .anyMatch(PolicyType.ESSENTIAL::equals); - } - public PoliciesResponse findPolicies() { List policies = policyRepository.findAll().stream() .map(PolicyInfoResponse::from)