We were ignoring the draft version param when loading an annotation, which could result in a strange situation where we load an annotation and a draft version different than the one it belongs to. Thanks to this change, we can simplify the code a little bit. IMHO the `comments` and `new_comment` routes should have been added on member instead of on collection, which would further simplify the code. I'm leaving the routes untouched just in case changing the URL has side effects on existing installations.
117 lines
3.4 KiB
Ruby
117 lines
3.4 KiB
Ruby
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
|