mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-11-01 00:56:05 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			45 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Api
 | |
|   module Service
 | |
|     class ProtocolsController < BaseController
 | |
|       include Api::Service::ReorderValidation
 | |
| 
 | |
|       before_action :load_protocol
 | |
|       before_action :validate_step_order, only: :reorder_steps
 | |
| 
 | |
|       def reorder_steps
 | |
|         @protocol.with_lock do
 | |
|           step_reorder_params.each do |order|
 | |
|             # rubocop:disable Rails/SkipsModelValidations
 | |
|             @protocol.steps.find(order['id']).update_column(:position, order['position'])
 | |
|             # rubocop:enable Rails/SkipsModelValidations
 | |
|           end
 | |
|           @protocol.touch
 | |
|         rescue StandardError
 | |
|           head :bad_request
 | |
|         end
 | |
| 
 | |
|         render json: @protocol.steps, each_serializer: Api::V1::StepSerializer
 | |
|       end
 | |
| 
 | |
|       private
 | |
| 
 | |
|       def load_protocol
 | |
|         @protocol = Protocol.find(params.require(:protocol_id))
 | |
|         raise PermissionError.new(Protocol, :manage) unless can_manage_protocol_in_module?(@protocol)
 | |
|       end
 | |
| 
 | |
|       def step_reorder_params
 | |
|         params.require(:step_order).map { |o| o.permit(:id, :position).to_h }
 | |
|       end
 | |
| 
 | |
|       def validate_step_order
 | |
|         unless reorder_params_valid?(@protocol.steps, step_reorder_params)
 | |
|           render json: { error: I18n.t('activerecord.errors.models.protocol.attributes.step_order.invalid') },
 | |
|                  status: :bad_request
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |