diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/auth/exception/AuthExceptionHandler.java b/src/main/java/com/modernfarmer/farmusspring/domain/auth/exception/AuthExceptionHandler.java index 26ed5de5..b9287321 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/auth/exception/AuthExceptionHandler.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/auth/exception/AuthExceptionHandler.java @@ -1,7 +1,6 @@ package com.modernfarmer.farmusspring.domain.auth.exception; import com.modernfarmer.farmusspring.domain.test.exception.TestException; -import com.modernfarmer.farmusspring.domain.user.exception.UserNotFoundException; import com.modernfarmer.farmusspring.global.response.BaseResponseDto; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/auth/util/social/SocialLogin.java b/src/main/java/com/modernfarmer/farmusspring/domain/auth/util/social/SocialLogin.java index acebbd18..80c99f49 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/auth/util/social/SocialLogin.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/auth/util/social/SocialLogin.java @@ -4,7 +4,7 @@ import com.modernfarmer.farmusspring.domain.auth.repository.RedisManager; import com.modernfarmer.farmusspring.domain.auth.util.social.dto.SocialUserResponseDto; import com.modernfarmer.farmusspring.domain.user.entity.User; -import com.modernfarmer.farmusspring.domain.user.exception.UserNotFoundException; +import com.modernfarmer.farmusspring.domain.user.exception.custom.UserNotFoundException; import com.modernfarmer.farmusspring.domain.user.repository.UserRepository; import com.modernfarmer.farmusspring.global.common.security.JwtTokenProvider; import com.modernfarmer.farmusspring.global.response.BaseResponseDto; @@ -13,7 +13,6 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -44,7 +43,7 @@ public LoginResponseDto login(SocialUserResponseDto socialUserData){ return null; }); - Optional userLoginData = Optional.ofNullable(userRepository.findByUserNumber(String.valueOf(socialUserData.getId())).orElseThrow(() -> new UserNotFoundException("해당 유저의 정보가 존재하지 않습니다."))); + Optional userLoginData = Optional.ofNullable(userRepository.findByUserNumber(String.valueOf(socialUserData.getId())).orElseThrow(() -> new UserNotFoundException("해당 유저의 정보가 존재하지 않습니다.", UserErrorCode.NOT_FOUND_USER))); String refreshToken = jwtTokenProvider.createRefreshToken(userLoginData.get().getId()); String accessToken = jwtTokenProvider.createAccessToken( diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPost.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPost.java index 07061178..218ad79c 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPost.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPost.java @@ -4,6 +4,8 @@ import jakarta.persistence.*; import lombok.*; import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.util.ArrayList; import java.util.List; @@ -33,10 +35,13 @@ public class MissionPost extends BaseEntity { @Builder.Default private List missionPostLikes = new ArrayList<>(); + @OneToMany(mappedBy = "missionPost", cascade = CascadeType.ALL) @Builder.Default private List missionPostComments = new ArrayList<>(); + + @OnDelete(action = OnDeleteAction.CASCADE) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_farm_club_id") private UserFarmClub userFarmClub; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostComment.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostComment.java index e40fce3c..585cf26e 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostComment.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostComment.java @@ -8,6 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -24,6 +26,7 @@ public class MissionPostComment extends BaseEntity { @Column(nullable = false) private String comment; + @OnDelete(action = OnDeleteAction.CASCADE) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "mission_post_id") private MissionPost missionPost; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostLike.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostLike.java index 1b7eb034..d2f427f7 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostLike.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/MissionPostLike.java @@ -8,6 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -21,10 +23,13 @@ public class MissionPostLike extends BaseEntity { @Column(name = "mission_post_like_id") private Long id; + @OnDelete(action = OnDeleteAction.CASCADE) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "mission_post_id") private MissionPost missionPost; + + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/UserFarmClub.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/UserFarmClub.java index 95fc733f..c365f077 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/UserFarmClub.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/entity/UserFarmClub.java @@ -5,6 +5,8 @@ import jakarta.persistence.*; import lombok.*; import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.util.ArrayList; import java.util.List; @@ -33,6 +35,7 @@ public class UserFarmClub extends BaseEntity { @Column(nullable = false) private boolean isComplete; + @OneToMany(mappedBy = "userFarmClub", cascade = CascadeType.REMOVE) @Builder.Default private List missionPosts = new ArrayList<>(); @@ -41,6 +44,7 @@ public class UserFarmClub extends BaseEntity { @JoinColumn(name = "farm_club_id") private FarmClub farmClub; + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "my_veggie_id") private MyVeggie myVeggie; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/FarmClubHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/FarmClubHelper.java index 89fd9af7..66adb465 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/FarmClubHelper.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/FarmClubHelper.java @@ -10,6 +10,7 @@ import com.modernfarmer.farmusspring.domain.farmclub.repository.FarmClubRepository; import com.modernfarmer.farmusspring.domain.farmclub.repository.UserFarmClubRepository; import com.modernfarmer.farmusspring.domain.history.vo.HistoryDetailVo; +import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.MyVeggie; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -48,4 +49,8 @@ public List getRecommendedFarmClubList(String level) { public List findFarmClubIdsByUserId(Long userId) { return userFarmClubRepository.findFarmClubIdsByUserId(userId); } + + public void deleteFarmClubDomain(List myVeggieList){ + userFarmClubRepository.deleteFarmClubDomain(myVeggieList); + } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/MissionPostHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/MissionPostHelper.java index 3fcef57e..99c82479 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/MissionPostHelper.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/helper/MissionPostHelper.java @@ -40,4 +40,11 @@ public GetMissionPostCommentResponseDto getMissionPostComment(Long missionPostId public void deleteMissionPostLike(Long userId, Long missionPostId) { missionPostRepository.deleteMissionPostLike(userId, missionPostId); } + + public void deleteMissionPostComments(Long userId){ + missionPostRepository.deleteMissionPostComments(userId); + } + public void deleteMissionPostLikes(Long userId){ + missionPostRepository.deleteMissionPostLikes(userId); + } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryCustom.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryCustom.java index 1b1d5c8c..3039964e 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryCustom.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryCustom.java @@ -16,4 +16,7 @@ public interface MissionPostRepositoryCustom { List getMissionPostList(Long userId, Long missionPostId); List getMissionPostHistory(Long missionPostId); void deleteMissionPostLike(Long userId, Long missionPostId); + void deleteMissionPostComments(Long userId); + void deleteMissionPostLikes(Long userId); + } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryImpl.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryImpl.java index 6e10c371..6c8d3c03 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryImpl.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/MissionPostRepositoryImpl.java @@ -112,4 +112,20 @@ public void deleteMissionPostLike(Long userId, Long missionPostId) { .and(missionPostLike.missionPost.id.eq(missionPostId))) .execute(); } + + @Override + public void deleteMissionPostComments(Long userId){ + queryFactory + .delete(missionPostComment) + .where(missionPostComment.user.id.eq(userId)) + .execute(); + } + + @Override + public void deleteMissionPostLikes(Long userId){ + queryFactory + .delete(missionPostLike) + .where(missionPostLike.user.id.eq(userId)) + .execute(); + } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryCustom.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryCustom.java index 3031fa84..b02fa784 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryCustom.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryCustom.java @@ -2,6 +2,7 @@ import com.modernfarmer.farmusspring.domain.farmclub.vo.SuccessFarmClubVo; import com.modernfarmer.farmusspring.domain.farmclub.entity.UserFarmClub; +import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.MyVeggie; import java.util.List; import java.util.Optional; @@ -12,4 +13,6 @@ public interface UserFarmClubRepositoryCustom { List findFarmClubIdsByUserId(Long userId); SuccessFarmClubVo getFarmClubRecord(Long userId, Long farmClubId); + + void deleteFarmClubDomain(List myVeggieList); } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryImpl.java b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryImpl.java index 4e2cf225..0d46b101 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryImpl.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/farmclub/repository/UserFarmClubRepositoryImpl.java @@ -2,6 +2,7 @@ import com.modernfarmer.farmusspring.domain.farmclub.vo.SuccessFarmClubVo; import com.modernfarmer.farmusspring.domain.farmclub.entity.UserFarmClub; +import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.MyVeggie; import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -55,4 +56,13 @@ public SuccessFarmClubVo getFarmClubRecord(Long userId, Long farmClubId) { .where(userFarmClub.farmClub.id.eq(farmClubId).and(userFarmClub.userId.eq(userId))) .fetchOne(); } + + + @Override + public void deleteFarmClubDomain(List myVeggieList){ + queryFactory + .delete(userFarmClub) + .where(userFarmClub.myVeggie.id.in(myVeggieList.stream().map(MyVeggie::getId).toList())) + .execute(); + } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/history/helper/HistoryHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/history/helper/HistoryHelper.java index b9f30f66..8550cfc6 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/history/helper/HistoryHelper.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/history/helper/HistoryHelper.java @@ -27,6 +27,7 @@ import java.time.LocalDate; import java.util.List; +import java.util.Optional; import static com.modernfarmer.farmusspring.domain.history.utils.StringUtil.getHistoryPeriod; import static com.modernfarmer.farmusspring.domain.history.utils.StringUtil.getPostFormattedDate; @@ -50,6 +51,11 @@ public void createUserHistory(Long userId) { historyRepository.save(history); } + public void deleteHistory(Long userId) { + Optional historyOptional = historyRepository.findByUserId(userId); + historyOptional.ifPresent(historyRepository::delete); + } + public String createFarmClubHistoryDetail(Long userId, Long userFarmClubId, String veggieInfoId) { List missionPostHistoryList = missionPostHelper.getMissionPostHistory(userFarmClubId); List stepList = veggieInfoHelper.getStepList(veggieInfoId); diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Diary.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Diary.java index d0b87381..1bb35a42 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Diary.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Diary.java @@ -6,7 +6,8 @@ import jakarta.persistence.*; import lombok.*; import lombok.experimental.SuperBuilder; - +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.util.ArrayList; @@ -37,14 +38,18 @@ public class Diary extends BaseEntity { @Column(name = "state") private String state; + @OnDelete(action = OnDeleteAction.CASCADE) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "my_veggie_id") private MyVeggie myVeggie; + @OneToMany(mappedBy = "diary", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Builder.Default private List diaryComments = new ArrayList<>(); + + @OneToMany(mappedBy = "diary", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Builder.Default private List diaryLikes = new ArrayList<>(); diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/DiaryLike.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/DiaryLike.java index 029a988f..24f7856b 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/DiaryLike.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/DiaryLike.java @@ -26,7 +26,6 @@ public class DiaryLike extends BaseEntity { @JoinColumn(name = "diary_id") private Diary diary; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/MyVeggie.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/MyVeggie.java index d37ed14b..8a46b45a 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/MyVeggie.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/MyVeggie.java @@ -6,7 +6,8 @@ import jakarta.persistence.*; import lombok.*; import lombok.experimental.SuperBuilder; - +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.util.ArrayList; @@ -41,19 +42,21 @@ public class MyVeggie extends BaseEntity { @Column(name = "veggie_image") private String veggieImage; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; + @OneToMany(mappedBy = "myVeggie", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Builder.Default private List routines = new ArrayList<>(); + @OneToMany(mappedBy = "myVeggie", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Builder.Default private List diaries = new ArrayList<>(); + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "user_farm_club_id") private UserFarmClub userFarmClub; diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Routine.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Routine.java index 9dc03173..e656ad3f 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Routine.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/entity/Routine.java @@ -8,7 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; - +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.util.Date; @@ -39,7 +40,7 @@ public class Routine extends BaseEntity { @Column(name = "complete") private boolean complete; - + @OnDelete(action = OnDeleteAction.CASCADE) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "my_veggie_id") private MyVeggie myVeggie; @@ -56,6 +57,5 @@ public static Routine createRoutine(Date date, String content, int period, MyVeg myVeggie.addRoutine(newRoutine); return newRoutine; - } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/DiaryCommentHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/DiaryCommentHelper.java new file mode 100644 index 00000000..a51f2b3f --- /dev/null +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/DiaryCommentHelper.java @@ -0,0 +1,19 @@ +package com.modernfarmer.farmusspring.domain.myveggiegarden.helper; + + +import com.modernfarmer.farmusspring.domain.myveggiegarden.repository.DiaryCommentRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class DiaryCommentHelper { + + private final DiaryCommentRepository diaryCommentRepository; + + public void deleteComments(Long userId){ + diaryCommentRepository.deleteDiaryCommentsByUserId(userId); + } +} diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/DiaryLikeHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/DiaryLikeHelper.java new file mode 100644 index 00000000..aa70bd88 --- /dev/null +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/DiaryLikeHelper.java @@ -0,0 +1,19 @@ +package com.modernfarmer.farmusspring.domain.myveggiegarden.helper; + + +import com.modernfarmer.farmusspring.domain.myveggiegarden.repository.DiaryLikeRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class DiaryLikeHelper { + + private final DiaryLikeRepository diaryLikeRepository; + + public void deleteLikes(Long userId){ + diaryLikeRepository.deleteDiaryLikesByUserId(userId); + } +} diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/MyVeggieHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/MyVeggieHelper.java index f2f51e65..603d3adc 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/MyVeggieHelper.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/helper/MyVeggieHelper.java @@ -8,6 +8,7 @@ import com.modernfarmer.farmusspring.domain.myveggiegarden.vo.MyVeggieVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Component; import java.util.List; @@ -24,6 +25,10 @@ public MyVeggie getMyVeggieEntity(Long id) { new MyVeggieGardenBaseException("존재하지 않는 나의 채소입니다.", MyVeggieGardenErrorCode.NOT_FOUND_VEGGIE)); } + public List getMyVeggieUserId(Long userId){ + return myVeggieRepository.findMyVeggieUserId(userId); + } + public MyVeggieVo getMyVeggieInfo(Long userId, String veggieInfoId) { return myVeggieRepository.findMyVeggieInfo(userId, veggieInfoId).orElse(MyVeggieVo.of(0L, "", "")); } @@ -40,6 +45,11 @@ public void deleteMyVeggie(Long id) { myVeggieRepository.deleteById(id); } + public void deleteMyVeggiesByUserId(Long userId){ + myVeggieRepository.deleteMyVeggiesByUserId(userId); + } + + public List getDiariesByMyVeggie(MyVeggie myVeggie) { return myVeggieRepository.findDiariesByMyVeggie(myVeggie); } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryCommentRepository.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryCommentRepository.java index 54ee0947..ff59c36c 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryCommentRepository.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryCommentRepository.java @@ -3,6 +3,7 @@ import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.Diary; import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.DiaryComment; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -13,4 +14,9 @@ public interface DiaryCommentRepository extends JpaRepository { @Query("SELECT count(dc) FROM diary_comment AS dc WHERE dc.diary.id = :diaryId ") int findDiaryCommentCountById(@Param("diaryId") Long diaryId); + + + @Modifying + @Query("delete from diary_comment as dc where dc.user.id = :userId") + void deleteDiaryCommentsByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryLikeRepository.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryLikeRepository.java index 92211860..3f1bc681 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryLikeRepository.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/DiaryLikeRepository.java @@ -4,6 +4,7 @@ import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.DiaryComment; import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.DiaryLike; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -20,4 +21,8 @@ public interface DiaryLikeRepository extends JpaRepository { Optional findDiaryLikeByDiaryIdAndUserId(@Param("diaryId") Long diaryId, @Param("userId") Long userId); + @Modifying + @Query("delete from diary_like as dl where dl.user.id = :userId") + void deleteDiaryLikesByUserId(@Param("userId") Long userId); + } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/MyVeggieRepository.java b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/MyVeggieRepository.java index dd1d6725..8d77a837 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/MyVeggieRepository.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/myveggiegarden/repository/MyVeggieRepository.java @@ -74,6 +74,10 @@ void updateMyVeggie(@Param("myVeggieId") Long myVeggieId, @Query("UPDATE routine AS r SET r.date = :date WHERE r.id = :routineId") void updateRoutinePeriod(@Param("routineId") Long routineId, @Param("date") Date date); + @Modifying + @Query("delete from my_veggie as mv where mv.user.id = :userId") + void deleteMyVeggiesByUserId(@Param("userId") Long userId); + @Query("SELECT mv FROM my_veggie AS mv " + "LEFT JOIN mv.routines AS r " + "WHERE mv.user= :user " diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/controller/UserController.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/controller/UserController.java index f48910a5..fb83b071 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/controller/UserController.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/controller/UserController.java @@ -32,6 +32,12 @@ public BaseResponseDto selectUserProfile(@AuthenticationPri return userService.selectUserProfile(user.getUserId()); } + @DeleteMapping() + public BaseResponseDto deleteUser(@AuthenticationPrincipal CustomUser user) { + userService.deleteUser(user.getUserId()); + return BaseResponseDto.of(SuccessCode.SUCCESS, null); + } + @PatchMapping(value = "/profile-image") public BaseResponseDto deleteProfleImage(@AuthenticationPrincipal CustomUser user) { diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/entity/User.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/entity/User.java index 702978d5..8d791cc1 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/entity/User.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/entity/User.java @@ -9,6 +9,8 @@ import jakarta.persistence.*; import lombok.*; import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.time.LocalDateTime; @@ -49,23 +51,26 @@ public class User extends BaseEntity { @Column(nullable = false) private Boolean notificationStatus; - @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Builder.Default private List userFirebaseTokens = new ArrayList<>(); + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Builder.Default private List userMotivations = new ArrayList<>(); + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) @Builder.Default private List myVeggies = new ArrayList<>(); + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) @Builder.Default private List diaryComments = new ArrayList<>(); + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) @Builder.Default private List diaryLikes = new ArrayList<>(); diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserExceptionHandler.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserExceptionHandler.java index abfbf0b3..77018ed6 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserExceptionHandler.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserExceptionHandler.java @@ -11,12 +11,12 @@ @RestControllerAdvice(basePackages = "com.modernfarmer.farmusspring.domain.test") public class UserExceptionHandler { - @ExceptionHandler(UserNotFoundException.class) - public BaseResponseDto handleUserNotFoundException(TestException e, HttpServletRequest request) { - log.error("UserException : {} {} errMessage={}\n", - request.getMethod(), - request.getRequestURI(), - e.getMessage()); - return BaseResponseDto.of(UserErrorCode.NOT_FOUND_USER, e); - } +// @ExceptionHandler(UserNotFoundException.class) +// public BaseResponseDto handleUserNotFoundException(TestException e, HttpServletRequest request) { +// log.error("UserException : {} {} errMessage={}\n", +// request.getMethod(), +// request.getRequestURI(), +// e.getMessage()); +// return BaseResponseDto.of(UserErrorCode.NOT_FOUND_USER, e); +// } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserNotFoundException.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserNotFoundException.java deleted file mode 100644 index 7065c5eb..00000000 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/UserNotFoundException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.modernfarmer.farmusspring.domain.user.exception; - -public class UserNotFoundException extends RuntimeException { - - public UserNotFoundException(String message) { - super(message); - } -} \ No newline at end of file diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/custom/UserBaseException.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/custom/UserBaseException.java new file mode 100644 index 00000000..2f3d0de7 --- /dev/null +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/custom/UserBaseException.java @@ -0,0 +1,15 @@ +package com.modernfarmer.farmusspring.domain.user.exception.custom; + +import com.modernfarmer.farmusspring.domain.user.exception.UserErrorCode; +import lombok.Getter; + +@Getter +public class UserBaseException extends RuntimeException{ + + private final UserErrorCode errorCode; + public UserBaseException(String message, UserErrorCode errorCode) { + super(message); + this.errorCode = errorCode; + } + +} diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/custom/UserNotFoundException.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/custom/UserNotFoundException.java new file mode 100644 index 00000000..c8f78d6d --- /dev/null +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/exception/custom/UserNotFoundException.java @@ -0,0 +1,13 @@ +package com.modernfarmer.farmusspring.domain.user.exception.custom; + +import com.modernfarmer.farmusspring.domain.myveggiegarden.exception.MyVeggieGardenErrorCode; +import com.modernfarmer.farmusspring.domain.myveggiegarden.exception.custom.MyVeggieGardenBaseException; +import com.modernfarmer.farmusspring.domain.user.exception.UserErrorCode; + +public class UserNotFoundException extends UserBaseException { + + public UserNotFoundException(String message, UserErrorCode errorCode) { + super(message, errorCode); + } + +} diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/helper/UserHelper.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/helper/UserHelper.java index 9529e5f2..41c4bcad 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/helper/UserHelper.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/helper/UserHelper.java @@ -1,7 +1,8 @@ package com.modernfarmer.farmusspring.domain.user.helper; import com.modernfarmer.farmusspring.domain.user.entity.User; -import com.modernfarmer.farmusspring.domain.user.exception.UserNotFoundException; +import com.modernfarmer.farmusspring.domain.user.exception.UserErrorCode; +import com.modernfarmer.farmusspring.domain.user.exception.custom.UserNotFoundException; import com.modernfarmer.farmusspring.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,9 +15,13 @@ public class UserHelper { private final UserRepository userRepository; + public void deleteUser(Long userId){ + userRepository.deleteUser(userId); + } + public User getUserEntity(Long userId) { return userRepository.findById(userId) - .orElseThrow(() -> new UserNotFoundException("해당 유저가 존재하지 않습니다.")); + .orElseThrow(() -> new UserNotFoundException("해당 유저가 존재하지 않습니다.", UserErrorCode.NOT_FOUND_USER)); } public String getUserLevel(Long userId) { diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/repository/UserRepository.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/repository/UserRepository.java index 259eb563..84372020 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/repository/UserRepository.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/repository/UserRepository.java @@ -15,6 +15,9 @@ public interface UserRepository extends JpaRepository { Optional findByUserNumber(String usernumber); + + @Query("SELECT a FROM user AS a WHERE a.id = :userId") + Optional findUser(@Param("userId") Long userId); @Query("SELECT a FROM user AS a WHERE a.id = :userId") User findUserData(@Param("userId") Long userId); User findUserById(Long userId); @@ -37,5 +40,9 @@ public interface UserRepository extends JpaRepository { @Query("update user as u set u.nickname = :nickName where u.id = :userId") void updateNickname(@Param("userId") Long userId, @Param("nickName") String nickName); + @Modifying + @Query("delete from user as u where u.id = :userId") + void deleteUser(@Param("userId") Long userId); + } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/service/FirebaseTokenService.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/service/FirebaseTokenService.java index 30bf4c48..3228f592 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/service/FirebaseTokenService.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/service/FirebaseTokenService.java @@ -1,11 +1,10 @@ package com.modernfarmer.farmusspring.domain.user.service; -import com.modernfarmer.farmusspring.domain.user.dto.request.SetLevelRequest; -import com.modernfarmer.farmusspring.domain.user.dto.request.SetMotivationRequest; import com.modernfarmer.farmusspring.domain.user.entity.User; import com.modernfarmer.farmusspring.domain.user.entity.UserFirebaseToken; -import com.modernfarmer.farmusspring.domain.user.exception.UserNotFoundException; +import com.modernfarmer.farmusspring.domain.user.exception.UserErrorCode; +import com.modernfarmer.farmusspring.domain.user.exception.custom.UserNotFoundException; import com.modernfarmer.farmusspring.domain.user.repository.FirebaseTokenRepository; import com.modernfarmer.farmusspring.domain.user.repository.UserRepository; import lombok.AllArgsConstructor; @@ -13,8 +12,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; - @Slf4j @AllArgsConstructor @@ -40,7 +37,7 @@ public void addFirebaseToken(Long userId, String firebaseToken){ public void validateUser(User user){ if(user == null) - throw new UserNotFoundException("해당 유저는 존재하지 않습니다."); + throw new UserNotFoundException("해당 유저는 존재하지 않습니다.", UserErrorCode.NOT_FOUND_USER); } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/service/OnBoardingService.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/service/OnBoardingService.java index 4547839c..7fa74570 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/service/OnBoardingService.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/service/OnBoardingService.java @@ -7,7 +7,8 @@ import com.modernfarmer.farmusspring.domain.user.dto.response.SetLevelResponse; import com.modernfarmer.farmusspring.domain.user.entity.User; import com.modernfarmer.farmusspring.domain.user.entity.UserMotivation; -import com.modernfarmer.farmusspring.domain.user.exception.UserNotFoundException; +import com.modernfarmer.farmusspring.domain.user.exception.UserErrorCode; +import com.modernfarmer.farmusspring.domain.user.exception.custom.UserNotFoundException; import com.modernfarmer.farmusspring.domain.user.repository.UserMotivationRepository; import com.modernfarmer.farmusspring.domain.user.repository.UserRepository; import com.modernfarmer.farmusspring.domain.user.util.EncouragementMessages; @@ -17,11 +18,9 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Optional; @Slf4j @AllArgsConstructor @@ -107,7 +106,7 @@ private String measureLevel(int time,String skill) { return "알 수 없음"; } public User findUser(Long userId) { - return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException("해당 유저가 없습니다.")); + return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException("해당 유저가 없습니다.", UserErrorCode.NOT_FOUND_USER)); } } diff --git a/src/main/java/com/modernfarmer/farmusspring/domain/user/service/UserService.java b/src/main/java/com/modernfarmer/farmusspring/domain/user/service/UserService.java index 389b7ffb..bd5753bb 100644 --- a/src/main/java/com/modernfarmer/farmusspring/domain/user/service/UserService.java +++ b/src/main/java/com/modernfarmer/farmusspring/domain/user/service/UserService.java @@ -1,20 +1,24 @@ package com.modernfarmer.farmusspring.domain.user.service; -import com.modernfarmer.farmusspring.domain.auth.entity.CustomUser; -import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.Diary; -import com.modernfarmer.farmusspring.domain.myveggiegarden.exception.DiaryNotFoundException; +import com.modernfarmer.farmusspring.domain.farmclub.helper.FarmClubHelper; +import com.modernfarmer.farmusspring.domain.farmclub.helper.MissionPostHelper; +import com.modernfarmer.farmusspring.domain.history.helper.HistoryHelper; +import com.modernfarmer.farmusspring.domain.myveggiegarden.entity.MyVeggie; +import com.modernfarmer.farmusspring.domain.myveggiegarden.helper.DiaryCommentHelper; +import com.modernfarmer.farmusspring.domain.myveggiegarden.helper.DiaryLikeHelper; +import com.modernfarmer.farmusspring.domain.myveggiegarden.helper.MyVeggieHelper; import com.modernfarmer.farmusspring.domain.user.dto.response.AlarmStatus; import com.modernfarmer.farmusspring.domain.user.dto.response.UserProfileResponse; import com.modernfarmer.farmusspring.domain.user.entity.User; -import com.modernfarmer.farmusspring.domain.user.exception.UserNotFoundException; +import com.modernfarmer.farmusspring.domain.user.exception.UserErrorCode; +import com.modernfarmer.farmusspring.domain.user.exception.custom.UserNotFoundException; +import com.modernfarmer.farmusspring.domain.user.helper.UserHelper; import com.modernfarmer.farmusspring.domain.user.repository.UserRepository; import com.modernfarmer.farmusspring.global.response.BaseResponseDto; import com.modernfarmer.farmusspring.global.response.SuccessCode; -import com.modernfarmer.farmusspring.infra.s3.S3Config; import com.modernfarmer.farmusspring.infra.s3.S3Service; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -22,8 +26,8 @@ import java.io.IOException; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; +import java.util.List; import java.util.Optional; -import java.util.Random; @Slf4j @AllArgsConstructor @@ -32,14 +36,18 @@ public class UserService { private final UserRepository userRepository; private final S3Service s3Service; + private final UserHelper userHelper; + private final DiaryCommentHelper diaryCommentHelper; + private final DiaryLikeHelper diaryLikeHelper; + private final MyVeggieHelper myVeggieHelper; + private final FarmClubHelper farmClubHelper; + private final MissionPostHelper missionPostHelper; + private final HistoryHelper historyHelper; @Transactional public BaseResponseDto selectUserProfile(Long userId) { - Optional userData = selectUser(userId); - long dDay = calFromToday(userData.get().getCreatedDate()); - return BaseResponseDto.of(SuccessCode.SUCCESS, UserProfileResponse.of( userData.get().getNickname(), @@ -48,6 +56,23 @@ public BaseResponseDto selectUserProfile(Long userId) { )); } + @Transactional + public void deleteUser(Long userId) { + Optional user = userRepository.findUser(userId); + verifyUser(user); + List myVeggieList = myVeggieHelper.getMyVeggieUserId(userId); + farmClubHelper.deleteFarmClubDomain(myVeggieList); + myVeggieHelper.deleteMyVeggiesByUserId(userId); + diaryLikeHelper.deleteLikes(userId); + diaryCommentHelper.deleteComments(userId); + missionPostHelper.deleteMissionPostLikes(userId); + missionPostHelper.deleteMissionPostComments(userId); + historyHelper.deleteHistory(userId); + userHelper.deleteUser(userId); + } + + + @Transactional public BaseResponseDto deleteProfleImage(Long userId) { updateProfileImage(userId); @@ -72,10 +97,12 @@ public User selectUserById(Long userId){ public void checkUserData(User user){ if(user == null) { - throw new UserNotFoundException("유저를 찾을 수 없습니다."); + throw new UserNotFoundException("해당 유저가 존재하지 않습니다.",UserErrorCode.NOT_FOUND_USER); } } + + @Transactional public void initUser(Long userId) { User user = userRepository.findUserById(userId); @@ -125,11 +152,16 @@ private void updateProfileAndNickname(Long userId, String imageUrl, String nickn } public Optional selectUser(Long userId){ - Optional user = Optional.ofNullable(userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException("해당 유저가 존재하지 않습니다."))); + Optional user = Optional.ofNullable(userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException("해당 유저가 존재하지 않습니다.",UserErrorCode.NOT_FOUND_USER))); return user; } - private long calFromToday(LocalDateTime date){ + public void verifyUser(Optional user){ + if(user.isEmpty()) + throw new UserNotFoundException("유저가 존재하지 않습니다.", UserErrorCode.NOT_FOUND_USER); + + } + private long calFromToday(LocalDateTime date){ LocalDateTime currentDateTime = LocalDateTime.now(); long daysDifference = ChronoUnit.DAYS.between(date.toLocalDate(), currentDateTime.toLocalDate()); return daysDifference; @@ -140,4 +172,7 @@ private void updateProfileImage(Long userId){ } + + + }