diff --git a/app/controllers/api/documents_controller.rb b/app/controllers/api/documents_controller.rb new file mode 100644 index 0000000..ea5a377 --- /dev/null +++ b/app/controllers/api/documents_controller.rb @@ -0,0 +1,45 @@ +module Api + class DocumentsController < BaseController + load_and_authorize_resource :document, class: "Cdao::Document", only: %i[show] + authorize_resource :document, class: "Cdao::Document", only: %i[index] + + def index + search = document_search(search_params) + + @documents = search.results + + respond_with @documents + end + + def show + respond_with @document + end + + private + + def document_search(search_params) + fulltext_fields = %i[reference_number title short_title].freeze + + search = Cdao::Document.search do + fulltext search_params[:q], fields: fulltext_fields if search_params[:q].present? + + fulltext_fields.each do |field| + fulltext search_params[field], fields: [field] if search_params[field].present? + end + + with(:year, search_params[:year].to_i) if search_params[:year].present? + + order_by :doc_date, :desc + order_by :year, :desc + + paginate page: search_params[:page] || 1, per_page: search_params[:per_page] || 20 + end + + search + end + + def search_params + params.permit(:reference_number, :title, :short_title, :year, :q, :page, :per_page) + end + end +end diff --git a/app/models/cdao/document.rb b/app/models/cdao/document.rb new file mode 100644 index 0000000..315581e --- /dev/null +++ b/app/models/cdao/document.rb @@ -0,0 +1,50 @@ +class Cdao::Document < Cdao::Base + self.table_name = "documents" + + alias_attribute :docdate, :doc_date + alias_attribute :short_title, :title + + def year + doc_date.present? ? doc_date.year : 0 + end + + def clean_reference_number + (reference_number.presence || "").gsub(//, "") + end + + def to_builder(ability = nil) + Jbuilder.new do |doc| + doc.(self, *%i[id title short_title]) + doc.doc_date doc_date.presence || "0000-00-00" + doc.year year.presence || 0 + doc.reference_number clean_reference_number + doc.display_reference_number clean_reference_number.presence || short_title.presence || title + doc.url Rails.application.routes.url_helpers.document_path(self) + end + end + + searchable do + text :reference_number, stored: true + text :title, stored: true + text :short_title, stored: true + + string :reference_number + string :title do + (title.present? ? title.first(32760).strip : short_title).titleize + end + string :short_title do + (short_title.presence || title.first(32760).strip).titleize + end + + date :doc_date + date :search_doc_date do + doc_date.presence || Date.new(year.presence || 0) + end + + integer :id + integer :year + integer :search_year do + year.present? && year > 0 ? year : (doc_date.try :year) + end + end +end diff --git a/app/models/cdao/jurisprudence.rb b/app/models/cdao/jurisprudence.rb index 34793b7..294b7a5 100644 --- a/app/models/cdao/jurisprudence.rb +++ b/app/models/cdao/jurisprudence.rb @@ -58,7 +58,7 @@ class Cdao::Jurisprudence < Cdao::Base doc.year year.presence || 0 doc.reference_number clean_reference_number doc.display_reference_number clean_reference_number.presence || short_title.presence || title - doc.url Rails.application.routes.url_helpers.document_path(self) + doc.url Rails.application.routes.url_helpers.jurisprudence_path(self) end end diff --git a/app/views/api/documents/index.json.jbuilder b/app/views/api/documents/index.json.jbuilder new file mode 100644 index 0000000..f438ec5 --- /dev/null +++ b/app/views/api/documents/index.json.jbuilder @@ -0,0 +1,3 @@ +json.array!(@documents) do |document| + json.extract! document, *%i[id reference_number title short_title doc_date year] +end diff --git a/app/views/api/documents/show.json.jbuilder b/app/views/api/documents/show.json.jbuilder new file mode 100644 index 0000000..196f2a4 --- /dev/null +++ b/app/views/api/documents/show.json.jbuilder @@ -0,0 +1 @@ +json.(@document, *%i[id reference_number title short_title doc_date year]) diff --git a/config/routes.rb b/config/routes.rb index 6e71dc1..baf4df1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -34,6 +34,8 @@ Rails.application.routes.draw do namespace :api, defaults: { format: :json } do resources :doctrines, only: %i[index show] + resources :documents, only: %i[index show] + resources :jurisprudences, only: %i[index show] do get :years, on: :collection