hensei-api/app/jobs/generate_party_preview_job.rb
Justin Edmund 1c1ed0dd9d
Work towards fixing embed images (#174)
* Add Redis and Sidekiq

* Rename PreviewGenerationMonitor

* Update production.rb

require master key

* Initialize AWS at application start

* Add fallbacks for credentials

* Add logging

* Create railway.toml
2025-01-18 11:46:41 -08:00

77 lines
2.4 KiB
Ruby

# app/jobs/generate_party_preview_job.rb
class GeneratePartyPreviewJob < ApplicationJob
queue_as :previews
# Configure retry behavior
retry_on StandardError, wait: :exponentially_longer, attempts: 3
discard_on ActiveRecord::RecordNotFound do |job, error|
Rails.logger.error("Party #{job.arguments.first} not found for preview generation")
end
around_perform :track_timing
def perform(party_id)
Rails.logger.info("Starting preview generation for party #{party_id}")
party = Party.find(party_id)
if party.preview_state == 'generated' &&
party.preview_generated_at &&
party.preview_generated_at > 1.hour.ago
Rails.logger.info("Skipping preview generation - recent preview exists")
return
end
begin
service = PreviewService::Coordinator.new(party)
Rails.logger.info("Created PreviewService::Coordinator")
result = service.generate_preview
Rails.logger.info("Generate preview result: #{result}")
if result
Rails.logger.info("Successfully generated preview for party #{party_id}")
else
Rails.logger.error("Failed to generate preview for party #{party_id}")
notify_failure(party)
end
rescue => e
Rails.logger.error("Error generating preview for party #{party_id}: #{e.message}")
Rails.logger.error("Full error details:")
Rails.logger.error(e.full_message) # This will include the stack trace
notify_failure(party, e)
raise
end
end
private
def track_timing
start_time = Time.current
job_id = job_id
Rails.logger.info("Preview generation job #{job_id} starting")
yield
duration = Time.current - start_time
Rails.logger.info("Preview generation job #{job_id} completed in #{duration.round(2)}s")
# Track metrics if you have a metrics service
# StatsD.timing("preview_generation.duration", duration * 1000)
end
def notify_failure(party, error = nil)
# Log to error tracking service if you have one
# Sentry.capture_exception(error) if error
# You could also notify admins through Slack/email for critical failures
message = if error
"Preview generation failed for party #{party.id} with error: #{error.message}"
else
"Preview generation failed for party #{party.id}"
end
# SlackNotifier.notify(message) # If you have Slack integration
end
end