# frozen_string_literal: true module Api module V1 class ConnectionsController < BaseController before_action :load_team before_action :load_project before_action :load_experiment before_action :load_connections before_action :load_connection, only: :show before_action :check_manage_permissions, except: %i(index show) def index @connections = @connections.page(params.dig(:page, :number)) .per(params.dig(:page, :size)) render jsonapi: @connections, each_serializer: ConnectionSerializer, include: include_params end def show render jsonapi: @connection, serializer: ConnectionSerializer, include: %i(to from) end def create connection = Connection.create!(connection_params) render jsonapi: connection, serializer: ConnectionSerializer, include: %i(to from) end def destroy @connection.destroy! render body: nil end private def load_connections @connections = Connection.joins( 'LEFT JOIN my_modules AS inputs ON input_id = inputs.id' ).joins( 'LEFT JOIN my_modules AS outputs ON output_id = outputs.id' ).where( 'inputs.experiment_id = ? OR outputs.experiment_id = ?', @experiment.id, @experiment.id ) end def load_connection @connection = @connections.find(params.require(:id)) end def connection_params raise TypeError unless params.require(:data).require(:type) == 'connections' params.require(:data).require(:attributes).permit(:input_id, :output_id) end def check_manage_permissions input_output_ids = [connection_params[:input_id], connection_params[:output_id]] unless can_manage_experiment?(@experiment) && (input_output_ids - @experiment.my_modules.pluck(:id)).empty? raise PermissionError.new(Connection, :create) end end def permitted_includes %w(to from) end end end end