# frozen_string_literal: true module Api module Service class StepsController < BaseController include Api::Service::ReorderValidation before_action :load_step before_action :validate_element_order, only: :reorder_elements def reorder_elements @step.with_lock do step_element_reorder_params.each do |order| # rubocop:disable Rails/SkipsModelValidations @step.step_orderable_elements.find(order['id']).update_column(:position, order['position']) # rubocop:enable Rails/SkipsModelValidations end @step.touch rescue StandardError head :bad_request end render json: @step.step_orderable_elements, each_serializer: Api::V1::StepOrderableElementSerializer end private def load_step @step = Step.find(params.require(:step_id)) raise PermissionError.new(Protocol, :manage) unless can_manage_protocol_in_module?(@step.protocol) end def step_element_reorder_params params.require(:step_element_order).map { |o| o.permit(:id, :position).to_h } end def validate_element_order unless reorder_params_valid?(@step.step_orderable_elements, step_element_reorder_params) render( json: { error: I18n.t('activerecord.errors.models.step.attributes.step_orderable_elements_order.invalid') }, status: :bad_request ) end end end end end