Browse Source

feat: round auto sync times to next full hour #103

Updates calculate_next_sync_time() function to always schedule syncs at round hour marks:
- hourly: syncs at :00 (e.g., 11:00, 12:00, 13:00)
- 30min: syncs at :00 or :30 (e.g., 11:00, 11:30, 12:00)
- 15min: syncs at :00, :15, :30, :45
- 6hours: syncs at 00:00, 06:00, 12:00, 18:00
- daily: syncs at 00:00 next day

Also updates all existing active stores to sync at the next round hour.

Example: Store registered at 11:36h will now sync at 12:00h instead of 12:36h.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Claude 4 months ago
parent
commit
243314ecb7
1 changed files with 88 additions and 0 deletions
  1. 88 0
      supabase/migrations/20251120_fix_next_sync_round_hour.sql

+ 88 - 0
supabase/migrations/20251120_fix_next_sync_round_hour.sql

@@ -0,0 +1,88 @@
+-- Migration: Fix Auto Sync Times to Next Round Hour
+-- Description: Updates calculate_next_sync_time to always round up to next full hour
+-- Date: 2025-11-20
+-- Related Issue: #103
+
+-- ============================================================================
+-- STEP 1: Update calculate_next_sync_time Function to Round to Next Hour
+-- ============================================================================
+
+CREATE OR REPLACE FUNCTION calculate_next_sync_time(frequency TEXT)
+RETURNS TIMESTAMPTZ AS $$
+DECLARE
+  base_time TIMESTAMPTZ;
+  next_time TIMESTAMPTZ;
+BEGIN
+  -- Start from the next round hour
+  base_time := DATE_TRUNC('hour', NOW()) + INTERVAL '1 hour';
+
+  -- Apply frequency on top of the next round hour
+  next_time := CASE frequency
+    WHEN '15min' THEN
+      -- For 15min frequency, find next 15-minute mark (:00, :15, :30, :45)
+      DATE_TRUNC('hour', NOW()) +
+      (INTERVAL '15 minutes' * CEIL(EXTRACT(MINUTE FROM NOW()) / 15.0))
+    WHEN '30min' THEN
+      -- For 30min frequency, find next 30-minute mark (:00, :30)
+      DATE_TRUNC('hour', NOW()) +
+      (INTERVAL '30 minutes' * CEIL(EXTRACT(MINUTE FROM NOW()) / 30.0))
+    WHEN 'hourly' THEN base_time
+    WHEN '6hours' THEN
+      -- Round up to next 6-hour mark (00:00, 06:00, 12:00, 18:00)
+      DATE_TRUNC('hour', NOW()) +
+      (INTERVAL '6 hours' * CEIL(EXTRACT(HOUR FROM NOW()) / 6.0))
+    WHEN 'daily' THEN
+      -- Round up to next midnight
+      DATE_TRUNC('day', NOW()) + INTERVAL '1 day'
+    ELSE base_time
+  END;
+
+  -- Ensure we never return a time in the past
+  IF next_time <= NOW() THEN
+    next_time := next_time + CASE frequency
+      WHEN '15min' THEN INTERVAL '15 minutes'
+      WHEN '30min' THEN INTERVAL '30 minutes'
+      WHEN 'hourly' THEN INTERVAL '1 hour'
+      WHEN '6hours' THEN INTERVAL '6 hours'
+      WHEN 'daily' THEN INTERVAL '1 day'
+      ELSE INTERVAL '1 hour'
+    END;
+  END IF;
+
+  RETURN next_time;
+END;
+$$ LANGUAGE plpgsql;
+
+-- ============================================================================
+-- STEP 2: Update All Existing Stores to Sync at Next Round Hour
+-- ============================================================================
+
+-- Update all existing store sync configs to use the new rounded times
+UPDATE store_sync_config
+SET
+  next_sync_at = calculate_next_sync_time(sync_frequency),
+  updated_at = NOW()
+WHERE enabled = true;
+
+-- ============================================================================
+-- Migration Complete
+-- ============================================================================
+
+DO $$
+DECLARE
+  updated_count INTEGER;
+BEGIN
+  SELECT COUNT(*) INTO updated_count
+  FROM store_sync_config
+  WHERE enabled = true;
+
+  RAISE NOTICE 'Auto sync times migration completed successfully';
+  RAISE NOTICE 'Updated % active store sync configurations', updated_count;
+  RAISE NOTICE 'All stores now scheduled to sync at round hour marks';
+  RAISE NOTICE 'Example schedule times:';
+  RAISE NOTICE '  - hourly: :00 (e.g., 11:00, 12:00, 13:00)';
+  RAISE NOTICE '  - 30min: :00 or :30 (e.g., 11:00, 11:30, 12:00)';
+  RAISE NOTICE '  - 15min: :00, :15, :30, :45 (e.g., 11:00, 11:15, 11:30)';
+  RAISE NOTICE '  - 6hours: 00:00, 06:00, 12:00, 18:00';
+  RAISE NOTICE '  - daily: 00:00 next day';
+END $$;