class DataSourcesController < ApplicationController def index @data_sources = DataSource.where(app_id: params[:app_id]) end def create options = params[:options] # Fetch necessary access token if OAuth2 based data source if options.find { |option| option["key"]=="oauth2" } provider = 'google' service_class = "#{provider.capitalize}OauthService".constantize access_info = service_class.fetch_access_token(options.find { |option| option["key"] === 'code' } ["value"]) options.reject! { |option| option["key"] == "code" } access_info.each do |info| option = {} option["key"] = info[0] option["value"] = info[1] option["encrypted"] = true options << option end end options_to_save = {} options.each do |option| if option["encrypted"] credential = Credential.create(value: option["value"]) options_to_save[option["key"]] = { credential_id: credential.id, encrypted: option["encrypted"] } else options_to_save[option["key"]] = { value: option["value"], encrypted: option["encrypted"] } end end @data_source = DataSource.create( name: params[:name], kind: params[:kind], options: options_to_save, app_id: params[:app_id] ) end def update @data_source = DataSource.find params[:id] options = params[:options] options_to_save = {} options.each do |option| if option["encrypted"] credential = Credential.create(value: option["value"]) options_to_save[option["key"]] = { credential_id: credential.id, encrypted: option["encrypted"] } else options_to_save[option["key"]] = { value: option["value"], encrypted: option["encrypted"] } end end @data_source.update( name: params[:name], options: options_to_save ) end def test_connection service = DataSourceConnectionService.new params[:kind], params[:options] service.process render json: { status: 200 } rescue StandardError => error render json: { error: error }, status: 500 end def authorize_oauth2 data_source = DataSource.find params[:data_source_id] options = CredentialService.new.decrypt_options(data_source.options) access_token_url = options["access_token_url"] custom_params = options["custom_auth_params"].to_h response = HTTParty.post(access_token_url, :body => { :code => params[:code], :client_id => options["client_id"], :client_secret => options["client_secret"], :grant_type => options["grant_type"], :redirect_uri => "#{ENV.fetch("TOOLJET_HOST")}/oauth2/authorize", **custom_params }.to_json, :headers => { 'Content-Type' => 'application/json' } ) result = JSON.parse(response.body) access_token = result["access_token"] options = { access_token: access_token} DataSourceUserOauth2.create( user: current_user, data_source: data_source, options: options.to_json.to_s ) render json: { success: true } end def fetch_oauth2_base_url provider = params[:provider] service_class = "#{provider.capitalize}OauthService".constantize url = service_class.generate_base_auth_url render json: { url: url } end end