diff --git a/src/main/java/com/Podzilla/analytics/AnalyticsApplication.java b/src/main/java/com/Podzilla/analytics/AnalyticsApplication.java index 683b0d5..cd1ea7d 100644 --- a/src/main/java/com/Podzilla/analytics/AnalyticsApplication.java +++ b/src/main/java/com/Podzilla/analytics/AnalyticsApplication.java @@ -3,9 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @ComponentScan(basePackages = { "com.podzilla", "com.Podzilla" }) +@EnableScheduling public class AnalyticsApplication { public static void main(final String[] args) { diff --git a/src/main/java/com/Podzilla/analytics/repositories/OrderRepository.java b/src/main/java/com/Podzilla/analytics/repositories/OrderRepository.java index 6fabe47..7fcb5b5 100644 --- a/src/main/java/com/Podzilla/analytics/repositories/OrderRepository.java +++ b/src/main/java/com/Podzilla/analytics/repositories/OrderRepository.java @@ -6,6 +6,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.transaction.annotation.Transactional; import com.Podzilla.analytics.api.projections.fulfillment.FulfillmentTimeProjection; import com.Podzilla.analytics.api.projections.order.OrderFailureRateProjection; @@ -164,4 +166,16 @@ List findRevenueSummaryByPeriod( List findRevenueByCategory( @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate); + + @Modifying + @Transactional + @Query("DELETE FROM OrderItem oi " + + "WHERE oi.order.id IN (SELECT o.id FROM Order o " + + "WHERE o.orderPlacedTimestamp < :cutoff)") + void deleteOrderItemsOlderThan(@Param("cutoff") LocalDateTime cutoff); + + @Modifying + @Transactional + @Query("DELETE FROM Order o WHERE o.orderPlacedTimestamp < :cutoff") + void deleteOrdersOlderThan(@Param("cutoff") LocalDateTime cutoff); } diff --git a/src/main/java/com/Podzilla/analytics/scheduling/CleanupScheduler.java b/src/main/java/com/Podzilla/analytics/scheduling/CleanupScheduler.java new file mode 100644 index 0000000..d72f4b6 --- /dev/null +++ b/src/main/java/com/Podzilla/analytics/scheduling/CleanupScheduler.java @@ -0,0 +1,32 @@ +package com.Podzilla.analytics.scheduling; + +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import com.Podzilla.analytics.repositories.OrderRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; + +@Component +public class CleanupScheduler { + + private final OrderRepository orderRepository; + + @Autowired + public CleanupScheduler(final OrderRepository orderRepository) { + this.orderRepository = orderRepository; + } + + // // Runs at 2:00 AM on the first day of every month + @Scheduled(cron = "0 0 2 1 * ?") + @Transactional + public void monthlyCleanup() { + System.out.println("Starting monthly cleanup"); + LocalDateTime cutoff = LocalDateTime.now().minusMonths(1); + // Delete order items first + orderRepository.deleteOrderItemsOlderThan(cutoff); + // Then delete orders + orderRepository.deleteOrdersOlderThan(cutoff); + System.out.println("Monthly cleanup completed"); + } +}