Files
grecia/app/controllers/legislation/annotations_controller.rb
Javi Martín 711e6c16eb Load annotations through the draft version
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.
2022-08-19 17:40:50 +02:00

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