56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module ExternalAuthorization
 | 
						|
    class Access
 | 
						|
      attr_reader :user,
 | 
						|
                  :reason,
 | 
						|
                  :loaded_at,
 | 
						|
                  :label,
 | 
						|
                  :load_type
 | 
						|
 | 
						|
      def initialize(user, label)
 | 
						|
        @user, @label = user, label
 | 
						|
      end
 | 
						|
 | 
						|
      def loaded?
 | 
						|
        loaded_at && (loaded_at > ExternalAuthorization::Cache::VALIDITY_TIME.ago)
 | 
						|
      end
 | 
						|
 | 
						|
      def has_access?
 | 
						|
        @access
 | 
						|
      end
 | 
						|
 | 
						|
      def load!
 | 
						|
        load_from_cache
 | 
						|
        load_from_service unless loaded?
 | 
						|
        self
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      def load_from_cache
 | 
						|
        @load_type = :cache
 | 
						|
        @access, @reason, @loaded_at = cache.load
 | 
						|
      end
 | 
						|
 | 
						|
      def load_from_service
 | 
						|
        @load_type = :request
 | 
						|
        response = Client.new(@user, @label).request_access
 | 
						|
        @access = response.successful?
 | 
						|
        @reason = response.reason
 | 
						|
        @loaded_at = Time.now
 | 
						|
        cache.store(@access, @reason, @loaded_at) if response.valid?
 | 
						|
      rescue ::Gitlab::ExternalAuthorization::RequestFailed => e
 | 
						|
        @access = false
 | 
						|
        @reason = e.message
 | 
						|
        @loaded_at = Time.now
 | 
						|
      end
 | 
						|
 | 
						|
      def cache
 | 
						|
        @cache ||= ExternalAuthorization::Cache.new(@user, @label)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |