Add read-only access to Envelopes

This commit is contained in:
Guillaume Dott 2016-07-07 16:39:15 +02:00
parent 48f37cc15b
commit 9848fc617f
8 changed files with 222 additions and 0 deletions

View File

@ -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"

21
lib/docurest/base.rb Normal file
View File

@ -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

54
lib/docurest/envelope.rb Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

24
lib/docurest/login.rb Normal file
View File

@ -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