diff --git a/app/jobs/generate_party_preview_job.rb b/app/jobs/generate_party_preview_job.rb index 2d87f9b..b73a7f4 100644 --- a/app/jobs/generate_party_preview_job.rb +++ b/app/jobs/generate_party_preview_job.rb @@ -12,9 +12,7 @@ class GeneratePartyPreviewJob < ApplicationJob around_perform :track_timing def perform(party_id) - # Log start of job processing Rails.logger.info("Starting preview generation for party #{party_id}") - party = Party.find(party_id) if party.preview_state == 'generated' && @@ -26,7 +24,10 @@ class GeneratePartyPreviewJob < ApplicationJob 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}") @@ -36,9 +37,10 @@ class GeneratePartyPreviewJob < ApplicationJob end rescue => e Rails.logger.error("Error generating preview for party #{party_id}: #{e.message}") - Rails.logger.error(e.backtrace.join("\n")) + Rails.logger.error("Full error details:") + Rails.logger.error(e.full_message) # This will include the stack trace notify_failure(party, e) - raise # Allow retry mechanism to handle the error + raise end end diff --git a/app/services/preview_service/canvas.rb b/app/services/preview_service/canvas.rb index 95879fb..1477ec0 100644 --- a/app/services/preview_service/canvas.rb +++ b/app/services/preview_service/canvas.rb @@ -15,12 +15,24 @@ module PreviewService end def create_blank_canvas(width: PREVIEW_WIDTH, height: PREVIEW_HEIGHT, color: DEFAULT_BACKGROUND_COLOR) - temp_file = Tempfile.new(%w[canvas .png]) + Rails.logger.info("Checking ImageMagick installation...") + version = `convert -version` + Rails.logger.info("ImageMagick version: #{version}") - MiniMagick::Tool::Convert.new do |convert| - convert.size "#{width}x#{height}" - convert << "xc:#{color}" - convert << temp_file.path + temp_file = Tempfile.new(%w[canvas .png]) + Rails.logger.info("Created temp file: #{temp_file.path}") + + begin + MiniMagick::Tool::Convert.new do |convert| + convert.size "#{width}x#{height}" + convert << "xc:#{color}" + convert << temp_file.path + end + Rails.logger.info("Canvas created successfully") + rescue => e + Rails.logger.error("Failed to create canvas: #{e.message}") + Rails.logger.error(e.backtrace.join("\n")) + raise end temp_file diff --git a/app/services/preview_service/coordinator.rb b/app/services/preview_service/coordinator.rb index b6fb964..2fad8a6 100644 --- a/app/services/preview_service/coordinator.rb +++ b/app/services/preview_service/coordinator.rb @@ -41,22 +41,33 @@ module PreviewService Rails.logger.info("Starting preview generation for party #{@party.id}") set_generation_in_progress - # Generate the preview image + Rails.logger.info("Creating preview image...") image = create_preview_image - save_preview(image) + Rails.logger.info("Preview image created successfully") - # Update party state + Rails.logger.info("Saving preview...") + save_preview(image) + Rails.logger.info("Preview saved successfully") + + Rails.logger.info("Updating party state...") @party.update!( preview_state: :generated, preview_generated_at: Time.current ) + Rails.logger.info("Party state updated successfully") + true rescue => e + Rails.logger.error("Failed to generate preview: #{e.class} - #{e.message}") + Rails.logger.error("Stack trace:") + Rails.logger.error(e.backtrace.join("\n")) handle_preview_generation_error(e) false ensure + Rails.logger.info("Cleaning up resources...") @image_fetcher.cleanup clear_generation_in_progress + Rails.logger.info("Cleanup completed") end end @@ -99,28 +110,34 @@ module PreviewService # # @return [MiniMagick::Image] The generated preview image def create_preview_image - # Create blank canvas + Rails.logger.info("Creating blank canvas...") canvas = @canvas_service.create_blank_canvas image = MiniMagick::Image.new(canvas.path) + Rails.logger.info("Blank canvas created") - # Fetch job icon + Rails.logger.info("Processing job icon...") job_icon = nil if @party.job.present? + Rails.logger.info("Fetching job icon for job ID: #{@party.job.granblue_id}") job_icon = @image_fetcher.fetch_job_icon(@party.job.granblue_id) + Rails.logger.info("Job icon fetched successfully") if job_icon end - # Add party name with job icon + Rails.logger.info("Adding party name and job icon...") text_result = @canvas_service.add_text(image, @party.name, job_icon: job_icon, user: @party.user) image = text_result[:image] + Rails.logger.info("Party name and job icon added") - # Calculate grid layout + Rails.logger.info("Calculating grid layout...") grid_layout = @grid_service.calculate_layout( canvas_height: Canvas::PREVIEW_HEIGHT, title_bottom_y: text_result[:text_bottom_y] ) + Rails.logger.info("Grid layout calculated") - # Organize and draw weapons + Rails.logger.info("Drawing weapons...") image = organize_and_draw_weapons(image, grid_layout) + Rails.logger.info("Weapons drawn successfully") image end @@ -196,15 +213,22 @@ module PreviewService begin image.write(temp_file.path) + # Use timestamped filename similar to local storage + timestamp = Time.current.strftime('%Y%m%d%H%M%S') + key = "#{PREVIEW_FOLDER}/#{@party.shortcode}_#{timestamp}.png" + File.open(temp_file.path, 'rb') do |file| @aws_service.s3_client.put_object( - bucket: S3_BUCKET, - key: preview_key, + bucket: @aws_service.bucket, + key: key, body: file, content_type: 'image/png', acl: 'private' ) end + + # Optionally, store this key on the party record if needed for retrieval + @party.update!(preview_s3_key: key) ensure temp_file.close temp_file.unlink