mysociety/alaveteli

View on GitHub
app/models/alaveteli_pro/request_summary.rb

Summary

Maintainability
A
0 mins
Test Coverage
# == Schema Information
# Schema version: 20210114161442
#
# Table name: request_summaries
#
#  id                 :integer          not null, primary key
#  title              :text
#  body               :text
#  public_body_names  :text
#  summarisable_type  :string           not null
#  summarisable_id    :integer          not null
#  created_at         :datetime         not null
#  updated_at         :datetime         not null
#  user_id            :integer
#  request_created_at :datetime         not null
#  request_updated_at :datetime         not null
#

class AlaveteliPro::RequestSummary < ApplicationRecord
  belongs_to :summarisable, polymorphic: true
  belongs_to :user,
             inverse_of: :request_summaries
  has_and_belongs_to_many :request_summary_categories,
                          class_name: "AlaveteliPro::RequestSummaryCategory",
                          inverse_of: :request_summaries

  validates_presence_of :summarisable,
                        :request_created_at,
                        :request_updated_at
  validates_uniqueness_of :summarisable_id, scope: :summarisable_type

  ALLOWED_REQUEST_CLASSES = ["InfoRequest",
                             "DraftInfoRequest",
                             "InfoRequestBatch",
                             "AlaveteliPro::DraftInfoRequestBatch"].freeze

  def self.category(category_slug)
    includes(:request_summary_categories).
      where("request_summary_categories.slug = ?", category_slug.to_s).
        references(:request_summary_categories)
  end

  def self.not_category(category_slug)
    summary_ids_to_exclude = category(category_slug).pluck(:id)
    results = includes(:request_summary_categories)
    unless summary_ids_to_exclude.blank?
      results = results.
        where("request_summaries.id NOT IN (?)", summary_ids_to_exclude)
    end
    results
  end

  def self.create_or_update_from(request)
    unless ALLOWED_REQUEST_CLASSES.include?(request.class.name)
      raise ArgumentError, "Can't create a RequestSummary from " \
                              "#{request.class.name} instances. Only " \
                              "#{ALLOWED_REQUEST_CLASSES} are allowed."
    end
    request.reload
    if request.request_summary
      request.request_summary.update_from(request)
      request.request_summary
    else
      create_from(request)
    end
  end

  def update_from(request)
    update(self.class.attributes_from_request(request))
  end

  def self.create_from(request)
    create(attributes_from_request(request))
  end

  def self.attributes_from_request(request)
    {
      title: request.title,
      body: request.request_summary_body,
      public_body_names: request.request_summary_public_body_names,
      summarisable: request,
      user: request.user,
      request_summary_categories: request.request_summary_categories,
      request_created_at: request.created_at,
      request_updated_at: request.updated_at
    }
  end
end