diff --git a/app/controllers/api/doctrines_controller.rb b/app/controllers/api/doctrines_controller.rb index 016aa9b..2bfe43c 100644 --- a/app/controllers/api/doctrines_controller.rb +++ b/app/controllers/api/doctrines_controller.rb @@ -3,8 +3,7 @@ module Api class DoctrinesController < BaseController include DoctrineSearch - load_and_authorize_resource :doctrine, class: "Doctrine", only: %i[show] - authorize_resource :doctrine, class: "Doctrine", only: %i[index] + load_and_authorize_resource :doctrine, class: "Doctrine" def index search = doctrine_search(search_params) @@ -18,8 +17,46 @@ module Api respond_with @doctrine end + def create + attrs = resource_params.to_unsafe_h.deep_symbolize_keys + subject_ids = attrs.delete(:subject_ids) + + @doctrine = Doctrine.new(attrs) + + if @doctrine.save + @doctrine.subject_ids = subject_ids if subject_ids.present? + + respond_with @doctrine + else + render errors: @doctrine.errors, status: 422 + end + end + + def update + attrs = resource_params.to_unsafe_h.deep_symbolize_keys + subject_ids = attrs.delete(:subject_ids) + + if @doctrine.update(attrs) + @doctrine.subject_ids = subject_ids if subject_ids.present? + + respond_with @doctrine + else + render errors: @doctrine.errors, status: 422 + end + end + + def destroy + @doctrine.destroy + + respond_with @doctrine + end + private + def resource_params + params.permit(:content, jurisprudence_ids: [], subject_ids: []) + end + def search_params params.permit(:created_at, :q, :page, :per_page, exclude_ids: [], subject_ids: [], user_ids: []) diff --git a/app/controllers/api/jurisprudence/doctrines_controller.rb b/app/controllers/api/jurisprudence/doctrines_controller.rb index d8b8532..7da8951 100644 --- a/app/controllers/api/jurisprudence/doctrines_controller.rb +++ b/app/controllers/api/jurisprudence/doctrines_controller.rb @@ -11,46 +11,6 @@ module Api def show respond_with @doctrine end - - def create - attrs = resource_params.to_unsafe_h.deep_symbolize_keys - subject_ids = attrs.delete(:subject_ids) - - @doctrine = @jurisprudence.doctrines.new(attrs) - - if @doctrine.save - @doctrine.subject_ids = subject_ids if subject_ids.present? - - respond_with @doctrine - else - render errors: @doctrine.errors, status: 422 - end - end - - def update - attrs = resource_params.to_unsafe_h.deep_symbolize_keys - subject_ids = attrs.delete(:subject_ids) - - if @doctrine.update(attrs) - @doctrine.subject_ids = subject_ids if subject_ids.present? - - respond_with @doctrine - else - render errors: @doctrine.errors, status: 422 - end - end - - def destroy - @doctrine.destroy - - respond_with @doctrine - end - - private - - def resource_params - params.permit(:content, subject_ids: []) - end end end end diff --git a/app/controllers/doctrines_controller.rb b/app/controllers/doctrines_controller.rb index b943d91..8003523 100644 --- a/app/controllers/doctrines_controller.rb +++ b/app/controllers/doctrines_controller.rb @@ -23,9 +23,47 @@ class DoctrinesController < ApplicationController def show; end + def create + attrs = resource_params.to_unsafe_h.deep_symbolize_keys + subject_ids = attrs.delete(:subject_ids) + + @doctrine = Doctrine.new(attrs) + + if @doctrine.save + @doctrine.subject_ids = subject_ids if subject_ids.present? + + respond_with @doctrine + else + render errors: @doctrine.errors, status: 422 + end + end + + def update + attrs = resource_params.to_unsafe_h.deep_symbolize_keys + subject_ids = attrs.delete(:subject_ids) + + if @doctrine.update(attrs) + @doctrine.subject_ids = subject_ids if subject_ids.present? + + respond_with @doctrine + else + render errors: @doctrine.errors, status: 422 + end + end + + def destroy + @doctrine.destroy + + respond_with @doctrine + end + private + + def resource_params + params.permit(:content, jurisprudence_ids: [], subject_ids: []) + end def search_params - params.permit(subject_ids: []) + params.permit(jurisprudence_ids: [], subject_ids: []) end end \ No newline at end of file diff --git a/app/controllers/jurisprudence/doctrines_controller.rb b/app/controllers/jurisprudence/doctrines_controller.rb deleted file mode 100644 index 52314c6..0000000 --- a/app/controllers/jurisprudence/doctrines_controller.rb +++ /dev/null @@ -1,52 +0,0 @@ -class Jurisprudence::DoctrinesController < ApplicationController - load_and_authorize_resource :jurisprudence, class: "Cdao::Jurisprudence" - load_and_authorize_resource :doctrine, class: "Doctrine", through: :jurisprudence - - def create - attrs = resource_params.to_unsafe_h.deep_symbolize_keys - subject_ids = attrs.delete(:subject_ids) - - @doctrine = @jurisprudence.doctrines.new(attrs) - - respond_to do |format| - if @doctrine.save - @doctrine.subject_ids = subject_ids if subject_ids.present? - - format.html { redirect_to document_doctrine_path(@jurisprudence, @doctrine), notice: "Doctrine was successfully created." } - else - format.html { redirect_to document_doctrine_path(@jurisprudence) } - end - end - end - - def update - attrs = resource_params.to_unsafe_h.deep_symbolize_keys - subject_ids = attrs.delete(:subject_ids) - - respond_to do |format| - if @doctrine.update(attrs) - @doctrine.subject_ids = subject_ids if subject_ids.present? - - format.html { redirect_to document_doctrine_path(@jurisprudence, @doctrine), notice: "Doctrine was successfully updated." } - else - format.html { redirect_to document_doctrine_path(@jurisprudence) } - end - end - end - - def destroy - respond_to do |format| - if @doctrine.destroy - format.html { redirect_to document_path(@jurisprudence), notice: "Doctrine was successfully destroyed." } - else - format.html { redirect_to document_path(@jurisprudence), alert: @doctrine.errors.full_messages } - end - end - end - - private - - def resource_params - params.permit(:content, subject_ids: []) - end -end diff --git a/app/models/cdao/jurisprudence.rb b/app/models/cdao/jurisprudence.rb index c899c3d..152e307 100644 --- a/app/models/cdao/jurisprudence.rb +++ b/app/models/cdao/jurisprudence.rb @@ -3,7 +3,8 @@ class Cdao::Jurisprudence < Cdao::Base has_many :annotations, as: :document, dependent: :restrict_with_error - has_many :doctrines, as: :document, dependent: :restrict_with_error + has_many :doctrine_jurisprudences, dependent: :destroy + has_many :doctrines, through: :doctrine_jurisprudences has_many :annotation_documents, as: :document, dependent: :restrict_with_error has_many :annotations_as_cited, through: :annotation_documents, source: :annotation diff --git a/app/models/doctrine.rb b/app/models/doctrine.rb index c19ef57..c0e4296 100644 --- a/app/models/doctrine.rb +++ b/app/models/doctrine.rb @@ -1,6 +1,9 @@ class Doctrine < ApplicationRecord belongs_to :document, polymorphic: true, optional: false + has_many :doctrine_jurisprudences, dependent: :destroy + has_many :jurisprudences, through: :doctrine_jurisprudences + has_many :doctrine_subjects, dependent: :destroy has_many :subjects, through: :doctrine_subjects diff --git a/app/models/doctrine_jurisprudence.rb b/app/models/doctrine_jurisprudence.rb new file mode 100644 index 0000000..d2749b6 --- /dev/null +++ b/app/models/doctrine_jurisprudence.rb @@ -0,0 +1,6 @@ +class DoctrineJurisprudence < ApplicationRecord + acts_as_list column: :rank, scope: %i[doctrine_id] + + belongs_to :doctrine, optional: false + belongs_to :jurisprudence, class_name: "Cdao::Jurisprudence", optional: false +end diff --git a/config/routes.rb b/config/routes.rb index 193a577..6d08589 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,12 +10,6 @@ Rails.application.routes.draw do end end - resources :jurisprudences, only: [] do - scope module: :jurisprudence do - resources :doctrines, only: %i[create update destroy] - end - end - resources :documents, only: %i[index show] do get :search, on: :collection @@ -48,7 +42,7 @@ Rails.application.routes.draw do scope module: :jurisprudence do resources :cited_ins, only: %i[index show] resources :cross_references, only: %i[index show] - resources :doctrines + resources :doctrines, only: %i[index show] end end end diff --git a/db/migrate/20220215021520_create_doctrine_jurisprudences.rb b/db/migrate/20220215021520_create_doctrine_jurisprudences.rb new file mode 100644 index 0000000..ff48b2b --- /dev/null +++ b/db/migrate/20220215021520_create_doctrine_jurisprudences.rb @@ -0,0 +1,15 @@ +class CreateDoctrineJurisprudences < ActiveRecord::Migration[6.1] + def change + create_table :doctrine_jurisprudences do |t| + t.references :doctrine, null: false + t.references :jurisprudence, null: false + t.integer :rank, null: false, default: 1 + + t.timestamps + end + + add_index :doctrine_jurisprudences, %i[doctrine_id jurisprudence_id], + name: "index_doctrine_jurisprudences_uniqueness", + unique: true + end +end diff --git a/db/seeds.rb b/db/seeds.rb index 534fdb4..1702114 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -54,3 +54,10 @@ Cdao::Subject.find_each.with_index do |subject, index| annotation_document.document = Cdao::Jurisprudence.last(index + 101).first annotation_document.save end + +Doctrine.find_each do |doctrine| + doc = doctrine.document + ids = doc.doctrine_ids + ids << doctrine.id + doc.doctrine_ids = ids.uniq +end