Update logic and logs
This commit is contained in:
parent
ab1fd78530
commit
8194844d28
1 changed files with 67 additions and 38 deletions
|
|
@ -8,6 +8,9 @@ module PreviewService
|
||||||
GENERATION_TIMEOUT = 5.minutes
|
GENERATION_TIMEOUT = 5.minutes
|
||||||
LOCAL_STORAGE_PATH = Rails.root.join('storage', 'party-previews')
|
LOCAL_STORAGE_PATH = Rails.root.join('storage', 'party-previews')
|
||||||
|
|
||||||
|
PREVIEW_DEBOUNCE_PERIOD = 5.minutes
|
||||||
|
PREVIEW_EXPIRY = 30.days
|
||||||
|
|
||||||
# Public Interface - Core Operations
|
# Public Interface - Core Operations
|
||||||
|
|
||||||
# Initialize the party preview service
|
# Initialize the party preview service
|
||||||
|
|
@ -40,59 +43,59 @@ module PreviewService
|
||||||
return false unless should_generate?
|
return false unless should_generate?
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Rails.logger.info("Starting preview generation for party #{@party.id}")
|
Rails.logger.info("🖼️ Starting preview generation for party #{@party.id}")
|
||||||
|
|
||||||
# Update state to in_progress
|
Rails.logger.info("🖼️ Updating party state to in_progress")
|
||||||
@party.update!(preview_state: :in_progress)
|
@party.update!(preview_state: :in_progress)
|
||||||
set_generation_in_progress
|
set_generation_in_progress
|
||||||
|
|
||||||
Rails.logger.info("Checking ImageMagick installation...")
|
Rails.logger.info("🖼️ Checking ImageMagick installation...")
|
||||||
begin
|
begin
|
||||||
version = `convert -version`
|
version = `convert -version`
|
||||||
Rails.logger.info("ImageMagick version: #{version}")
|
Rails.logger.info("🖼️ ImageMagick version: #{version}")
|
||||||
rescue => e
|
rescue => e
|
||||||
Rails.logger.error("Failed to get ImageMagick version: #{e.message}")
|
Rails.logger.error("🖼️ Failed to get ImageMagick version: #{e.message}")
|
||||||
end
|
end
|
||||||
|
|
||||||
Rails.logger.info("Creating preview image...")
|
Rails.logger.info("🖼️ Creating preview image...")
|
||||||
begin
|
begin
|
||||||
image = create_preview_image
|
image = create_preview_image
|
||||||
Rails.logger.info("Preview image created successfully")
|
Rails.logger.info("🖼️ Preview image created successfully")
|
||||||
rescue => e
|
rescue => e
|
||||||
Rails.logger.error("Failed to create preview image: #{e.class} - #{e.message}")
|
Rails.logger.error("🖼️ Failed to create preview image: #{e.class} - #{e.message}")
|
||||||
Rails.logger.error(e.backtrace.join("\n"))
|
Rails.logger.error(e.backtrace.join("\n"))
|
||||||
raise e
|
raise e
|
||||||
end
|
end
|
||||||
|
|
||||||
Rails.logger.info("Saving preview...")
|
Rails.logger.info("🖼️ Saving preview...")
|
||||||
begin
|
begin
|
||||||
save_preview(image)
|
save_preview(image)
|
||||||
Rails.logger.info("Preview saved successfully")
|
Rails.logger.info("🖼️ Preview saved successfully")
|
||||||
rescue => e
|
rescue => e
|
||||||
Rails.logger.error("Failed to save preview: #{e.class} - #{e.message}")
|
Rails.logger.error("🖼️ Failed to save preview: #{e.class} - #{e.message}")
|
||||||
Rails.logger.error(e.backtrace.join("\n"))
|
Rails.logger.error(e.backtrace.join("\n"))
|
||||||
raise e
|
raise e
|
||||||
end
|
end
|
||||||
|
|
||||||
Rails.logger.info("Updating party state...")
|
Rails.logger.info("🖼️ Updating party state...")
|
||||||
@party.update!(
|
@party.update!(
|
||||||
preview_state: :generated,
|
preview_state: :generated,
|
||||||
preview_generated_at: Time.current
|
preview_generated_at: Time.current
|
||||||
)
|
)
|
||||||
Rails.logger.info("Party state updated successfully")
|
Rails.logger.info("🖼️ Party state updated successfully")
|
||||||
|
|
||||||
true
|
true
|
||||||
rescue => e
|
rescue => e
|
||||||
Rails.logger.error("Preview generation failed: #{e.class} - #{e.message}")
|
Rails.logger.error("🖼️ Preview generation failed: #{e.class} - #{e.message}")
|
||||||
Rails.logger.error("Stack trace:")
|
Rails.logger.error("🖼️ Stack trace:")
|
||||||
Rails.logger.error(e.backtrace.join("\n"))
|
Rails.logger.error(e.backtrace.join("\n"))
|
||||||
handle_preview_generation_error(e)
|
handle_preview_generation_error(e)
|
||||||
false
|
false
|
||||||
ensure
|
ensure
|
||||||
Rails.logger.info("Cleaning up resources...")
|
Rails.logger.info("🖼️ Cleaning up resources...")
|
||||||
@image_fetcher.cleanup
|
@image_fetcher.cleanup
|
||||||
clear_generation_in_progress
|
clear_generation_in_progress
|
||||||
Rails.logger.info("Cleanup completed")
|
Rails.logger.info("🖼️ Cleanup completed")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -128,32 +131,48 @@ module PreviewService
|
||||||
#
|
#
|
||||||
# @return [Boolean] True if a new preview should be generated, false otherwise
|
# @return [Boolean] True if a new preview should be generated, false otherwise
|
||||||
def should_generate?
|
def should_generate?
|
||||||
Rails.logger.info("Checking should_generate? conditions")
|
Rails.logger.info("🖼️ Checking should_generate? conditions")
|
||||||
|
|
||||||
if generation_in_progress?
|
unless @party.ready_for_preview?
|
||||||
Rails.logger.info("Generation already in progress, returning false")
|
Rails.logger.info("🖼️ Party not ready for preview (insufficient content)")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
Rails.logger.info("Preview state: #{@party.preview_state}")
|
if generation_in_progress?
|
||||||
# Add 'queued' to the list of valid states for generation
|
Rails.logger.info("🖼️ Generation already in progress, returning false")
|
||||||
if @party.preview_state.in?(['pending', 'failed', 'queued'])
|
return false
|
||||||
Rails.logger.info("Preview state is #{@party.preview_state}, returning true")
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if @party.preview_state == 'generated'
|
Rails.logger.info("🖼️ Preview state: #{@party.preview_state}")
|
||||||
if @party.preview_generated_at < PREVIEW_EXPIRY.ago
|
|
||||||
Rails.logger.info("Preview is older than expiry time, returning true")
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
Rails.logger.info("Preview is recent, returning false")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rails.logger.info("No conditions met, returning false")
|
case @party.preview_state
|
||||||
false
|
when 'pending'
|
||||||
|
Rails.logger.info("🖼️ State is pending, will generate")
|
||||||
|
true
|
||||||
|
when 'queued', 'in_progress'
|
||||||
|
Rails.logger.info("🖼️ State is #{@party.preview_state}, skipping generation")
|
||||||
|
false
|
||||||
|
when 'failed'
|
||||||
|
should_retry = @party.preview_generated_at.nil? ||
|
||||||
|
@party.preview_generated_at < PREVIEW_DEBOUNCE_PERIOD.ago
|
||||||
|
Rails.logger.info("🖼️ Failed state, should retry: #{should_retry}")
|
||||||
|
should_retry
|
||||||
|
when 'generated'
|
||||||
|
expired = @party.preview_expired?
|
||||||
|
changed = @party.preview_content_changed?
|
||||||
|
debounced = @party.preview_generated_at.nil? ||
|
||||||
|
@party.preview_generated_at < PREVIEW_DEBOUNCE_PERIOD.ago
|
||||||
|
|
||||||
|
should_regenerate = expired || (changed && debounced)
|
||||||
|
|
||||||
|
Rails.logger.info("🖼️ Generated state check - expired: #{expired}, content changed: #{changed}, debounced: #{debounced}")
|
||||||
|
Rails.logger.info("🖼️ Should regenerate: #{should_regenerate}")
|
||||||
|
|
||||||
|
should_regenerate
|
||||||
|
else
|
||||||
|
Rails.logger.info("🖼️ Unknown state, will generate")
|
||||||
|
true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Checks if a preview generation is currently in progress
|
# Checks if a preview generation is currently in progress
|
||||||
|
|
@ -480,6 +499,12 @@ module PreviewService
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.cleanup_stalled_jobs
|
||||||
|
Party.where(preview_state: :in_progress)
|
||||||
|
.where('updated_at < ?', 10.minutes.ago)
|
||||||
|
.update_all(preview_state: :pending)
|
||||||
|
end
|
||||||
|
|
||||||
# Deletes local preview files
|
# Deletes local preview files
|
||||||
#
|
#
|
||||||
# @return [void]
|
# @return [void]
|
||||||
|
|
@ -498,8 +523,12 @@ module PreviewService
|
||||||
def handle_preview_generation_error(error)
|
def handle_preview_generation_error(error)
|
||||||
Rails.logger.error("Preview generation failed for party #{@party.id}")
|
Rails.logger.error("Preview generation failed for party #{@party.id}")
|
||||||
Rails.logger.error("Error: #{error.class} - #{error.message}")
|
Rails.logger.error("Error: #{error.class} - #{error.message}")
|
||||||
Rails.logger.error("Backtrace:\n#{error.backtrace.join("\n")}")
|
Rails.logger.error(error.backtrace.join("\n"))
|
||||||
@party.update!(preview_state: :failed)
|
|
||||||
|
@party.update_columns(
|
||||||
|
preview_state: 'failed',
|
||||||
|
preview_generated_at: Time.current
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue