diff --git a/src/main/java/com/onebyone/kindergarten/domain/communityComments/entity/CommunityComment.java b/src/main/java/com/onebyone/kindergarten/domain/communityComments/entity/CommunityComment.java index 165e7e4..914d7a3 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/communityComments/entity/CommunityComment.java +++ b/src/main/java/com/onebyone/kindergarten/domain/communityComments/entity/CommunityComment.java @@ -9,6 +9,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity(name = "community_comment") @Getter @NoArgsConstructor @@ -47,6 +49,7 @@ public CommunityComment(CommunityPost post, User user, String content, Community /// 댓글 신고 상태 변경 public void updateStatus(ReportStatus status) { this.status = status; + this.updatedAt = LocalDateTime.now(); } /// 대댓글 여부 확인 @@ -56,6 +59,7 @@ public boolean isReply() { /// 댓글 소프트 삭제 public void markAsDeleted() { - this.deletedAt = java.time.LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + this.deletedAt = LocalDateTime.now(); } } \ No newline at end of file diff --git a/src/main/java/com/onebyone/kindergarten/domain/communityComments/repository/CommunityCommentRepository.java b/src/main/java/com/onebyone/kindergarten/domain/communityComments/repository/CommunityCommentRepository.java index 5cfb9f4..b3a92c6 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/communityComments/repository/CommunityCommentRepository.java +++ b/src/main/java/com/onebyone/kindergarten/domain/communityComments/repository/CommunityCommentRepository.java @@ -11,6 +11,7 @@ import com.onebyone.kindergarten.domain.communityComments.entity.CommunityComment; import com.onebyone.kindergarten.domain.communityComments.dto.response.CommentResponseDTO; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -64,6 +65,6 @@ Page findAllCommentsWithRepliesByPostId( Optional findByIdWithUser(@Param("id") Long id); @Modifying - @Query("UPDATE community_comment c SET c.deletedAt = CURRENT_TIMESTAMP WHERE c.parent.id = :parentId") - void updateRepliesDeletedAt(@Param("parentId") Long parentId); + @Query("UPDATE community_comment c SET c.updatedAt = :now, c.deletedAt = :now WHERE c.parent.id = :parentId") + void updateRepliesDeletedAt(@Param("parentId") Long parentId, @Param("now") LocalDateTime now); } diff --git a/src/main/java/com/onebyone/kindergarten/domain/communityComments/service/CommunityCommentService.java b/src/main/java/com/onebyone/kindergarten/domain/communityComments/service/CommunityCommentService.java index 7182d15..0c852ed 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/communityComments/service/CommunityCommentService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/communityComments/service/CommunityCommentService.java @@ -22,6 +22,7 @@ import com.onebyone.kindergarten.domain.user.entity.User; import com.onebyone.kindergarten.domain.user.service.UserService; +import java.time.LocalDateTime; import java.util.List; import java.util.Collections; @@ -164,7 +165,7 @@ public void deleteComment(Long commentId, String email) { // 대댓글이 있는 원댓글인 경우 대댓글들도 함께 삭제 if (isOriginalComment) { - commentRepository.updateRepliesDeletedAt(commentId); + commentRepository.updateRepliesDeletedAt(commentId, LocalDateTime.now()); } // 원댓글이었다면 게시글의 댓글 수 감소 diff --git a/src/main/java/com/onebyone/kindergarten/domain/communityPosts/entity/CommunityPost.java b/src/main/java/com/onebyone/kindergarten/domain/communityPosts/entity/CommunityPost.java index 3dcdc5b..dfa7c22 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/communityPosts/entity/CommunityPost.java +++ b/src/main/java/com/onebyone/kindergarten/domain/communityPosts/entity/CommunityPost.java @@ -9,6 +9,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity @Getter @NoArgsConstructor @@ -73,10 +75,12 @@ public void decreaseLikeCount() { /// 게시물 신고 상태 변경 public void updateStatus(ReportStatus status) { this.status = status; + this.updatedAt = LocalDateTime.now(); } /// 게시물 소프트 삭제 public void markAsDeleted() { - this.deletedAt = java.time.LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + this.deletedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/inquires/entity/Inquiry.java b/src/main/java/com/onebyone/kindergarten/domain/inquires/entity/Inquiry.java index 207af08..bf34165 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/inquires/entity/Inquiry.java +++ b/src/main/java/com/onebyone/kindergarten/domain/inquires/entity/Inquiry.java @@ -8,6 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity @Getter @NoArgsConstructor @@ -43,10 +45,12 @@ public Inquiry(User user, String title, String content) { public void answerInquiry(String answer) { this.answer = answer; this.status = InquiryStatus.ANSWERED; + this.updatedAt = LocalDateTime.now(); } // 문의 마감 public void closeInquiry() { this.status = InquiryStatus.CLOSED; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/entity/KindergartenInternshipReview.java b/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/entity/KindergartenInternshipReview.java index e6795ca..4bf7adf 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/entity/KindergartenInternshipReview.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/entity/KindergartenInternshipReview.java @@ -11,6 +11,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity(name = "kindergarten_internship_review") @Getter @Builder @@ -70,6 +72,7 @@ public void updateReview(ModifyInternshipReviewRequestDTO request) { this.learningSupportScore = request.getLearningSupportScore(); this.instructionTeacherComment = request.getInstructionTeacherComment(); this.instructionTeacherScore = request.getInstructionTeacherScore(); + this.updatedAt = LocalDateTime.now(); } public void minusLikeCount() { @@ -82,6 +85,7 @@ public void plusLikeCount() { /// 리뷰 소프트 삭제 public void markAsDeleted() { - this.deletedAt = java.time.LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + this.deletedAt = LocalDateTime.now(); } } \ No newline at end of file diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/service/KindergartenInternshipReviewService.java b/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/service/KindergartenInternshipReviewService.java index dc10619..2b41eff 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/service/KindergartenInternshipReviewService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergartenInternshipReview/service/KindergartenInternshipReviewService.java @@ -68,19 +68,23 @@ public Kindergarten createInternshipReview(CreateInternshipReviewRequestDTO requ public Kindergarten modifyInternshipReview(ModifyInternshipReviewRequestDTO request, String email) { User user = userService.getUserByEmail(email); - Kindergarten kindergarten = kindergartenService.getKindergartenById(request.getKindergartenId()); KindergartenInternshipReview review = kindergartenInternshipReviewRepository .findById(request.getInternshipReviewId()) .orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_INTERNSHIP_REVIEW)); - if (!review.getUser().equals(user)) { - throw new BusinessException(ErrorCodes.INCORRECT_USER_EXCEPTION); + // 리뷰와 유치원이 다를 때 + if (!review.getKindergarten().getId().equals(kindergarten.getId())) { + throw new BusinessException(ErrorCodes.INCORRECT_KINDERGARTEN_EXCEPTION); } - review.updateReview(request); + // 리뷰 작성자가 다를 때 + if (!review.getUser().getId().equals(user.getId())) { + throw new BusinessException(ErrorCodes.REVIEW_EDIT_NOT_OWNER); + } + review.updateReview(request); return kindergarten; } diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/controller/KindergartenWorkHistoryController.java b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/controller/KindergartenWorkHistoryController.java index b3834af..c732e02 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/controller/KindergartenWorkHistoryController.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/controller/KindergartenWorkHistoryController.java @@ -4,6 +4,7 @@ import com.onebyone.kindergarten.domain.kindergartenWorkHistories.dto.KindergartenWorkHistoryResponse; import com.onebyone.kindergarten.domain.kindergartenWorkHistories.service.KindergartenWorkHistoryService; import com.onebyone.kindergarten.global.common.ResponseDto; +import com.onebyone.kindergarten.global.facade.KindergartenWorkHistoryFacade; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -18,6 +19,7 @@ @RequiredArgsConstructor @RequestMapping("/certification") public class KindergartenWorkHistoryController { + private final KindergartenWorkHistoryFacade kindergartenWorkHistoryFacade; private final KindergartenWorkHistoryService workHistoryService; @PostMapping @@ -25,7 +27,7 @@ public class KindergartenWorkHistoryController { public ResponseDto addCertification( @AuthenticationPrincipal UserDetails userDetails, @RequestBody KindergartenWorkHistoryRequest request) { - return ResponseDto.success(workHistoryService.addCertification(userDetails.getUsername(), request)); + return ResponseDto.success(kindergartenWorkHistoryFacade.addCertification(userDetails.getUsername(), request)); } @GetMapping @@ -39,7 +41,7 @@ public ResponseDto> getCertification(@Auth public ResponseDto deleteCertification( @AuthenticationPrincipal UserDetails userDetails, @PathVariable Long certificationId) { - workHistoryService.deleteCertification(userDetails.getUsername(), certificationId); + kindergartenWorkHistoryFacade.deleteCertification(userDetails.getUsername(), certificationId); return ResponseDto.success(null); } } \ No newline at end of file diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/service/KindergartenWorkHistoryService.java b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/service/KindergartenWorkHistoryService.java index 388c4bb..0b508ae 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/service/KindergartenWorkHistoryService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkHistories/service/KindergartenWorkHistoryService.java @@ -27,35 +27,8 @@ public class KindergartenWorkHistoryService { private final KindergartenWorkHistoryRepository workHistoryRepository; private final KindergartenRepository kindergartenRepository; - /// 경력 개월 수 계산 - private int calculateCareerMonths(User user, LocalDate startDate, LocalDate endDate, boolean isAdding) { - int currentCareerMonths = user.getCareer() == null ? 0 : Integer.parseInt(user.getCareer()); - long monthsBetween = ChronoUnit.MONTHS.between(startDate, endDate); - return isAdding ? - currentCareerMonths + (int)monthsBetween : - currentCareerMonths - (int)monthsBetween; - } - /// 유치원 근무 이력 추가 - @Transactional - public KindergartenWorkHistoryResponse addCertification(String email, KindergartenWorkHistoryRequest request) { - - // 유치원 이름으로 유치원 조회 - Kindergarten kindergarten = kindergartenRepository.findByName(request.getKindergartenName()) - .orElseThrow(() -> new BusinessException(ErrorCodes.KINDERGARTEN_NOT_FOUND)); - - // 사용자 조회 - User user = userService.getUserByEmail(email); - - // 유치원 경력 개월 수 업데이트 - int newCareerMonths = calculateCareerMonths( - user, - request.getStartDate(), - request.getEndDate(), - true - ); - userService.updateCareer(user, String.valueOf(newCareerMonths)); - + public KindergartenWorkHistoryResponse addCertification(User user, Kindergarten kindergarten, KindergartenWorkHistoryRequest request) { // 유치원 근무 이력 저장 KindergartenWorkHistory workHistory = request.toEntity(user, kindergarten); workHistoryRepository.save(workHistory); @@ -73,32 +46,12 @@ public List getCertification(String email) { return workHistoryRepository.findDtosByUser(user); } - /// 유치원 근무 이력 삭제 - @Transactional - public void deleteCertification(String email, Long historyId) { - - // 유치원 근무 이력 조회 - KindergartenWorkHistory workHistory = workHistoryRepository.findByIdWithKindergarten(historyId) - .orElseThrow(() -> new BusinessException(ErrorCodes.WORK_HISTORY_NOT_FOUND)); - - // 사용자 조회 - User user = userService.getUserByEmail(email); - - // 유치원 근무 이력 소유자 확인 - if (!workHistory.getUser().equals(user)) { - throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE); - } - - // 유치원 경력 개월 수 업데이트 - int newCareerMonths = calculateCareerMonths( - user, - workHistory.getStartDate(), - workHistory.getEndDate(), - false - ); - userService.updateCareer(user, String.valueOf(newCareerMonths)); + public KindergartenWorkHistory getKindergartenWorkHistory(Long certificationId) { + return workHistoryRepository.findById(certificationId).orElseThrow(() -> new BusinessException(ErrorCodes.WORK_HISTORY_NOT_FOUND)); + } - // 유치원 근무 이력 삭제 + /// 유치원 근무 이력 삭제 + public void deleteCertification(KindergartenWorkHistory workHistory) { workHistoryRepository.delete(workHistory); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/entity/KindergartenWorkReview.java b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/entity/KindergartenWorkReview.java index fa25da2..14db83e 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/entity/KindergartenWorkReview.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/entity/KindergartenWorkReview.java @@ -11,6 +11,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity(name = "kindergarten_work_review") @Builder @NoArgsConstructor @@ -90,6 +92,7 @@ public void updateReview(ModifyWorkReviewRequestDTO request) { this.managerScore = request.getManagerScore(); this.customerComment = request.getCustomerComment(); this.customerScore = request.getCustomerScore(); + this.updatedAt = LocalDateTime.now(); } public void minusLikeCount() { @@ -102,6 +105,7 @@ public void plusLikeCount() { /// 리뷰 소프트 삭제 public void markAsDeleted() { - this.deletedAt = java.time.LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + this.deletedAt = LocalDateTime.now(); } } \ No newline at end of file diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/service/KindergartenWorkReviewService.java b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/service/KindergartenWorkReviewService.java index aacb7f9..52b44e5 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/service/KindergartenWorkReviewService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergartenWorkReview/service/KindergartenWorkReviewService.java @@ -81,7 +81,11 @@ public Kindergarten modifyWorkReview(ModifyWorkReviewRequestDTO request, String KindergartenWorkReview review = workReviewRepository.findById(request.getWorkReviewId()) .orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_WORK_REVIEW)); - if (!review.getUser().equals(user)) { + if (!review.getKindergarten().getId().equals(kindergarten.getId())) { + throw new BusinessException(ErrorCodes.INCORRECT_KINDERGARTEN_EXCEPTION); + } + + if (!review.getUser().getId().equals(user.getId())) { throw new BusinessException(ErrorCodes.REVIEW_EDIT_NOT_OWNER); } diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/Kindergarten.java b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/Kindergarten.java index 3f6345a..96a4d26 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/Kindergarten.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/Kindergarten.java @@ -12,6 +12,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; @Entity @@ -113,14 +114,17 @@ public void update(KindergartenDTO kindergartenDTO) { this.specialPupilCount = kindergartenDTO.getSpecialPupilCount(); this.latitude = kindergartenDTO.getLatitude(); this.longitude = kindergartenDTO.getLongitude(); + this.updatedAt = LocalDateTime.now(); } public void updateInternshipReviewAggregate(KindergartenInternshipReviewAggregate kindergartenInternshipReviewAggregate ) { this.kindergartenInternshipReviewAggregate = kindergartenInternshipReviewAggregate; + this.updatedAt = LocalDateTime.now(); } public void updateWorkReviewAggregate(KindergartenWorkReviewAggregate kindergartenWorkReviewAggregate) { this.kindergartenWorkReviewAggregate = kindergartenWorkReviewAggregate; + this.updatedAt = LocalDateTime.now(); } public KindergartenSimpleDTO toSimpleDTO() { diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenInternshipReviewAggregate.java b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenInternshipReviewAggregate.java index 686f01c..9e37ee5 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenInternshipReviewAggregate.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenInternshipReviewAggregate.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.time.LocalDateTime; @Entity(name = "kindergarten_internship_review_aggregate") @Getter @@ -31,15 +32,10 @@ public class KindergartenInternshipReviewAggregate extends BaseEntity { @Column(name = "instruction_teacher_score_aggregate", precision = 10, scale = 2) private BigDecimal instructionTeacherScoreAggregate; // 지도교사 총합 - public void updateWorkEnvironmentScoreAggregate(BigDecimal avgWorkEnvironmentScore) { + public void updateScoreAggregates(BigDecimal avgWorkEnvironmentScore, BigDecimal avgLearningSupportScore, BigDecimal avgInstructionTeacherScore) { this.workEnvironmentScoreAggregate = avgWorkEnvironmentScore; - } - - public void updateLearningSupportScoreAggregate(BigDecimal avgLearningSupportScore) { this.learningSupportScoreAggregate = avgLearningSupportScore; - } - - public void updateInstructionTeacherScoreAggregate(BigDecimal avgInstructionTeacherScore) { this.instructionTeacherScoreAggregate = avgInstructionTeacherScore; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenWorkReviewAggregate.java b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenWorkReviewAggregate.java index 1371583..b5f0a3a 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenWorkReviewAggregate.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/entity/KindergartenWorkReviewAggregate.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.time.LocalDateTime; @Entity(name = "kindergarten_work_review_aggregate") @Getter @@ -37,23 +38,12 @@ public class KindergartenWorkReviewAggregate extends BaseEntity { @Column(name = "customer_score_aggregate", precision = 10, scale = 2) private BigDecimal customerScoreAggregate; // 고객 총합 - public void updateBenefitAndSalaryScoreAggregate(BigDecimal avgBenefitAndSalary) { + public void updateScoreAggregates(BigDecimal avgBenefitAndSalary, BigDecimal avgWorkLifeBalance, BigDecimal avgWorkEnvironment, BigDecimal avgManager, BigDecimal avgCustomer) { this.benefitAndSalaryScoreAggregate = avgBenefitAndSalary; - } - - public void updateWorkLiftBalanceScoreAggregate(BigDecimal avgWorkLifeBalance) { this.workLiftBalanceScoreAggregate = avgWorkLifeBalance; - } - - public void updateWorkEnvironmentScoreAggregate(BigDecimal avgWorkEnvironment) { this.workEnvironmentScoreAggregate = avgWorkEnvironment; - } - - public void updateManagerScoreAggregate(BigDecimal avgManager) { this.managerScoreAggregate = avgManager; - } - - public void updateCustomerScoreAggregate(BigDecimal avgCustomer) { this.customerScoreAggregate = avgCustomer; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenInternshipReviewAggregateService.java b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenInternshipReviewAggregateService.java index b584dac..5ba6867 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenInternshipReviewAggregateService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenInternshipReviewAggregateService.java @@ -43,8 +43,6 @@ public void updateOrCreateAggregate(Kindergarten kindergarten) { KindergartenInternshipReviewAggregate aggregate = kindergartenInternshipReviewAggregateRepository.findByKindergarten(kindergarten); - aggregate.updateWorkEnvironmentScoreAggregate(avgWorkEnvironmentScore); - aggregate.updateLearningSupportScoreAggregate(avgLearningSupportScore); - aggregate.updateInstructionTeacherScoreAggregate(avgInstructionTeacherScore); + aggregate.updateScoreAggregates(avgWorkEnvironmentScore, avgLearningSupportScore, avgInstructionTeacherScore); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenService.java b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenService.java index 9f0dc52..cfe822d 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenService.java @@ -106,6 +106,10 @@ public Kindergarten getKindergartenById(Long id) { .orElseThrow(() -> new BusinessException(ErrorCodes.ENTITY_NOT_FOUND_EXCEPTION)); } + public Kindergarten getKindergartenByName(String kindergartenName) { + return kindergartenRepository.findByName(kindergartenName).orElseThrow(() -> new BusinessException(ErrorCodes.KINDERGARTEN_NOT_FOUND)); + } + /// DTO -> Entity 변환 private Kindergarten convertToEntity(KindergartenDTO dto) { return Kindergarten.builder() diff --git a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenWorkReviewAggregateService.java b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenWorkReviewAggregateService.java index e01ed79..2a4dddb 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenWorkReviewAggregateService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/kindergatens/service/KindergartenWorkReviewAggregateService.java @@ -48,11 +48,6 @@ public void updateOrCreateAggregate(Kindergarten kindergarten) { BigDecimal avgCustomer = BigDecimal.valueOf((double) totalCustomer / reviewCount); KindergartenWorkReviewAggregate aggregate = workReviewAggregateRepository.findByKindergarten(kindergarten); - - aggregate.updateBenefitAndSalaryScoreAggregate(avgBenefitAndSalary); - aggregate.updateWorkLiftBalanceScoreAggregate(avgWorkLifeBalance); - aggregate.updateWorkEnvironmentScoreAggregate(avgWorkEnvironment); - aggregate.updateManagerScoreAggregate(avgManager); - aggregate.updateCustomerScoreAggregate(avgCustomer); + aggregate.updateScoreAggregates(avgBenefitAndSalary, avgWorkLifeBalance, avgWorkEnvironment, avgManager, avgCustomer); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/notice/entity/Notice.java b/src/main/java/com/onebyone/kindergarten/domain/notice/entity/Notice.java index 19e558e..ac03e7b 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/notice/entity/Notice.java +++ b/src/main/java/com/onebyone/kindergarten/domain/notice/entity/Notice.java @@ -6,6 +6,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity @Getter @NoArgsConstructor @@ -37,5 +39,6 @@ public Notice(String title, String content, boolean isPushSend, boolean isPublic public void togglePublicStatus() { this.isPublic = !this.isPublic; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/pushNotification/entity/PushNotification.java b/src/main/java/com/onebyone/kindergarten/domain/pushNotification/entity/PushNotification.java index cbfd8d7..fc417d2 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/pushNotification/entity/PushNotification.java +++ b/src/main/java/com/onebyone/kindergarten/domain/pushNotification/entity/PushNotification.java @@ -9,6 +9,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity(name = "push_notification") @Getter @NoArgsConstructor @@ -52,20 +54,24 @@ public class PushNotification extends BaseEntity { /// 알림 읽음 처리 public void markAsRead() { this.isRead = true; + this.updatedAt = LocalDateTime.now(); } /// 알림 전송 처리 public void markAsSent() { this.isSent = true; + this.updatedAt = LocalDateTime.now(); } /// 그룹 카운트 증가 public void increaseGroupCount() { this.groupCount++; + this.updatedAt = LocalDateTime.now(); } /// 그룹 메시지 업데이트 public void updateGroupMessage(String newMessage) { this.message = newMessage; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/pushNotification/repository/PushNotificationRepository.java b/src/main/java/com/onebyone/kindergarten/domain/pushNotification/repository/PushNotificationRepository.java index 527a75f..b9f22c3 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/pushNotification/repository/PushNotificationRepository.java +++ b/src/main/java/com/onebyone/kindergarten/domain/pushNotification/repository/PushNotificationRepository.java @@ -19,8 +19,8 @@ public interface PushNotificationRepository extends JpaRepository findByUserAndIsReadFalseOrderByCreatedAtDesc(User user); @Modifying - @Query("UPDATE push_notification p SET p.isRead = true WHERE p.user = :user") - void markAllAsRead(@Param("user") User user); + @Query("UPDATE push_notification p SET p.isRead = true, p.updatedAt = :now WHERE p.user = :user") + void markAllAsRead(@Param("user") User user, @Param("now") LocalDateTime now); long countByUserAndIsReadFalse(User user); diff --git a/src/main/java/com/onebyone/kindergarten/domain/pushNotification/service/PushNotificationService.java b/src/main/java/com/onebyone/kindergarten/domain/pushNotification/service/PushNotificationService.java index 239f37e..d4414f6 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/pushNotification/service/PushNotificationService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/pushNotification/service/PushNotificationService.java @@ -396,7 +396,7 @@ public void markAllAsRead(UserDetails userDetails) { .orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_USER)); // 모든 알림 읽음 처리 - pushNotificationRepository.markAllAsRead(user); + pushNotificationRepository.markAllAsRead(user, LocalDateTime.now()); } /// 읽지 않은 알림 개수 조회 diff --git a/src/main/java/com/onebyone/kindergarten/domain/reports/entity/Report.java b/src/main/java/com/onebyone/kindergarten/domain/reports/entity/Report.java index 3b918c6..0f97222 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/reports/entity/Report.java +++ b/src/main/java/com/onebyone/kindergarten/domain/reports/entity/Report.java @@ -46,5 +46,6 @@ public Report(User reporter, Long targetId, ReportTargetType targetType, String public void updateStatus(ReportStatus status) { this.status = status; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/controller/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/controller/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/dto/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/dto/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/entity/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/entity/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/repository/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/repository/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/service/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/termAgreementHistory/service/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/user/entity/EmailCertification.java b/src/main/java/com/onebyone/kindergarten/domain/user/entity/EmailCertification.java index 7d264d0..7761e2a 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/user/entity/EmailCertification.java +++ b/src/main/java/com/onebyone/kindergarten/domain/user/entity/EmailCertification.java @@ -11,6 +11,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Getter @Builder @AllArgsConstructor @@ -29,5 +31,6 @@ public class EmailCertification extends BaseEntity { public void completeCertification() { this.isCertificated = true; + this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/user/entity/User.java b/src/main/java/com/onebyone/kindergarten/domain/user/entity/User.java index ed543df..44e6647 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/user/entity/User.java +++ b/src/main/java/com/onebyone/kindergarten/domain/user/entity/User.java @@ -95,6 +95,7 @@ public void setNotificationSettings(Set enabledSettings) { this.allNotificationsEnabled = enabledSettings.contains(NotificationSetting.ALL_NOTIFICATIONS); this.communityNotificationsEnabled = enabledSettings.contains(NotificationSetting.COMMUNITY_NOTIFICATIONS); this.eventNotificationsEnabled = enabledSettings.contains(NotificationSetting.EVENT_NOTIFICATIONS); + this.updatedAt = LocalDateTime.now(); } public static User registerKakao(String email, String password, Long kakaoProviderId, String nickname, @@ -140,10 +141,12 @@ public static User registerApple(String email, String password, String appleProv public void changeNickname(String nickname) { this.nickname = nickname; + this.updatedAt = LocalDateTime.now(); } public void changePassword(String password) { this.password = password; + this.updatedAt = LocalDateTime.now(); } public void withdraw() { @@ -156,6 +159,7 @@ public void withdraw() { this.profileImageUrl = null; this.homeShortcut = null; this.fcmToken = null; + this.updatedAt = LocalDateTime.now(); } /// 현재 deletedAt 값을 previousDeletedAt에 저장 @@ -163,6 +167,7 @@ public void restore() { this.previousDeletedAt = this.deletedAt; this.status = UserStatus.ACTIVE; this.deletedAt = null; + this.updatedAt = LocalDateTime.now(); } public void updateFcmToken(String fcmToken) { @@ -172,6 +177,7 @@ public void updateFcmToken(String fcmToken) { // 최소 길이 및 기본 패턴 검증 if (trimmedToken.length() >= 140 && trimmedToken.matches("^[a-zA-Z0-9_:.-]+$")) { this.fcmToken = trimmedToken; + this.updatedAt = LocalDateTime.now(); } else { this.fcmToken = null; } @@ -186,18 +192,22 @@ public String getTotalCareer() { public void updateCareer(String career) { this.career = career; + this.updatedAt = LocalDateTime.now(); } public void updateHomeShortcut(String homeShortcutJson) { this.homeShortcut = homeShortcutJson; + this.updatedAt = LocalDateTime.now(); } public void updateUserRole(UserRole role) { this.role = role; + this.updatedAt = LocalDateTime.now(); } public void updateProfileImageUrl(String profileImageUrl) { this.profileImageUrl = profileImageUrl; + this.updatedAt = LocalDateTime.now(); } public boolean isRestoredUser() { @@ -206,6 +216,7 @@ public boolean isRestoredUser() { public void markAsReviewWriter() { this.hasWrittenReview = true; + this.updatedAt = LocalDateTime.now(); } public boolean hasWrittenReview() { @@ -215,6 +226,8 @@ public boolean hasWrittenReview() { /// 유저 상태 변경 (관리자용) public void updateStatus(UserStatus status) { this.status = status; + this.updatedAt = LocalDateTime.now(); + if (status == UserStatus.SUSPENDED) { // TODO : 정지 시 특별한 처리가 필요하다면 여기에 추가 } else if (status == UserStatus.ACTIVE) { diff --git a/src/main/java/com/onebyone/kindergarten/domain/user/service/UserService.java b/src/main/java/com/onebyone/kindergarten/domain/user/service/UserService.java index 96f00e2..da07922 100644 --- a/src/main/java/com/onebyone/kindergarten/domain/user/service/UserService.java +++ b/src/main/java/com/onebyone/kindergarten/domain/user/service/UserService.java @@ -18,6 +18,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.Optional; import java.util.HashSet; import java.util.Set; @@ -136,9 +138,14 @@ public User getUserByEmail(String email) { .orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_EMAIL)); } - @Transactional - public void updateCareer(User user, String career) { - user.updateCareer(career); + public void addCareer(User user, LocalDate startDate, LocalDate endDate) { + int careerMonths = calculateCareerMonths(user, startDate, endDate, true); + user.updateCareer(String.valueOf(careerMonths)); + } + + public void removeCareer(User user, LocalDate startDate, LocalDate endDate) { + int careerMonths = calculateCareerMonths(user, startDate, endDate, false); + user.updateCareer(String.valueOf(careerMonths)); } public UserDTO getUser(String email) { @@ -505,4 +512,13 @@ public void updateUserStatus(Long userId, UpdateUserStatusRequestDTO request, St // 상태 변경 targetUser.updateStatus(request.getStatus()); } + + /// 경력 개월 수 계산 + private int calculateCareerMonths(User user, LocalDate startDate, LocalDate endDate, boolean isAdding) { + int currentCareerMonths = user.getCareer() == null ? 0 : Integer.parseInt(user.getCareer()); + long monthsBetween = ChronoUnit.MONTHS.between(startDate, endDate); + return isAdding ? + currentCareerMonths + (int)monthsBetween : + currentCareerMonths - (int)monthsBetween; + } } diff --git a/src/main/java/com/onebyone/kindergarten/domain/userNotification/controller/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/userNotification/controller/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/userNotification/dto/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/userNotification/dto/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/userNotification/entity/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/userNotification/entity/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/userNotification/repository/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/userNotification/repository/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/domain/userNotification/service/.gitkeep b/src/main/java/com/onebyone/kindergarten/domain/userNotification/service/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/onebyone/kindergarten/global/common/BaseEntity.java b/src/main/java/com/onebyone/kindergarten/global/common/BaseEntity.java index fedf963..b4a5bd2 100644 --- a/src/main/java/com/onebyone/kindergarten/global/common/BaseEntity.java +++ b/src/main/java/com/onebyone/kindergarten/global/common/BaseEntity.java @@ -18,8 +18,7 @@ public class BaseEntity { protected LocalDateTime createdAt; @Column(name = "updated_at") - @LastModifiedDate - protected LocalDateTime updatedAt; // 수정일 + protected LocalDateTime updatedAt; @Column(name = "deleted_at") protected LocalDateTime deletedAt; diff --git a/src/main/java/com/onebyone/kindergarten/global/exception/ErrorCodes.java b/src/main/java/com/onebyone/kindergarten/global/exception/ErrorCodes.java index a100f6a..de2a8c2 100644 --- a/src/main/java/com/onebyone/kindergarten/global/exception/ErrorCodes.java +++ b/src/main/java/com/onebyone/kindergarten/global/exception/ErrorCodes.java @@ -52,6 +52,7 @@ public enum ErrorCodes { ALREADY_EXIST_EMAIL_CERTIFICATION("E0046", "기존에 발급된 인증번호가 존재합니다."), FAILED_EMAIL_CERTIFICATION_EXCEPTION("E0047", "인증되지 않은 이메일입니다."), FAILED_AUTHORIZATION_EXCEPTION("E0048", "인증되지 않은 요청입니다."), + INCORRECT_KINDERGARTEN_EXCEPTION("E0049", "유치원이 일치하지 않습니다."), INTERNAL_SERVER_ERROR("E9999","알 수 없는 에러 발생"); private final String code; diff --git a/src/main/java/com/onebyone/kindergarten/global/facade/KindergartenWorkHistoryFacade.java b/src/main/java/com/onebyone/kindergarten/global/facade/KindergartenWorkHistoryFacade.java new file mode 100644 index 0000000..af851c2 --- /dev/null +++ b/src/main/java/com/onebyone/kindergarten/global/facade/KindergartenWorkHistoryFacade.java @@ -0,0 +1,49 @@ +package com.onebyone.kindergarten.global.facade; + +import com.onebyone.kindergarten.domain.kindergartenWorkHistories.dto.KindergartenWorkHistoryRequest; +import com.onebyone.kindergarten.domain.kindergartenWorkHistories.dto.KindergartenWorkHistoryResponse; +import com.onebyone.kindergarten.domain.kindergartenWorkHistories.entity.KindergartenWorkHistory; +import com.onebyone.kindergarten.domain.kindergartenWorkHistories.service.KindergartenWorkHistoryService; +import com.onebyone.kindergarten.domain.kindergatens.entity.Kindergarten; +import com.onebyone.kindergarten.domain.kindergatens.service.KindergartenService; +import com.onebyone.kindergarten.domain.user.entity.User; +import com.onebyone.kindergarten.domain.user.service.UserService; +import com.onebyone.kindergarten.global.exception.BusinessException; +import com.onebyone.kindergarten.global.exception.ErrorCodes; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class KindergartenWorkHistoryFacade { + private final UserService userService; + private final KindergartenService kindergartenService; + private final KindergartenWorkHistoryService kindergartenWorkHistoryService; + + @Transactional + public KindergartenWorkHistoryResponse addCertification(String email, KindergartenWorkHistoryRequest request) { + // 사용자 조회 + User user = userService.getUserByEmail(email); + + // 유치원 이름으로 유치원 조회 + Kindergarten kindergarten = kindergartenService.getKindergartenByName(request.getKindergartenName()); + + userService.addCareer(user, request.getStartDate(), request.getEndDate()); + return kindergartenWorkHistoryService.addCertification(user, kindergarten, request); + } + + @Transactional + public void deleteCertification(String email, Long certificationId) { + User user = userService.getUserByEmail(email); + KindergartenWorkHistory workHistory = kindergartenWorkHistoryService.getKindergartenWorkHistory(certificationId); + + // 유치원 근무 이력 소유자 확인 + if (!workHistory.getUser().equals(user)) { + throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE); + } + + userService.removeCareer(user, workHistory.getStartDate(), workHistory.getEndDate()); + kindergartenWorkHistoryService.deleteCertification(workHistory); + } +}