-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
Coordinate full sync flow with transaction safety
class SyncOrchestrator
def perform
report_status(:syncing)
manifest = fetch_manifest
ActiveRecord::Base.transaction do
sync_tags(manifest["tags"])
sync_providers_with_content(manifest["providers"])
cleanup_orphans(manifest)
update_device_config(manifest)
end
report_status(:synced)
rescue ManifestChangedError <----- this may be redundant
# Manifest changed during sync, restart
retry
rescue => e
report_status(:error, error_message: e.message)
raise
end
private
def sync_providers_with_content(providers)
providers.each_with_index do |provider_data, idx|
provider = provider_sync.sync(provider_data)
provider_data["topics"].each do |topic_data|
# Check manifest hasn't changed every 5 files
check_manifest_unchanged! if should_check_manifest?(idx)
topic = topic_sync.sync(topic_data, provider)
topic_data["files"].each do |file_data|
topic_file_sync.sync(file_data, topic)
end
end
end
end
endRun sync process automatically
class ContentSyncJob < ApplicationJob
queue_as :default
def perform
return unless network_available?
return if sync_in_progress?
SyncOrchestrator.new.perform
end
end- Schedule periodic checks (e.g., hourly via cron or whenever gem)
- Detect network connectivity before attempting
- Prevent concurrent sync attempts with advisory lock
Reactions are currently unavailable