From 0286c62694be66d3e3de9227194e85b6d14e7729 Mon Sep 17 00:00:00 2001 From: ibaesuyeon Date: Thu, 3 Oct 2024 08:38:23 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[FEAT]=20=EC=95=8C=EB=9E=8C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=98=81=EB=AC=B8=EB=AA=85=20=EC=BC=80=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/converter/CaseConverter.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/main/java/depth/mvp/thinkerbell/global/converter/CaseConverter.java diff --git a/src/main/java/depth/mvp/thinkerbell/global/converter/CaseConverter.java b/src/main/java/depth/mvp/thinkerbell/global/converter/CaseConverter.java new file mode 100644 index 0000000..8a53bbe --- /dev/null +++ b/src/main/java/depth/mvp/thinkerbell/global/converter/CaseConverter.java @@ -0,0 +1,57 @@ +package depth.mvp.thinkerbell.global.converter; + +public class CaseConverter { + + /** + * PascalCase 문자열을 snake_case 문자열로 변환합니다. + * + * @param pascalCaseString 변환할 PascalCase 문자열 + * @return 변환된 snake_case 문자열 + */ + public static String pascalToSnake(String pascalCaseString) { + StringBuilder snakeCaseString = new StringBuilder(); + + for (char c : pascalCaseString.toCharArray()) { + if (Character.isUpperCase(c)) { + if (snakeCaseString.length() > 0) { + snakeCaseString.append('_'); + } + snakeCaseString.append(Character.toLowerCase(c)); + } else { + snakeCaseString.append(c); + } + } + + return snakeCaseString.toString(); + } + + /** + * snake_case 문자열을 PascalCase 문자열로 변환합니다. + * + * @param snakeCaseString 변환할 snake_case 문자열 + * @return 변환된 PascalCase 문자열 + */ + public static String snakeToPascal(String snakeCaseString) { + StringBuilder pascalCaseString = new StringBuilder(); + boolean toUpperCase = true; // 첫 문자를 대문자로 변환하기 위해 true로 설정 + + for (char c : snakeCaseString.toCharArray()) { + if (c == '_') { + // 언더스코어 다음 문자를 대문자로 변환하도록 설정합니다. + toUpperCase = true; + } else { + if (toUpperCase) { + // 대문자로 변환 후 설정을 초기화합니다. + pascalCaseString.append(Character.toUpperCase(c)); + toUpperCase = false; + } else { + // 소문자로 추가합니다. + pascalCaseString.append(c); + } + } + } + + return pascalCaseString.toString(); + } + +} \ No newline at end of file From 8525828f2fe5e086bc9f7b1c8f44cb575b714610 Mon Sep 17 00:00:00 2001 From: Ju Do Hyun Date: Wed, 9 Oct 2024 01:16:51 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[FEATURE]=20Pascal=20To=20Snake=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/service/CategoryService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/depth/mvp/thinkerbell/domain/common/service/CategoryService.java b/src/main/java/depth/mvp/thinkerbell/domain/common/service/CategoryService.java index 4b98d8c..5dcf33a 100644 --- a/src/main/java/depth/mvp/thinkerbell/domain/common/service/CategoryService.java +++ b/src/main/java/depth/mvp/thinkerbell/domain/common/service/CategoryService.java @@ -40,6 +40,28 @@ private void convertJsonKeysSnakeToPascal() { } } + public String convertPascalToSnake(String pascalStr) { + StringBuilder snakeStr = new StringBuilder(); + + for (int i = 0; i < pascalStr.length(); i++) { + char currentChar = pascalStr.charAt(i); + // 대문자인 경우 + if (Character.isUpperCase(currentChar)) { + // 첫 번째 문자가 아니면 '_'를 추가 + if (snakeStr.length() > 0) { + snakeStr.append('_'); + } + // 대문자를 소문자로 변환하여 추가 + snakeStr.append(Character.toLowerCase(currentChar)); + } else { + // 소문자 문자는 그대로 추가 + snakeStr.append(currentChar); + } + } + + return snakeStr.toString(); + } + public String convertEnglishToKorea(String category) { return categoryMap1.getOrDefault(category, category); } From ea7f1cc8b42257f908946a2ee3a4f8a2f2bf5a37 Mon Sep 17 00:00:00 2001 From: Ju Do Hyun Date: Wed, 9 Oct 2024 01:17:03 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[FEATURE]=20=ED=95=99=EC=82=AC=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EC=95=8C=EB=A6=BC=20=EB=B0=9C=EC=86=A1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/FCMService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/depth/mvp/thinkerbell/domain/user/service/FCMService.java b/src/main/java/depth/mvp/thinkerbell/domain/user/service/FCMService.java index 75d44fb..becb811 100644 --- a/src/main/java/depth/mvp/thinkerbell/domain/user/service/FCMService.java +++ b/src/main/java/depth/mvp/thinkerbell/domain/user/service/FCMService.java @@ -3,6 +3,7 @@ import com.google.firebase.messaging.*; import depth.mvp.thinkerbell.domain.common.service.CategoryService; import depth.mvp.thinkerbell.domain.user.entity.Alarm; +import depth.mvp.thinkerbell.domain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -36,6 +37,27 @@ public void sendFCMMessage(Alarm alarm, String keyword) { } } + public void sendScheduleMessage(User user, String title) { + try{ + String cutTitle = cutTitle(title, 40); + + String messageBody = String.format("띵~🔔 즐겨찾기한 학사일정이(가) 시작됐어요!\n%s", + cutTitle); + + Message message = Message.builder() + .putData("title", "띵커벨") + .putData("body", messageBody) + .putData("notification_id", UUID.randomUUID().toString()) // 고유한 ID + .setToken(user.getFcmToken()) + .build(); + + String response = FirebaseMessaging.getInstance().send(message); + System.out.println("전송 성공" + response); + } catch (Exception e){ + throw new RuntimeException("FCM 알림을 전송하는 동안 오류가 발생했습니다.",e); + } + } + private String cutTitle(String title, int maxLength) { if (title.length() > maxLength) { return title.substring(0, maxLength - 1) + "…"; // 말줄임표 추가 From 29780a14ade72bb707474d0f949b7596f07cdb63 Mon Sep 17 00:00:00 2001 From: Ju Do Hyun Date: Wed, 9 Oct 2024 01:18:37 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[DOCS]=20Snake=20->=20Pascal=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/Categories.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/resources/Categories.json b/src/main/resources/Categories.json index 9812cae..429f979 100644 --- a/src/main/resources/Categories.json +++ b/src/main/resources/Categories.json @@ -1,16 +1,16 @@ { - "academic_notice": "학사 공지", - "bidding_notice": "입찰 공지", - "career_notice": "진로/취업/창업 공지", - "dormitory_entry_notice": "기숙사 입/퇴사 공지", - "dormitory_notice": "기숙사 공지", - "event_notice": "행사 공지", - "job_training_notice": "현장 실습 지원 공지", - "library_notice": "도서관 공지", - "normal_notice": "일반 공지", - "revision_notice": "학칙개정 사전공고", - "safety_notice": "대학 안전 공지", - "scholarship_notice": "장학/학자금 공지", - "student_acts_notice": "학생활동 공지", - "teaching_notice": "교직 공지" + "AcademicNotice": "학사 공지", + "BiddingNotice": "입찰 공지", + "CareerNotice": "진로/취업/창업 공지", + "DormitoryEntryNotice": "기숙사 입/퇴사 공지", + "DormitoryNotice": "기숙사 공지", + "EventNotice": "행사 공지", + "JobTrainingNotice": "현장 실습 지원 공지", + "LibraryNotice": "도서관 공지", + "NormalNotice": "일반 공지", + "RevisionNotice": "학칙개정 사전공고", + "SafetyNotice": "대학 안전 공지", + "ScholarshipNotice": "장학/학자금 공지", + "StudentActsNotice": "학생활동 공지", + "TeachingNotice": "교직 공지" } \ No newline at end of file From 9ade0785df6efdbb3da762549d1aab75d2ff0b0e Mon Sep 17 00:00:00 2001 From: Ju Do Hyun Date: Wed, 9 Oct 2024 01:19:20 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[FEATURE]=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=82=AD=EC=A0=9C=20=EC=8A=A4=EC=BC=80=EC=A5=B4?= =?UTF-8?q?=EB=A7=81=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/service/NoticeDeleteService.java | 366 ++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 src/main/java/depth/mvp/thinkerbell/domain/notice/service/NoticeDeleteService.java diff --git a/src/main/java/depth/mvp/thinkerbell/domain/notice/service/NoticeDeleteService.java b/src/main/java/depth/mvp/thinkerbell/domain/notice/service/NoticeDeleteService.java new file mode 100644 index 0000000..34a3355 --- /dev/null +++ b/src/main/java/depth/mvp/thinkerbell/domain/notice/service/NoticeDeleteService.java @@ -0,0 +1,366 @@ +package depth.mvp.thinkerbell.domain.notice.service; + +import depth.mvp.thinkerbell.domain.notice.entity.*; +import depth.mvp.thinkerbell.domain.notice.repository.*; +import depth.mvp.thinkerbell.domain.user.entity.Alarm; +import depth.mvp.thinkerbell.domain.user.entity.Bookmark; +import depth.mvp.thinkerbell.domain.user.repository.AlarmRepository; +import depth.mvp.thinkerbell.domain.user.repository.BookmarkRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.Period; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional +public class NoticeDeleteService { + + private final AlarmRepository alarmRepository; + private final BookmarkRepository bookmarkRepository; + private final AcademicScheduleRepository academicScheduleRepository; + private final AcademicNoticeRepository academicNoticeRepository; + private final BiddingNoticeRepository biddingNoticeRepository; + private final CareerNoticeRepository careerNoticeRepository; + private final DormitoryEntryNoticeRepository entryNoticeRepository; + private final DormitoryNoticeRepository dormitoryNoticeRepository; + private final EventNoticeRepository eventNoticeRepository; + private final LibraryNoticeRepository libraryNoticeRepository; + private final NormalNoticeRepository normalNoticeRepository; + private final RevisionNoticeRepository revisionNoticeRepository; + private final SafetyNoticeRepository safetyNoticeRepository; + private final ScholarshipNoticeRepository scholarshipNoticeRepository; + private final StudentActsNoticeRepository studentActsNoticeRepository; + private final TeachingNoticeRepository teachingNoticeRepository; + + // 저장된 학사 일정에서 저장 기한이 지난 데이터 제거 + private void DeleteSchedule(){ + List schedules = academicScheduleRepository.findAll(); + + int currentYear = LocalDate.now().getYear(); + + for (AcademicSchedule schedule : schedules) { + LocalDate[] localDate = ScheduleParser.parseDate(schedule.getSchedule()); + int year = localDate[0].getYear(); + + // 현재 날짜를 기준으로 2년전 자료보다 이전 자료인지 확인 + if (year <= currentYear - 2) { + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("AcademicSchedule", schedule.getId()); + bookmarkRepository.deleteAll(bookmarks); + + academicScheduleRepository.delete(schedule); + } + } + } + + // 저장된 학사 공지에서 6개월 이상이 된 데이터 제거 + // 중요 공지는 삭제하지 않고 일반 공지 중 저장 일자가 지난 공지만 삭제한다. + private void DeleteAcademicNotice(){ + List academicNotices = academicNoticeRepository.findAllByImportantFalse(); + + LocalDate currentDate = LocalDate.now(); + + for (AcademicNotice notice : academicNotices) { + + LocalDate noticeDate = notice.getPubDate(); + + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("AcademicNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("academic_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + academicNoticeRepository.delete(notice); + } + } + } + + // 저장된 입찰 공지에서 6개월 이상이 된 데이터 제거 + private void DeleteBiddingNotice(){ + List biddingNotices = biddingNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (BiddingNotice notice : biddingNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("BiddingNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("bidding_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + biddingNoticeRepository.delete(notice); + } + } + } + + // 저장된 진로/취업/창업 공지에서 6개월 이상이 된 데이터 제거 + private void DeleteCareerNotice(){ + List careerNotices = careerNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (CareerNotice notice : careerNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("CareerNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("career_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + careerNoticeRepository.delete(notice); + } + } + } + + // 저장된 기숙사 입/퇴사 공지중 저장 기한이 다된 데이터 제거 + // 중요 공지는 삭제하지 않고 일반 공지 중 저장 일자가 지난 공지만 삭제한다. + private void DeleteDormitoryEntryNotice(){ + List dormitoryEntryNotices = entryNoticeRepository.findAllByImportantFalse(); + LocalDate currentDate = LocalDate.now(); + + for (DormitoryEntryNotice notice : dormitoryEntryNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("DormitoryEntryNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("dormitory_entry_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + entryNoticeRepository.delete(notice); + } + } + } + + // 저장된 기숙사 공지중 저장 기한이 다된 데이터 제거 + // 중요 공지는 삭제하지 않고 일반 공지 중 저장 일자가 지난 공지만 삭제한다. + private void DeleteDormitoryNotice(){ + List dormitoryNotice = dormitoryNoticeRepository.findAllByImportantFalse(); + LocalDate currentDate = LocalDate.now(); + + for (DormitoryNotice notice : dormitoryNotice) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("DormitoryNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("dormitory_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + dormitoryNoticeRepository.delete(notice); + } + } + } + + // 저장된 행사 공지에서 6개월 이상이 된 데이터 제거 + private void DeleteEventNotice(){ + List eventNotices = eventNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (EventNotice notice : eventNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("EventNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("event_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + eventNoticeRepository.delete(notice); + } + } + } + + // 저장된 도서관 공지중 저장 기한이 다된 데이터 제거 + // 중요 공지는 삭제하지 않고 일반 공지 중 저장 일자가 지난 공지만 삭제한다. + private void DeleteLibraryNotice(){ + List libraryNotices = libraryNoticeRepository.findAllByImportantFalse(); + LocalDate currentDate = LocalDate.now(); + + for (LibraryNotice notice : libraryNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("LibraryNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("library_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + libraryNoticeRepository.delete(notice); + } + } + } + + // 저장된 일반 공지중 저장 기한이 다된 데이터 제거 + // 중요 공지는 삭제하지 않고 일반 공지 중 저장 일자가 지난 공지만 삭제한다. + private void DeleteNormalNotice(){ + List normalNotices = normalNoticeRepository.findAllByImportantFalse(); + LocalDate currentDate = LocalDate.now(); + + for (NormalNotice notice : normalNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + // 기간을 확인한 후 즐겨찾기와 알림에서 해당 공지를 삭제한다. + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("NormalNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("normal_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + normalNoticeRepository.delete(notice); + } + } + } + + // 저장된 학칙개정 공지 중 저장 기한이 다된 데이터 제거 + private void DeleteRevisionNotice(){ + List revisionNotices = revisionNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (RevisionNotice notice : revisionNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("RevisionNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("revision_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + revisionNoticeRepository.delete(notice); + } + } + } + + // 저장된 안전 공지 중 저장 기한이 다된 데이터 제거 + private void DeleteSafetyNotice(){ + List safetyNotices = safetyNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (SafetyNotice notice : safetyNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("SafetyNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("safety_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + safetyNoticeRepository.delete(notice); + } + } + } + + // 저장된 장학/학자금 공지 중 기한이 다된 데이터 제거 + private void DeleteScholarshipNotice(){ + List scholarshipNotices = scholarshipNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (ScholarshipNotice notice : scholarshipNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("ScholarshipNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("Scholarship_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + scholarshipNoticeRepository.delete(notice); + } + } + } + + private void DeleteStudentActsNotice(){ + List studentActsNotices = studentActsNoticeRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (StudentActsNotice notice : studentActsNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + if (period.getYears() >= 3){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("StudentActsNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("Student_acts_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + studentActsNoticeRepository.delete(notice); + } + } + } + + public void DeleteTeachingNotice(){ + List teachingNotices = teachingNoticeRepository.findAllByImportantFalse(); + LocalDate currentDate = LocalDate.now(); + + for (TeachingNotice notice : teachingNotices) { + LocalDate noticeDate = notice.getPubDate(); + Period period = Period.between(noticeDate, currentDate); + + if (period.getMonths() == 9 && period.getDays() == 20){ + List bookmarks = bookmarkRepository.findALLByCategoryAndNoticeID("TeachingNotice", notice.getId()); + bookmarkRepository.deleteAll(bookmarks); + + List alarms = alarmRepository.findALLByNoticeTypeAndNoticeID("Teaching_notice", notice.getId()); + alarmRepository.deleteAll(alarms); + + teachingNoticeRepository.delete(notice); + } + } + } + + + + @Scheduled(cron = "0 0 3 * * ?", zone = "Asia/Seoul") + public void DeleteAllNotices(){ + DeleteSchedule(); + DeleteAcademicNotice(); + DeleteBiddingNotice(); + DeleteCareerNotice(); + DeleteDormitoryNotice(); + DeleteDormitoryEntryNotice(); + DeleteEventNotice(); + DeleteLibraryNotice(); + DeleteNormalNotice(); + DeleteRevisionNotice(); + DeleteScholarshipNotice(); + DeleteStudentActsNotice(); + DeleteTeachingNotice(); + DeleteSafetyNotice(); + } +} From 682d542abdaf295c2ade2238d57aaa479b35f4de Mon Sep 17 00:00:00 2001 From: Ju Do Hyun Date: Wed, 9 Oct 2024 01:19:45 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[FEATURE]=20=ED=95=99=EC=82=AC=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EC=95=8C=EB=A6=BC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/AlarmService.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java b/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java index f35a820..b368e63 100644 --- a/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java +++ b/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java @@ -1,10 +1,13 @@ package depth.mvp.thinkerbell.domain.user.service; import depth.mvp.thinkerbell.domain.common.service.CategoryService; +import depth.mvp.thinkerbell.domain.notice.entity.AcademicSchedule; import depth.mvp.thinkerbell.domain.notice.entity.AllNoticesView; import depth.mvp.thinkerbell.domain.notice.entity.CrawlingNum; +import depth.mvp.thinkerbell.domain.notice.repository.AcademicScheduleRepository; import depth.mvp.thinkerbell.domain.notice.repository.AllNoticeViewRepository; import depth.mvp.thinkerbell.domain.notice.repository.CrawlingNumRepository; +import depth.mvp.thinkerbell.domain.notice.service.ScheduleParser; import depth.mvp.thinkerbell.domain.user.dto.AlarmDto; import depth.mvp.thinkerbell.domain.user.entity.Alarm; import depth.mvp.thinkerbell.domain.user.entity.Bookmark; @@ -25,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import org.webjars.NotFoundException; +import java.time.LocalDate; import java.util.*; @Service @@ -36,6 +40,7 @@ public class AlarmService { private EntityManager entityManager; private final AllNoticeViewRepository allNoticeViewRepository; + private final AcademicScheduleRepository academicScheduleRepository; private final KeywordRepository keywordRepository; private final CrawlingNumRepository crawlingNumRepository; private final AlarmRepository alarmRepository; @@ -97,6 +102,31 @@ public void updateNoticeAndMatchKeyword(){ } } + //매일 오전 8시에 학사일정 알림 전송 + @Scheduled(cron = "0 0 8 * * ?", zone = "Asia/Seoul") + public void sendAlarmForBookmarkSchedule(){ + List userList = userRepository.findAll(); + LocalDate currentDate = LocalDate.now(); + + for (User user : userList) { + List bookmarkList = bookmarkRepository.findByUserAndCategoryOrderByCreatedAtDesc(user, "AcademicSchedule");; + + if (bookmarkList != null) { + for (Bookmark bookmark : bookmarkList) { + AcademicSchedule academicSchedule = academicScheduleRepository.findOneById(bookmark.getNoticeID()); + + if (academicSchedule != null) { + if (currentDate.isEqual(ScheduleParser.parseDate(academicSchedule.getSchedule())[0])){ + fcmService.sendScheduleMessage(user, academicSchedule.getTitle()); + } + } + } + } + } + } + + + public synchronized void updateCrawlingNum(CrawlingNum crawlingNum, Long newMaxID) { Optional existingCrawlingNumOpt = crawlingNumRepository.findByNoticeType(crawlingNum.getNoticeType()); if (existingCrawlingNumOpt.isPresent()) { From 895661a7dfbc677917337abf27c0dc2ccc90a294 Mon Sep 17 00:00:00 2001 From: Ju Do Hyun Date: Wed, 9 Oct 2024 01:20:25 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[FIX]=20Snake=20->=20Pascal=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mvp/thinkerbell/domain/user/service/AlarmService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java b/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java index b368e63..c1922ed 100644 --- a/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java +++ b/src/main/java/depth/mvp/thinkerbell/domain/user/service/AlarmService.java @@ -219,13 +219,13 @@ public List getAlarms(String SSAID, String keyword){ List alarmDtos = new ArrayList<>(); for (Alarm alarm : alarms) { - String noticeType = categoryService.convertSnakeToPascal(alarm.getNoticeType()); + String noticeType = alarm.getNoticeType(); List bookmark = bookmarkRepository.findByCategoryAndUserAndNoticeID(noticeType, user, alarm.getNoticeID()); boolean isMarked = !bookmark.isEmpty(); - Map noticeDetails = getNoticeDetails(alarm.getNoticeType(), alarm.getNoticeID()); + Map noticeDetails = getNoticeDetails(categoryService.convertPascalToSnake(noticeType), alarm.getNoticeID()); String url = (String) noticeDetails.get("url"); String pubDate = (String) noticeDetails.get("pubDate");