From 9848fc617fd28e13e5c77e66bcc2ff7843e703b8 Mon Sep 17 00:00:00 2001 From: Guillaume Dott Date: Thu, 7 Jul 2016 16:39:15 +0200 Subject: [PATCH] Add read-only access to Envelopes --- lib/docurest.rb | 1 + lib/docurest/base.rb | 21 ++++++++++ lib/docurest/envelope.rb | 54 +++++++++++++++++++++++++ lib/docurest/envelope/document.rb | 46 +++++++++++++++++++++ lib/docurest/envelope/email_settings.rb | 14 +++++++ lib/docurest/envelope/recipient.rb | 34 ++++++++++++++++ lib/docurest/envelope/recipient/tab.rb | 28 +++++++++++++ lib/docurest/login.rb | 24 +++++++++++ 8 files changed, 222 insertions(+) create mode 100644 lib/docurest/base.rb create mode 100644 lib/docurest/envelope.rb create mode 100644 lib/docurest/envelope/document.rb create mode 100644 lib/docurest/envelope/email_settings.rb create mode 100644 lib/docurest/envelope/recipient.rb create mode 100644 lib/docurest/envelope/recipient/tab.rb create mode 100644 lib/docurest/login.rb diff --git a/lib/docurest.rb b/lib/docurest.rb index 00bfb63..2bb0149 100644 --- a/lib/docurest.rb +++ b/lib/docurest.rb @@ -10,6 +10,7 @@ require "docurest/base" require "docurest/envelope" require "docurest/envelope/document" +require "docurest/envelope/email_settings" require "docurest/envelope/recipient" require "docurest/envelope/recipient/tab" diff --git a/lib/docurest/base.rb b/lib/docurest/base.rb new file mode 100644 index 0000000..8e2d6d6 --- /dev/null +++ b/lib/docurest/base.rb @@ -0,0 +1,21 @@ +module Docurest + class Base + extend Docurest::Field + + def initialize(attributes = {}) + self.attributes = attributes + end + + def persisted? + !guid.nil? + end + + private + + def attributes=(attributes) + attributes.each do |key, value| + send "#{key}=", value if respond_to?("#{key}=") + end + end + end +end diff --git a/lib/docurest/envelope.rb b/lib/docurest/envelope.rb new file mode 100644 index 0000000..2f69440 --- /dev/null +++ b/lib/docurest/envelope.rb @@ -0,0 +1,54 @@ +module Docurest + class Envelope < Docurest::Base + def self.get(guid) + new(guid: guid).fetch + end + + field :guid, :envelopeId + field :status + field :subject, :emailSubject + field :body, :emailBlurb + + field :created_at, :createdDateTime, :date_time + field :updated_at, :lastModifiedDateTime, :date_time + field :delivered_at, :deliveredDateTime, :date_time + field :initial_sent_at, :initialSentDateTime, :date_time + field :sent_at, :sentDateTime, :date_time + field :completed_at, :completedDateTime, :date_time + field :status_changed_at, :statusChangedDateTime, :date_time + + field :custom_fields, :customFields + + field :email_settings, :emailSettings, ->(value) { Docurest::Envelope::EmailSettings.new value } + + association(:recipients) { Docurest::Envelope::Recipient.list(guid) } + association(:documents) { Docurest::Envelope::Document.list(guid) } + + def fetch + self.attributes = Docurest.client.get "/envelopes/#{guid}" if persisted? + self + end + + def download(file, document_id = :combined) + Docurest::Envelope::Document.new(id: document_id, envelope_id: guid).download(file) + end + + def void(reason = 'No reason provided.') + Docurest.client.put "/envelopes/#{guid}", {status: :voided, voidedReason: reason} + end + + def to_h + { + status: status, + emailSubject: emailSubject, + emailBlurb: emailBlurb, + emailSettings: emailSettings.to_h, + documents: documents.map(&:to_h), + recipients: recipients.each_with_object({}) do |recipient, hash| + hash[recipient.type] = recipient.to_h + end, + customFields: customFields || [] + } + end + end +end diff --git a/lib/docurest/envelope/document.rb b/lib/docurest/envelope/document.rb new file mode 100644 index 0000000..b3480ed --- /dev/null +++ b/lib/docurest/envelope/document.rb @@ -0,0 +1,46 @@ +module Docurest + class Envelope::Document < Docurest::Base + def self.list(envelope_id) + result = Docurest.client.get "/envelopes/#{envelope_id}/documents" + result['envelopeDocuments'].map do |doc| + new doc.merge(envelope_id: envelope_id) + end + end + + def self.delete(envelope_id, document_ids) + document_ids = document_ids.map { |id| {documentId: id} } + Docurest.client.delete "/envelopes/#{envelope_id}/documents", {documents: document_ids} + end + + field :id, :documentId + field :envelope_id + field :name + field :content + field :order + field :pages + + attr_writer :file + + def delete + self.class.delete(envelope_id, [id]) + end + + def file + @file ||= download(Tempfile.new(%w{docurest .pdf})) + end + + def download(file) + body = Docurest.client.get("/envelopes/#{envelope_id}/documents/#{id}", parse_json: false) + + if file.is_a?(String) + File.open(file, 'wb') { |io| io << body } + else + file << body + end + end + + def to_h + {documentId: documentId} + end + end +end diff --git a/lib/docurest/envelope/email_settings.rb b/lib/docurest/envelope/email_settings.rb new file mode 100644 index 0000000..b8171a4 --- /dev/null +++ b/lib/docurest/envelope/email_settings.rb @@ -0,0 +1,14 @@ +module Docurest + class Envelope::EmailSettings < Docurest::Base + field :name, :replyEmailNameOverride + field :email, :replyEmailAddressOverride + field :bcc, :bccEmailAddresses + + def to_h + { + replyEmailAddressOverride: replyEmailNameOverride, + replyEmailNameOverride: replyEmailNameOverride + } + end + end +end diff --git a/lib/docurest/envelope/recipient.rb b/lib/docurest/envelope/recipient.rb new file mode 100644 index 0000000..2ebbbf8 --- /dev/null +++ b/lib/docurest/envelope/recipient.rb @@ -0,0 +1,34 @@ +module Docurest + class Envelope::Recipient < Docurest::Base + TYPES = %w{signers agents editors intermediaries carbonCopies certifiedDeliveries inPersonSigners} + + def self.list(envelope_id) + result = Docurest.client.get "/envelopes/#{envelope_id}/recipients" + TYPES.each_with_object([]) do |type, recipients| + next unless result.key?(type) + recipients.concat(result[type].map do |recipient| + new recipient.merge(type: type, envelope_id: envelope_id) + end) + end + end + + field :id, :recipientId, :integer + field :guid, :recipientIdGuid + field :envelope_id + field :name + field :email + field :custom_fields, :customFields + field :routing_order, :routingOrder, :integer + field :status + field :note + field :type + field :signed_at, :signedDateTime, :date_time + field :delivered_at, :deliveredDateTime, :date_time + + association(:tabs) { Docurest::Envelope::Recipient::Tab.list(envelope_id, guid) } + + def to_h + {recipientId: recipientId} + end + end +end diff --git a/lib/docurest/envelope/recipient/tab.rb b/lib/docurest/envelope/recipient/tab.rb new file mode 100644 index 0000000..68364b9 --- /dev/null +++ b/lib/docurest/envelope/recipient/tab.rb @@ -0,0 +1,28 @@ +module Docurest + class Envelope::Recipient::Tab < Docurest::Base + def self.list(envelope_id, recipient_id) + result = Docurest.client.get "/envelopes/#{envelope_id}/recipients/#{recipient_id}/tabs" + + result.each_with_object([]) do |(type, tabs), all_tabs| + all_tabs.concat(tabs.map { |tab| new tab.merge(type: type) }) + end + end + + field :guid + field :name + field :tab_label, :tabLabel + field :scale_value, :scaleValue, :float + field :optional, nil, :boolean + field :document_id, :documentId + field :page_number, :pageNumber, :integer + field :recipient_guid, :recipientId + + field :x, :xPosition + field :y, :yPosition + field :anchor, :anchorString + field :anchor_x_offset, :anchorXOffset + field :anchor_y_offset, :anchorYOffset + field :anchor_units, :anchorUnits + end +end + diff --git a/lib/docurest/login.rb b/lib/docurest/login.rb new file mode 100644 index 0000000..3e23387 --- /dev/null +++ b/lib/docurest/login.rb @@ -0,0 +1,24 @@ +module Docurest + class Login < Docurest::Base + def self.information(api_password: false, guid: true, settings: :none) + result = Docurest.client.get '/login_information', + {api_password: api_password, include_account_id_guid: guid, login_settings: settings}, + use_base_url: false + + { + api_password: result['apiPassword'], + accounts: result['loginAccounts'].map { |login| new login } + } + end + + field :id, :accountId + field :guid, :accountIdGuid + field :user_id, :userId + field :name + field :username, :userName + field :email + field :description, :siteDescription + field :url, :baseUrl + field :default, :isDefault, :boolean + end +end