add openai pdf upload support

This commit is contained in:
Tanmay Deep Sharma
2025-08-04 18:47:16 +05:30
parent 51b9fd8eca
commit 634782ea65
13 changed files with 693 additions and 5 deletions
@@ -12,4 +12,106 @@ module Enterprise::Api::V1::Accounts::PortalsController
verification_errors: ssl_settings['cf_verification_errors']
}
end
def upload_content
pdf_file = params[:pdf_file]
additional_context = params[:additional_context]
return render_error('PDF file is required', :bad_request) if pdf_file.blank?
return render_error('Invalid file type', :bad_request) unless pdf_file.content_type == 'application/pdf'
return render_error('File too large (max 512MB)', :bad_request) if pdf_file.size > 512.megabytes
# Find or create a Captain assistant for this portal
assistant = find_or_create_portal_assistant
# Create a document record with the PDF
document = assistant.documents.create!(
name: pdf_file.original_filename,
external_link: pdf_file.original_filename, # Use filename as external_link for uniqueness
account: Current.account
)
# Attach the PDF file
document.pdf_file.attach(pdf_file)
render json: {
success: true,
document: document.as_json(only: [:id, :name, :status, :created_at])
}, status: :created
rescue StandardError => e
Rails.logger.error "PDF upload error: #{e.message}"
render_error('Failed to upload PDF', :internal_server_error)
end
def generated_content
assistant = find_portal_assistant
return render_error('No assistant found for this portal', :not_found) unless assistant
responses = Captain::AssistantResponse.where(assistant: assistant)
.includes(:documentable)
.order(created_at: :desc)
render json: {
responses: responses.as_json(
include: {
documentable: { only: [:id, :name, :status], methods: [:pdf_document?] }
}
)
}
end
def publish_content
response_ids = params[:response_ids] || []
category_id = params[:category_id]
return render_error('No responses selected', :bad_request) if response_ids.empty?
assistant = find_portal_assistant
return render_error('No assistant found for this portal', :not_found) unless assistant
responses = assistant.responses.where(id: response_ids)
created_articles = []
responses.each do |response|
article = @portal.articles.create!(
title: response.question.truncate(255),
content: response.answer,
author: Current.user,
status: :draft,
category_id: category_id,
meta: {
source: 'pdf_generation',
assistant_response_id: response.id,
document_name: response.documentable&.name
}
)
created_articles << article
end
render json: {
success: true,
articles: created_articles.as_json(only: [:id, :title, :status, :created_at])
}, status: :created
rescue StandardError => e
Rails.logger.error "Content publishing error: #{e.message}"
render_error('Failed to publish content', :internal_server_error)
end
private
def find_or_create_portal_assistant
assistant_name = "Portal Assistant - #{@portal.name}"
Current.account.captain_assistants.find_or_create_by(name: assistant_name) do |assistant|
assistant.description = "AI assistant for generating content for the #{@portal.name} portal"
end
end
def find_portal_assistant
assistant_name = "Portal Assistant - #{@portal.name}"
Current.account.captain_assistants.find_by(name: assistant_name)
end
def render_error(message, status)
render json: { error: message }, status: status
end
end