refactor: review changes

This commit is contained in:
Tanmay Deep Sharma
2025-07-03 13:57:38 +05:30
parent 5762d1dd50
commit 250d9d4dee
4 changed files with 56 additions and 21 deletions
@@ -52,12 +52,15 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
def message_content(message)
return message.content if message.content.present?
handle_message_without_content(message)
end
def handle_message_without_content(message)
return 'User has shared a message without content' unless message.attachments.any?
audio_transcriptions = extract_audio_transcriptions(message.attachments)
return audio_transcriptions if audio_transcriptions.present?
'User has shared an attachment'
audio_transcriptions.presence || 'User has shared an attachment'
end
def extract_audio_transcriptions(attachments)
@@ -4,23 +4,33 @@ class Captain::Documents::PdfExtractionJob < ApplicationJob
def perform(document)
return unless document.pdf_document?
document.update(status: 'in_progress')
pdf_source = document.file.attached? ? document.file : document.external_link
pdf_extraction_service = Captain::Tools::PdfExtractionService.new(pdf_source)
result = pdf_extraction_service.perform
if result[:success] && result[:content].present?
process_pdf_content_chunks(document, result[:content])
else
handle_pdf_extraction_failure(document, result)
end
initialize_document_processing(document)
result = extract_pdf_content(document)
process_extraction_result(document, result)
rescue Captain::Tools::PdfExtractionService::ExtractionError => e
handle_pdf_extraction_error(document, e)
end
private
def initialize_document_processing(document)
document.update(status: 'in_progress')
end
def extract_pdf_content(document)
pdf_source = document.file.attached? ? document.file : document.external_link
pdf_extraction_service = Captain::Tools::PdfExtractionService.new(pdf_source)
pdf_extraction_service.perform
end
def process_extraction_result(document, result)
if result[:success] && result[:content].present?
process_pdf_content_chunks(document, result[:content])
else
handle_pdf_extraction_failure(document, result)
end
end
def process_pdf_content_chunks(document, content_chunks)
Rails.logger.info "PDF extraction successful for document #{document.id}: #{content_chunks.length} chunks will be processed"
@@ -3,12 +3,10 @@ class Captain::Tools::PdfExtractionParserJob < ApplicationJob
def perform(assistant_id:, pdf_content:, document_id: nil)
assistant = Captain::Assistant.find(assistant_id)
content = pdf_content[:content]
return if content.blank? || limit_exceeded?(assistant.account)
return unless should_process_content?(pdf_content[:content], assistant.account)
document = create_document(assistant, pdf_content, document_id)
Captain::Documents::ResponseBuilderJob.perform_later(document) if document
enqueue_response_builder_job(document)
rescue ActiveRecord::RecordNotFound => e
Rails.logger.error "PDF parser job failed - Assistant not found: #{e.message}"
rescue ActiveRecord::RecordInvalid => e
@@ -69,6 +67,14 @@ class Captain::Tools::PdfExtractionParserJob < ApplicationJob
end
end
def should_process_content?(content, account)
content.present? && !limit_exceeded?(account)
end
def enqueue_response_builder_job(document)
Captain::Documents::ResponseBuilderJob.perform_later(document) if document
end
def limit_exceeded?(account)
limits = account.usage_limits.dig(:captain, :documents)
limits && limits[:current_available].to_i <= 0
@@ -20,13 +20,29 @@ module Captain::Tools::PdfValidationConcern
end
def validate_url_format
uri = URI.parse(pdf_source)
raise StandardError, 'Invalid URL scheme' unless %w[http https].include?(uri.scheme)
raise StandardError, 'URL too long' if pdf_source.length > 2000
uri = parse_and_validate_uri
validate_url_scheme(uri)
validate_url_length
end
def parse_and_validate_uri
URI.parse(pdf_source)
rescue URI::InvalidURIError
raise StandardError, 'Malformed URL'
end
def validate_url_scheme(uri)
return if %w[http https].include?(uri.scheme)
raise StandardError, 'Invalid URL scheme'
end
def validate_url_length
return if pdf_source.length <= 2000
raise StandardError, 'URL too long'
end
def validate_file_type_and_size
raise StandardError, 'Invalid file type' unless pdf_source.content_type == 'application/pdf'
raise StandardError, 'File too large' if pdf_source.size > 25.megabytes