app/controllers/zuora_connect/static_controller.rb



module ZuoraConnect
  class StaticController < ApplicationController
    before_filter :authenticate_connect_app_request, :except => [:metrics, :health, :session_error, :invalid_app_instance_error, :launch, :switch, :initialize_app]
    after_filter :persist_connect_app_session,  :except => [:metrics, :health, :session_error, :invalid_app_instance_error, :initialize_app]
    skip_before_filter :verify_authenticity_token, :only => [:initialize_app]

    def session_error
      respond_to do |format|
        format.html
        format.json { render json: { message: "Session Error", status: 500 }, status: 500 }
      end
    end

    def invalid_app_instance_error
      respond_to do |format|
        format.html
        format.json {render json: { message: "Invalid App Instance", status: 500 }, status: 500 }
      end
    end

    def metrics
      type = params[:type].present? ? params[:type] : "versions"
      render json: ZuoraConnect::AppInstance.get_metrics(type).to_json, status: 200
    end

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

    def launch
      @ids = JSON.parse(Base64.decode64(URI.decode(params["ids"])))
      if @ids.count == 1
        redirect_to :action => :switch, :commit => @ids[0][0]
      else
        respond_to do |format|
          format.html
        end
      end
    end

    def switch
      host = request.headers["HTTP_X_FORWARDED_HOST"]
      zuora_client = ZuoraAPI::Login.new(url: "https://#{host}")
      menus = zuora_client.get_full_nav(cookies.to_h)["menus"]
      menus = JSON.parse(response)["menus"]
      app = menus.select do |item|
        matches = /(?<=.com\/)(.*?)(?=\/|$)/.match(item["url"])
        if !matches.blank?
          matches[0] == ENV["DEIS_APP"]
        end
      end
      url_tasks = JSON.parse(Base64.decode64(URI.decode(URI.parse(app[0]["url"]).query.split("ids=")[1])))
      if url_tasks.map { |i| i[0] }.include?(params["commit"].to_i)
        @appinstance = ZuoraConnect::AppInstance.find(params["commit"].to_i)
        @appinstance.new_session(session: {})
        @appinstance.cache_app_instance
        redirect_to main_app.root_path
      else
        redirect_to main_app.root_path
      end
    end

    def initialize_app
      begin
        authenticate_connect_app_request
        render json: {
          message: "Success",
          status: 200
        }, status: 200
      rescue
        render json: {
          message: "Failure initializing app instance",
          status: 400
        }, status: 400
      end
    end

  end
end