diff --git a/lib/docurest.rb b/lib/docurest.rb index ea1b88c..00bfb63 100644 --- a/lib/docurest.rb +++ b/lib/docurest.rb @@ -1,5 +1,31 @@ require "docurest/version" +require "docurest/field" + +require "docurest/client" +require "docurest/client/oauth" +require "docurest/client/password" + +require "docurest/base" + +require "docurest/envelope" +require "docurest/envelope/document" +require "docurest/envelope/recipient" +require "docurest/envelope/recipient/tab" + +require "docurest/login" + module Docurest - # Your code goes here... + class << self + attr_accessor :client + + def with_client(other_client) + old_client = @client + @client = other_client + + yield if block_given? + ensure + @client = old_client + end + end end diff --git a/lib/docurest/client.rb b/lib/docurest/client.rb new file mode 100644 index 0000000..d335942 --- /dev/null +++ b/lib/docurest/client.rb @@ -0,0 +1,86 @@ +require "json" +require "net/http" + +module Docurest + class Client + def initialize(account_id: nil, base_url: nil, env: :test) + @account_id = account_id + @base_url = base_url + @env = env + end + + def delete(url, body, use_base_url: true, parse_json: true) + request = Net::HTTP::Delete.new build_uri(url, use_base_url), + {'Content-Type' => 'application/json'} + request.body = JSON.generate(body) + query request, parse_json: parse_json + end + + def get(url, request_query = {}, use_base_url: true, parse_json: true) + uri = build_uri(url, use_base_url) + uri.query = URI.encode_www_form(request_query) + + request = Net::HTTP::Get.new uri + query request, parse_json: parse_json + end + + def post(url, body, use_base_url: true, parse_json: true) + request = Net::HTTP::Post.new build_uri(url, use_base_url), + {'Content-Type' => 'application/json'} + request.body = JSON.generate(body) + query request, parse_json: parse_json + end + + def put(url, body, use_base_url: true, parse_json: true) + request = Net::HTTP::Put.new build_uri(url, use_base_url), + {'Content-Type' => 'application/json'} + request.body = JSON.generate(body) + query request, parse_json: parse_json + end + + def query(request, parse_json:) + add_authentication_header request + + res = Net::HTTP.start(request.uri.hostname, request.uri.port, use_ssl: request.uri.scheme == 'https') do |http| + http.request request + end + + if parse_json + JSON.parse res.body + else + res.body + end + end + + private + + def add_authentication_header(request) + end + + def base_url + @base_url ||= begin + account = Docurest::Login.information[:accounts].detect do |acc| + (@account_id && (acc.id == @account_id || acc.guid == @account_id)) || acc.default + end + if account + @account_id = account.id + "#{account.url}" + else + api_url + end + end + end + + def api_url + if @env == :production + "https://www.docusign.net/restapi/#{API_VERSION}" + else + "https://demo.docusign.net/restapi/#{API_VERSION}" + end + end + + def build_uri(url, use_base_url = true) + URI("#{use_base_url ? base_url : api_url}#{url}") + end + end +end diff --git a/lib/docurest/client/oauth.rb b/lib/docurest/client/oauth.rb new file mode 100644 index 0000000..877081f --- /dev/null +++ b/lib/docurest/client/oauth.rb @@ -0,0 +1,16 @@ +module Docurest + class Client::Oauth < Docurest::Client + AUTHENTICATION_HEADER = 'Authorization' + + def initialize(access_token, **options) + super options + @access_token = access_token + end + + private + + def add_authentication_header(request) + request[AUTHENTICATION_HEADER] = "bearer#{@access_token}" if @access_token + end + end +end diff --git a/lib/docurest/client/password.rb b/lib/docurest/client/password.rb new file mode 100644 index 0000000..a006fad --- /dev/null +++ b/lib/docurest/client/password.rb @@ -0,0 +1,22 @@ +module Docurest + class Client::Password < Docurest::Client + AUTHENTICATION_HEADER = 'X-DocuSign-Authentication' + + def initialize(username, password, integrator_key, **options) + super options + @username = username + @password = password + @integrator_key = integrator_key + end + + private + + def add_authentication_header(request) + request[AUTHENTICATION_HEADER] = JSON.generate({ + "Username" => @username, + "Password" => @password, + "IntegratorKey" => @integrator_key, + }) + end + end +end diff --git a/lib/docurest/version.rb b/lib/docurest/version.rb index 05f268b..d9551af 100644 --- a/lib/docurest/version.rb +++ b/lib/docurest/version.rb @@ -1,3 +1,4 @@ module Docurest VERSION = "0.1.0" + API_VERSION = "v2" end