Sha256: 61338bf686df2d94ff0410781ae2c71be24c43ce1528fae05a9fdadb7d63c7aa

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

require "ostruct"
require "json"
require "faraday"
require "redis"

require_relative "authz_jurnal_client/version"

module AuthzJurnalClient
  class Error < StandardError; end

  class UserRoles
    class << self
      attr_accessor :redis, :domain, :authorization, :expiry
      def config(opts = {})
        @headers = {"Authorization" => "#{opts[:authorization]}"}
        @domain = opts[:domain] || 'http://localhost:3000'
        redis_path = opts[:redis] || 'redis://localhost:6379'
        @redis = Redis.new(url: redis_path)
        @expiry = opts[:expiry] || 3600 * 5
      end

      def call(id, cid)
        if @redis
          cached = @redis.get(make_key(id, cid))
          return get_roles(cached) if cached
        end

        response = backend_request(id, cid)
        return unless response.success?

        @redis&.setex(make_key(id, cid), @expiry, response.body)
        get_roles(response.body)
      rescue Redis::CannotConnectError
        response = backend_request(id, cid)
        get_roles(response.body)
      end

      def backend_request(id, cid)
        conn = Faraday.new("#{@domain}/api/v1/users/#{id}") do |f|
          f.adapter :net_http
        end

        conn.get('roles', { company_id: cid }, @headers)
      end

      def make_key(id, cid)
        "manage_roles:#{id}-#{cid}"
      end

      def get_roles(j)
        res = JSON.parse(j)
        res['data']['roles'] if res['data'] && res['data']['roles']
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
authz_jurnal_client-0.0.4 lib/authz_jurnal_client.rb