diff --git a/api/pom.xml b/api/pom.xml index 1d3cbb39..417c1c2c 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -6,7 +6,7 @@ ca.bc.gov.educ educ-grad-trax-api - 1.8.47 + 1.8.48 educ-grad-trax-api Ministry of Education GRAD TRAX API diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/repository/EventRepository.java b/api/src/main/java/ca/bc/gov/educ/api/trax/repository/EventRepository.java index dd0455c8..9c3a7c33 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/repository/EventRepository.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/repository/EventRepository.java @@ -2,8 +2,12 @@ import ca.bc.gov.educ.api.trax.model.entity.Event; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -15,4 +19,9 @@ public interface EventRepository extends JpaRepository { List findAllByEventStatusOrderByCreateDate(String eventStatus); + @Transactional + @Modifying + @Query("delete from Event where createDate <= :createDate") + void deleteByCreateDateBefore(LocalDateTime createDate); + } diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/repository/TraxUpdatedPubEventRepository.java b/api/src/main/java/ca/bc/gov/educ/api/trax/repository/TraxUpdatedPubEventRepository.java index efca92be..f5dc8c45 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/repository/TraxUpdatedPubEventRepository.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/repository/TraxUpdatedPubEventRepository.java @@ -1,10 +1,12 @@ package ca.bc.gov.educ.api.trax.repository; import ca.bc.gov.educ.api.trax.model.entity.TraxUpdatedPubEvent; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -38,4 +40,9 @@ public interface TraxUpdatedPubEventRepository extends JpaRepository findByEventStatusOrderByCreateDate(String eventStatus); + @Transactional + @Modifying + @Query("delete from TraxUpdatedPubEvent where createDate <= :createDate") + void deleteByCreateDateBefore(LocalDateTime createDate); + } diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/scheduler/PurgeOldRecordsScheduler.java b/api/src/main/java/ca/bc/gov/educ/api/trax/scheduler/PurgeOldRecordsScheduler.java new file mode 100644 index 00000000..f494a5a0 --- /dev/null +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/scheduler/PurgeOldRecordsScheduler.java @@ -0,0 +1,46 @@ +package ca.bc.gov.educ.api.trax.scheduler; + +import ca.bc.gov.educ.api.trax.repository.EventRepository; +import ca.bc.gov.educ.api.trax.repository.TraxUpdatedPubEventRepository; +import ca.bc.gov.educ.api.trax.util.EducGradTraxApiConstants; +import jakarta.transaction.Transactional; +import lombok.extern.slf4j.Slf4j; +import net.javacrumbs.shedlock.core.LockAssert; +import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +@Slf4j +public class PurgeOldRecordsScheduler { + + private final EventRepository eventRepository; + private final TraxUpdatedPubEventRepository traxUpdatedPubEventRepository; + private final EducGradTraxApiConstants constants; + + public PurgeOldRecordsScheduler(final EventRepository eventRepository, + final TraxUpdatedPubEventRepository traxUpdatedPubEventRepository, + final EducGradTraxApiConstants constants) { + this.eventRepository = eventRepository; + this.traxUpdatedPubEventRepository = traxUpdatedPubEventRepository; + this.constants = constants; + } + + @Scheduled(cron = "${cron.scheduled.process.purge-old-records.run}") + @SchedulerLock(name = "PurgeOldRecordsLock", + lockAtLeastFor = "PT1H", lockAtMostFor = "PT1H") //midnight job so lock for an hour + @Transactional + public void purgeOldRecords() { + LockAssert.assertLocked(); + final LocalDateTime createDateToCompare = this.calculateCreateDateBasedOnStaleEventInDays(); + this.eventRepository.deleteByCreateDateBefore(createDateToCompare); + this.traxUpdatedPubEventRepository.deleteByCreateDateBefore(createDateToCompare); + } + + private LocalDateTime calculateCreateDateBasedOnStaleEventInDays() { + final LocalDateTime currentTime = LocalDateTime.now(); + return currentTime.minusDays(this.constants.getRecordsStaleInDays()); + } +} diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java b/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java index f30604cb..eea710ea 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java @@ -169,4 +169,7 @@ public class EducGradTraxApiConstants { @Value("${cron.scheduled.process.trigger-jobs.read-trax-update.threshold}") private int traxTriggersProcessingThreshold; + @Value("${cron.scheduled.process.purge-old-records.staleInDays}") + private int recordsStaleInDays; + } diff --git a/api/src/main/resources/application.yaml b/api/src/main/resources/application.yaml index 608aa98c..6d04ba17 100644 --- a/api/src/main/resources/application.yaml +++ b/api/src/main/resources/application.yaml @@ -131,6 +131,9 @@ cron: lockAtLeastFor: ${CRON_SCHEDULED_TRIGGER_TRAX_UPDATES_LOCK_AT_LEAST_FOR} lockAtMostFor: ${CRON_SCHEDULED_TRIGGER_TRAX_UPDATES_LOCK_AT_MOST_FOR} threshold: ${CRON_SCHEDULED_TRIGGER_TRAX_UPDATES_THRESHOLD} + purge-old-records: + run: ${CRON_SCHEDULED_PURGE_OLD_RECORDS} + staleInDays: ${RECORDS_STALE_IN_DAYS} #Incremental Trax Update trax: diff --git a/api/src/test/resources/application.yaml b/api/src/test/resources/application.yaml index 339383b7..28f46de3 100644 --- a/api/src/test/resources/application.yaml +++ b/api/src/test/resources/application.yaml @@ -90,6 +90,9 @@ cron: lockAtLeastFor: 800ms lockAtMostFor: 900ms threshold: 100 + purge-old-records: + run: 0 30 0 * * * + staleInDays: 90 #Incremental Trax Update trax: