app/controllers/zuora_connect/static_controller.rb



module ZuoraConnect
  class StaticController < ApplicationController
    before_action :authenticate_connect_app_request, :except => [:health, :initialize_app, :provision, :instance_user]
    before_action :clear_connect_app_session,        :only =>   [:health, :initialize_app, :provision, :instance_user]
    after_action :persist_connect_app_session,       :except => [:health, :initialize_app, :provision, :instance_user]

    skip_before_action :verify_authenticity_token, :only => [:initialize_app, :provision]
    http_basic_authenticate_with name: ENV['PROVISION_USER'], password: ENV['PROVISION_SECRET'], :only => [:provision, :instance_user]


    def health
      if params[:error].present?
        begin
          raise ZuoraConnect::Exceptions::Error.new('This is an error')
        rescue => ex
          case params[:error]
          when 'Log'
            Rails.logger.error("Error in Health", ex)
          when 'Exception'
            raise
          end
        end
      end

      render json: {
        message: "Alive",
        status: 200
      }, status: 200
    end

    def initialize_app
      begin
        authenticate_connect_app_request
        unless performed?
          @appinstance.new_session(:session => @appinstance.data_lookup(:session => session))
          render json: {
            message: 'Success',
            status: 200
          }, status: 200
        end
      rescue => ex
        Rails.logger.error("Failed to Initialize application", ex)
        if performed?
          Rails.logger.error("Failed to Initialize application #{performed?}", ex)
        else
          render json: {
            message: "Failure initializing app instance",
            status: 500
          }, status: 500
        end
      end
    end

    def provision
      create_new_instance
      unless performed?
        render json: {
          status: 200,
          message: 'Success',
          app_instance_id: @appinstance.id
        }, status: 200
      end
    rescue StandardError => e
      message = 'Failed to provision new instance'
      if performed?
        Rails.logger.error("#{message}: #{performed?}", e)
      else
        Rails.logger.error(message, e)
        render json: {
          status: 500,
          message: message
        }, status: 500
      end
    end

    def instance_user
      ZuoraConnect::AppInstance.read_master_db do
        ZuoraConnect.logger.with_fields = {} if ZuoraConnect.logger.is_a?(Ougai::Logger)
        Rails.logger.with_fields = {} if Rails.logger.is_a?(Ougai::Logger)

        if defined?(ElasticAPM) && ElasticAPM.running? && ElasticAPM.respond_to?(:set_label)
          ElasticAPM.set_label(:trace_id, request.uuid)
        end

        unless params[:id].present?
          render json: {
            status: 400,
            message: 'No app instance id provided'
          }, status: :bad_request
          return
        end

        @appinstance = ZuoraConnect::AppInstance.find(params[:id]).new_session
      end

      zuora_client = @appinstance.send(ZuoraConnect::AppInstance::LOGIN_TENANT_DESTINATION).client
      client_describe, = zuora_client.rest_call(
        url: zuora_client.rest_endpoint('genesis/user/info').gsub('v1/', ''),
        session_type: zuora_client.class == ZuoraAPI::Oauth ? :bearer : :basic
      )

      render json: {
        status: 200,
        message: 'Success',
        user_id: client_describe['coreUserId'],
        username: client_describe['username'],
        email: client_describe['workEmail']
      }, status: 200
    rescue ActiveRecord::RecordNotFound
      render json: {
        status: 400,
        message: 'No app instance found'
      }, status: :bad_request
    rescue StandardError => e
      Rails.logger.error('Error occurred getting user details', e)
      render json: {
        status: 500,
        message: 'Failed to get user details'
      }, status: 500
    end

    private

    def clear_connect_app_session
      Thread.current[:appinstance] = nil
      request.session_options[:skip] = true
    end

  end
end