mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-11-04 12:07:23 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
class MarvinJsAssetsController < ApplicationController
 | 
						|
  include MarvinJsActions
 | 
						|
  include ActiveStorage::SetCurrent
 | 
						|
 | 
						|
  before_action :load_vars, except: :create
 | 
						|
  before_action :load_create_vars, only: :create
 | 
						|
 | 
						|
  before_action :check_read_permission
 | 
						|
  before_action :check_edit_permission, only: %i(update create start_editing)
 | 
						|
 | 
						|
  def create
 | 
						|
    result = MarvinJsService.create_sketch(marvin_params, current_user, current_team)
 | 
						|
 | 
						|
    create_create_marvinjs_activity(result[:asset], current_user)
 | 
						|
 | 
						|
    if result[:asset] && marvin_params[:object_type] == 'Step'
 | 
						|
      render json: {
 | 
						|
        html: render_to_string(partial: 'assets/asset.html.erb', locals: {
 | 
						|
                                 asset: result[:asset],
 | 
						|
                                 gallery_view_id: marvin_params[:object_id]
 | 
						|
                               })
 | 
						|
      }
 | 
						|
    elsif result[:asset] && marvin_params[:object_type] == 'Result'
 | 
						|
      @my_module = result[:object].my_module
 | 
						|
      render json: {
 | 
						|
        html: render_to_string(
 | 
						|
          partial: 'my_modules/result.html.erb',
 | 
						|
            locals: { result: result[:object] }
 | 
						|
        )
 | 
						|
      }, status: :ok
 | 
						|
    elsif result[:asset]
 | 
						|
      render json: result[:asset]
 | 
						|
    else
 | 
						|
      render json: result[:asset].errors, status: :unprocessable_entity
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def update
 | 
						|
    asset = MarvinJsService.update_sketch(marvin_params, current_user, current_team)
 | 
						|
 | 
						|
    create_edit_marvinjs_activity(asset, current_user, :finish_editing)
 | 
						|
 | 
						|
    if asset
 | 
						|
      render json: { url: rails_representation_url(asset.medium_preview),
 | 
						|
                     id: asset.id,
 | 
						|
                     file_name: asset.blob.metadata['name'] }
 | 
						|
    else
 | 
						|
      render json: { error: t('marvinjs.no_sketches_found') }, status: :unprocessable_entity
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def start_editing
 | 
						|
    create_edit_marvinjs_activity(@asset, current_user, :start_editing)
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def load_vars
 | 
						|
    @asset = current_team.assets.find_by(id: params[:id])
 | 
						|
    return render_404 unless @asset
 | 
						|
 | 
						|
    @assoc ||= @asset.step
 | 
						|
    @assoc ||= @asset.result
 | 
						|
 | 
						|
    if @assoc.class == Step
 | 
						|
      @protocol = @assoc.protocol
 | 
						|
    elsif @assoc.class == Result
 | 
						|
      @my_module = @assoc.my_module
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def load_create_vars
 | 
						|
    @assoc = Step.find_by(id: marvin_params[:object_id]) if marvin_params[:object_type] == 'Step'
 | 
						|
    @assoc = MyModule.find_by(id: params[:object_id]) if marvin_params[:object_type] == 'Result'
 | 
						|
 | 
						|
    if @assoc.class == Step
 | 
						|
      @protocol = @assoc.protocol
 | 
						|
    elsif @assoc.class == MyModule
 | 
						|
      @my_module = @assoc
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def check_read_permission
 | 
						|
    if @assoc.class == Step
 | 
						|
      return render_403 unless can_read_protocol_in_module?(@protocol) ||
 | 
						|
                               can_read_protocol_in_repository?(@protocol)
 | 
						|
    elsif @assoc.class == Result || @assoc.class == MyModule
 | 
						|
      return render_403 unless can_read_experiment?(@my_module.experiment)
 | 
						|
    else
 | 
						|
      render_403
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def check_edit_permission
 | 
						|
    if @assoc.class == Step
 | 
						|
      return render_403 unless can_manage_step?(@assoc)
 | 
						|
    elsif @assoc.class == Result || @assoc.class == MyModule
 | 
						|
      return render_403 unless can_manage_my_module?(@my_module)
 | 
						|
    else
 | 
						|
      render_403
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def marvin_params
 | 
						|
    params.permit(:id, :description, :object_id, :object_type, :name, :image)
 | 
						|
  end
 | 
						|
end
 |