diff --git a/AWSCLIV2.pkg b/AWSCLIV2.pkg deleted file mode 100644 index a7fe9463..00000000 Binary files a/AWSCLIV2.pkg and /dev/null differ diff --git a/umbba-api/src/main/java/sopt/org/umbba/api/service/qna/QnAService.java b/umbba-api/src/main/java/sopt/org/umbba/api/service/qna/QnAService.java index 17e6a5eb..db4092b0 100644 --- a/umbba-api/src/main/java/sopt/org/umbba/api/service/qna/QnAService.java +++ b/umbba-api/src/main/java/sopt/org/umbba/api/service/qna/QnAService.java @@ -114,8 +114,14 @@ public List getQnaList(Long userId, Long sectionId) { Parentchild parentchild = getParentchildByUser(myUser); List qnaList = getQnAListByParentchild(parentchild); + QnA todayQnA = getTodayQnAByParentchild(parentchild); + int doneIndex = parentchild.getCount() - 1; + if (todayQnA.isChildAnswer() && todayQnA.isParentAnswer()) { + doneIndex += 1; + } + return qnaList.stream() - .limit(parentchild.getCount() - 1) // index까지만 요소를 처리 + .limit(doneIndex) // 현재 답변 완료된 index까지 보이도록 .filter(qna -> Objects.equals(qna.getQuestion().getSection().getSectionId(), sectionId)) .map(qna -> { return QnAListResponseDto.builder() diff --git a/umbba-api/src/main/java/sopt/org/umbba/api/service/user/AuthService.java b/umbba-api/src/main/java/sopt/org/umbba/api/service/user/AuthService.java index beb26084..f9cd682d 100644 --- a/umbba-api/src/main/java/sopt/org/umbba/api/service/user/AuthService.java +++ b/umbba-api/src/main/java/sopt/org/umbba/api/service/user/AuthService.java @@ -15,21 +15,27 @@ import sopt.org.umbba.api.service.user.social.kakao.KakaoLoginService; import sopt.org.umbba.common.exception.ErrorType; import sopt.org.umbba.common.exception.model.CustomException; +import sopt.org.umbba.domain.domain.parentchild.Parentchild; +import sopt.org.umbba.domain.domain.parentchild.repository.ParentchildRepository; +import sopt.org.umbba.domain.domain.qna.repository.QnARepository; import sopt.org.umbba.domain.domain.user.SocialPlatform; import sopt.org.umbba.domain.domain.user.User; import sopt.org.umbba.domain.domain.user.repository.UserRepository; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; +import java.util.List; @Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) -public class AuthService { +public class AuthService { private final JwtProvider jwtProvider; private final UserRepository userRepository; + private final ParentchildRepository parentchildRepository; + private final QnARepository qnARepository; private final AppleLoginService appleLoginService; private final KakaoLoginService kakaoLoginService; @@ -98,9 +104,21 @@ public void logout(Long userId) { public void signout(Long userId) { User user = getUserById(userId); user.updateRefreshToken(null); - jwtProvider.deleteRefreshToken(userId); // 일치하는 ID가 없는 경우에는 아무 동작도 수행하지 않음 (CrudRepository 기본 동작) user.updateFcmToken(null); user.deleteSocialInfo(); + jwtProvider.deleteRefreshToken(userId); // 일치하는 ID가 없는 경우에는 아무 동작도 수행하지 않음 (CrudRepository 기본 동작) + + Parentchild parentChild = user.getParentChild(); + List findUsers = userRepository.findUserByParentChild(parentChild); + + boolean allUsersDeleted = findUsers.stream() + .allMatch(u -> u.getSocialPlatform().equals(SocialPlatform.WITHDRAW)); + if (allUsersDeleted) { + log.info("삭제된 부모자식: {} X {}", findUsers.get(0).getUsername(), findUsers.get(1).getUsername()); + parentChild.getQnaList().forEach(qna -> qnARepository.deleteById(qna.getId())); + parentchildRepository.deleteById(parentChild.getId()); + findUsers.forEach(u -> userRepository.deleteById(u.getId())); + } } private User getUserById(Long userId) { diff --git a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/Parentchild.java b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/Parentchild.java index d435a3d7..96743556 100644 --- a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/Parentchild.java +++ b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/Parentchild.java @@ -2,6 +2,8 @@ import lombok.*; import lombok.extern.slf4j.Slf4j; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; import sopt.org.umbba.common.exception.ErrorType; import sopt.org.umbba.common.exception.model.CustomException; import sopt.org.umbba.domain.domain.common.AuditingTimeEntity; @@ -19,6 +21,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Builder +@SQLDelete(sql = "UPDATE parentchild SET deleted=true WHERE parentchild_id=?") +@Where(clause = "deleted=false") public class Parentchild extends AuditingTimeEntity { @Id @@ -81,6 +85,8 @@ public void changeParentOnboardingAnswerList(List onboardingAn @Column(nullable = false) private LocalTime pushTime; // default: 오후 11시(클라이언트) + private boolean deleted = Boolean.FALSE; + public void initQnA() { qnaList = new ArrayList<>(); } diff --git a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/repository/ParentchildRepository.java b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/repository/ParentchildRepository.java index f9efe00c..a244bd32 100644 --- a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/repository/ParentchildRepository.java +++ b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/parentchild/repository/ParentchildRepository.java @@ -17,8 +17,8 @@ public interface ParentchildRepository extends Repository { List findAll(); - // UPDATE // DELETE + void deleteById(Long id); } diff --git a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/QnA.java b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/QnA.java index e689f60b..ff6892b4 100644 --- a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/QnA.java +++ b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/QnA.java @@ -1,6 +1,8 @@ package sopt.org.umbba.domain.domain.qna; import lombok.*; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; import sopt.org.umbba.domain.domain.common.AuditingTimeEntity; import javax.persistence.*; @@ -10,6 +12,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Builder +@SQLDelete(sql = "UPDATE qna SET deleted=true WHERE qna_id=?") +@Where(clause = "deleted=false") public class QnA extends AuditingTimeEntity { @Id @@ -31,6 +35,7 @@ public class QnA extends AuditingTimeEntity { @Column(nullable = false) private boolean isChildAnswer; + private boolean deleted = Boolean.FALSE; public boolean isParentAnswer() { return isParentAnswer; diff --git a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/repository/QnARepository.java b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/repository/QnARepository.java index a90632b7..d10413b8 100644 --- a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/repository/QnARepository.java +++ b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/qna/repository/QnARepository.java @@ -10,4 +10,6 @@ public interface QnARepository extends Repository { void save(QnA qnA); Optional findQnAById(Long id); + + void deleteById(Long id); } diff --git a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/User.java b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/User.java index 6af074f2..91db80bf 100644 --- a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/User.java +++ b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/User.java @@ -2,6 +2,8 @@ import lombok.*; import lombok.extern.slf4j.Slf4j; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; import sopt.org.umbba.domain.domain.common.AuditingTimeEntity; import sopt.org.umbba.domain.domain.parentchild.Parentchild; @@ -15,6 +17,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Builder +@SQLDelete(sql = "UPDATE user SET deleted=true WHERE user_id=?") +@Where(clause = "deleted=false") public class User extends AuditingTimeEntity { @Id @@ -82,7 +86,8 @@ public void updateFcmToken(String fcmToken) { private String socialAccessToken; // private String socialRefreshToken; - // + + private boolean deleted = Boolean.FALSE; // 로그인 새롭게 할 때마다 해당 필드들 업데이트 public void updateSocialInfo(String socialNickname, String socialProfileImage, String socialAccessToken/*, String socialRefreshToken*/) { diff --git a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/repository/UserRepository.java b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/repository/UserRepository.java index cb6ecdc7..5e717518 100644 --- a/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/repository/UserRepository.java +++ b/umbba-domain/src/main/java/sopt/org/umbba/domain/domain/user/repository/UserRepository.java @@ -19,11 +19,12 @@ public interface UserRepository extends Repository { Optional findBySocialPlatformAndSocialId(SocialPlatform socialPlatform, String socialId); Optional findByFcmToken(String fcmToken); + // DELETE + void deleteById(Long id); /*@Query(value = "select user " + "from User user " + "where user.parentChild.id = :parentchild_id")*/ - // TODO UserRepository 에서 or ParentchildRepository에서? List findUserByParentChild(Parentchild parentchild);