Sha256: 878eb1ee7609309b1efe326c0d735a44679b55aca49c2a7dd9b1c85c3415c89c

Contents?: true

Size: 1.62 KB

Versions: 1

Compression:

Stored size: 1.62 KB

Contents

require "uri"
require "ostruct"
require "net/http"

module Ribose
  class Session
    def initialize(username, password)
      @username = username
      @password = password
    end

    def create
      authenticate_user
    rescue NoMethodError, JSON::ParserError
      raise Ribose::Unauthorized
    end

    def self.create(username:, password:)
      new(username, password).create
    end

    private

    attr_reader :username, :password

    def authenticate_user
      response = submit_user_login_request

      case response
      when Net::HTTPSuccess
        build_session_data(response.each_header.to_h)
      when Net::HTTPForbidden
        raise(Ribose::Unauthorized)
      end
    end

    def submit_user_login_request
      Net::HTTP.start(login_uri.host, login_uri.port, http_options) do |http|
        request = Net::HTTP::Post.new(login_uri)

        request["Content-Type"] = "application/json"
        request.set_form_data(username: username, password: password)

        http.request(request)
      end
    end

    def api_host
      api_host = Ribose.configuration.api_host

      unless api_host[/\Ahttp:\/\//] || api_host[/\Ahttps:\/\//]
        "https://#{api_host}"
      end
    end

    def login_uri
      @login_uri ||= URI.parse([api_host, "api/v2/auth/sign_in"].join("/"))
    end

    def http_options
      { use_ssl: true, verify_ssl: Ribose.configuration.ssl_verification_mode }
    end

    def build_session_data(headers)
      SessionData.new(headers.slice("uid", "expiry", "client", "access-token"))
    end
  end

  class SessionData < ::OpenStruct
    alias :read_attribute_for_serialization :send
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ribose-0.5.0 lib/ribose/session.rb