diff --git a/config/routes.rb b/config/routes.rb index 0c2c7804e..495755039 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -170,16 +170,36 @@ Rails.application.routes.draw do end end resources :labels, only: [:index, :show, :create, :update, :destroy] - resources :response_sources, only: [:create] do + resources :response_sources do collection do post :parse end member do post :add_document post :remove_document + get :search + post :chat + post :copilot + post :ingest_content end end + resources :response_documents do + collection do + post :bulk_create + get :search + end + member do + get :responses + end + end + resources :responses do + collection do + get :search + end + end + end + resources :notifications, only: [:index, :update, :destroy] do collection do post :read_all diff --git a/enterprise/app/controllers/api/v1/accounts/response_documents_controller.rb b/enterprise/app/controllers/api/v1/accounts/response_documents_controller.rb new file mode 100644 index 000000000..df63a5892 --- /dev/null +++ b/enterprise/app/controllers/api/v1/accounts/response_documents_controller.rb @@ -0,0 +1,75 @@ +class Api::V1::Accounts::ResponseSourcesController < Api::V1::Accounts::BaseController + before_action :current_account + before_action :check_authorization + before_action :find_document, except: [:index, :create, :bulk_create, :search] + before_action :set_current_page, only: [:index, :search] + + RESULTS_PER_PAGE = 25 + + def index + @documents = account.response_documents.page(@current_page).per(RESULTS_PER_PAGE).order(created_at: :desc) + @documents_count = account.response_documents.count + end + + def search + documents = account.response_documents.where('external_link ILIKE :query', query: "%#{params[:query]}%") + @documents = documents.page(@current_page).per(RESULTS_PER_PAGE) if documents.present? + @documents_count = documents.count + end + + def show + render json: @document + end + + def create + document = account.response_documents.new(document_params) + if document.save + render json: document, status: :created + else + render json: { errors: document.errors.full_messages }, status: :unprocessable_entity + end + end + + def bulk_create + documents = params[:external_links].map do |doc_params| + account.response_documents.new(doc_params.permit(:name, :external_link).merge(assistant_id: params[:assistant_id])) + end + + documents.each do |document| + render json: { errors: document.errors.full_messages }, status: :unprocessable_entity and return unless document.save + end + + render json: documents, status: :created + end + + def update + if @document.update(document_params.except(:assistant_id, :external_link)) + render json: @document + else + render json: { errors: @document.errors.full_messages }, status: :unprocessable_entity + end + end + + def destroy + @document.destroy + head :no_content + end + + def responses + render json: @document.responses + end + + private + + def find_document + @document = account.response_documents.find(params[:id]) + end + + def document_params + params.require(:document).permit(:name, :content, :external_link, :assistant_id, external_links: [:name, :external_link]) + end + + def set_current_page + @current_page = params[:page] || 1 + end +end diff --git a/enterprise/app/controllers/api/v1/accounts/responses_controller.rb b/enterprise/app/controllers/api/v1/accounts/responses_controller.rb new file mode 100644 index 000000000..365d43252 --- /dev/null +++ b/enterprise/app/controllers/api/v1/accounts/responses_controller.rb @@ -0,0 +1,59 @@ +class Api::V1::Accounts::ResponsesController < Api::V1::Accounts::BaseController + before_action :current_account + before_action :check_authorization + before_action :find_response, only: [:show, :update, :destroy] + before_action :set_current_page, only: [:index, :search] + + RESULTS_PER_PAGE = 25 + + def index + @responses = account.responses.page(@current_page).per(RESULTS_PER_PAGE).order(created_at: :desc) + @responses_count = account.responses.count + end + + def search + responses = account.responses.where('question ILIKE :query OR answer ILIKE :query', query: "%#{params[:query]}%") + @responses = responses.page(@current_page).per(RESULTS_PER_PAGE) if responses.present? + @responses_count = responses.count + end + + def show + render json: @response + end + + def create + response = account.responses.new(response_params) + if response.save + render json: response, status: :created + else + render json: { errors: response.errors.full_messages }, status: :unprocessable_entity + end + end + + def update + if @response.update(response_params) + render json: @response + else + render json: { errors: @response.errors.full_messages }, status: :unprocessable_entity + end + end + + def destroy + @response.destroy + head :no_content + end + + private + + def response_params + params.require(:response).permit(:question, :answer, :document_id, :assistant_id) + end + + def find_response + @response = account.responses.find(params[:id]) + end + + def set_current_page + @current_page = params[:page] || 1 + end +end