consul/consul

View on GitHub
app/controllers/legislation/annotations_controller.rb

Summary

Maintainability
A
2 hrs
Test Coverage
class Legislation::AnnotationsController < Legislation::BaseController
  skip_before_action :verify_authenticity_token

  before_action :authenticate_user!, only: [:create, :new_comment]
  before_action :convert_ranges_parameters, only: [:create]

  load_and_authorize_resource :process
  load_and_authorize_resource :draft_version, through: :process
  load_and_authorize_resource through: :draft_version

  has_orders %w[most_voted newest oldest], only: :show

  def index
  end

  def show
    @commentable = @annotation

    if params[:sub_annotation_ids].present?
      @sub_annotations = Legislation::Annotation.where(id: params[:sub_annotation_ids].split(","))
      annotations = [@commentable, @sub_annotations]
    else
      annotations = [@commentable]
    end

    @comment_tree = MergedCommentTree.new(annotations, params[:page], @current_order)
    set_comment_flags(@comment_tree.comments)
  end

  def create
    if !@process.allegations_phase.open? || @draft_version.final_version?
      render(json: {}, status: :not_found) && return
    end

    existing_annotation = @draft_version.annotations.find_by(
      range_start: annotation_params[:ranges].first[:start],
      range_start_offset: annotation_params[:ranges].first[:startOffset].to_i,
      range_end: annotation_params[:ranges].first[:end],
      range_end_offset: annotation_params[:ranges].first[:endOffset].to_i
    )

    @annotation = existing_annotation
    if @annotation.present?
      comment = @annotation.comments.build(body: annotation_params[:text], user: current_user)
      if comment.save
        render json: @annotation.to_json
      else
        render json: comment.errors.full_messages, status: :unprocessable_entity
      end
    else
      @annotation = @draft_version.annotations.new(annotation_params)
      @annotation.author = current_user
      if @annotation.save
        track_event
        render json: @annotation.to_json
      else
        render json: @annotation.errors.full_messages, status: :unprocessable_entity
      end
    end
  end

  def search
    @annotations = @annotations.order(Arel.sql("LENGTH(quote) DESC"))
    annotations_hash = { total: @annotations.size, rows: @annotations }
    render json: annotations_hash.to_json(methods: :weight)
  end

  def comments
    @annotation = @annotations.find(params[:annotation_id])
    @comment = @annotation.comments.new
  end

  def new
    respond_to do |format|
      format.js
    end
  end

  def new_comment
    @annotation = @annotations.find(params[:annotation_id])
    @comment = @annotation.comments.new(body: params[:comment][:body], user: current_user)
    if @comment.save
      @comment = @annotation.comments.new
    end

    respond_to do |format|
      format.js { render :new_comment }
    end
  end

  private

    def annotation_params
      params
        .require(:legislation_annotation)
        .permit(allowed_params)
    end

    def allowed_params
      [:quote, :text, ranges: [:start, :startOffset, :end, :endOffset]]
    end

    def track_event
      ahoy.track :legislation_annotation_created,
                 legislation_annotation_id: @annotation.id,
                 legislation_draft_version_id: @draft_version.id
    end

    def convert_ranges_parameters
      annotation = params[:legislation_annotation]
      if annotation && annotation[:ranges] && annotation[:ranges].is_a?(String)
        params[:legislation_annotation][:ranges] = JSON.parse(annotation[:ranges])
      end
    rescue JSON::ParserError
    end
end