refactor: review changes
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user