Sha256: 7ebff392978ede4199bb52274bcb4026d51e996d97e556aa20cbbee04a2797c5

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

module RailsConnector

class WorkspaceSelectionMiddleware

  def initialize(app)
    @app = app
  end

  def call(env)
    handler = WorkspaceParameterHandler.new(env)
    handler.handle_params
    set_current_workspace(handler.workspace_id)

    @app.call(env)
  end

  private

  class WorkspaceParameterHandler < Struct.new(:env)
    WS_KEYS = {
      current: '_rc-ws',
      compare: '_rc-compare-ws',
      base: '_rc-compare-base',
      reverse: '_rc-compare-reverse'
    }.freeze

    def handle_params
      if params_workspace_id.present?
        remember_compare_workspace_params
      elsif params_workspace_id == '' # empty param means "forget it"
        forget_compare_workspace_params
      end
    end

    def workspace_id
      session[WS_KEYS[:current]]
    end

    private

    def params_workspace_id
      params[WS_KEYS[:current]]
    end

    def remember_compare_workspace_params
      WS_KEYS.each do |_, value|
        session[value] = params[value]
      end
    end

    def forget_compare_workspace_params
      WS_KEYS.each do |_, value|
        session.delete(value)
      end
    end

    def params
      request.params
    end

    def request
      Rack::Request.new(env)
    end

    def session
      @session ||= env[Rack::Session::Abstract::ENV_SESSION_KEY]
    end

  end

  def set_current_workspace(workspace_id)
    Workspace.current = proc do
      if workspace_id
        begin
          Workspace.find(workspace_id)
        rescue RailsConnector::ResourceNotFound
          Workspace.default
        end
      else
        Workspace.default
      end
    end
  end

end

end # module RailsConnector

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
infopark_cloud_connector-7.1.0 lib/rails_connector/workspace_selection_middleware.rb