class PandaDoc

Attributes

key[RW]
key_type[RW]

Public Class Methods

new(params) click to toggle source
# File lib/panda_api.rb, line 12
def initialize(params)
  @key = params[:key]
  @key_type = params[:key_type]
end

Public Instance Methods

create_document_folder(params = nil) click to toggle source
# File lib/panda_api.rb, line 157
def create_document_folder(params = nil)
  raise_if_non_authed
  self.class.post('https://api.pandadoc.com/public/v1/documents/folders', headers: headers, body: JSON.dump(params)).parsed_response
end
create_document_from_pdf(params = nil) click to toggle source

POST

# File lib/panda_api.rb, line 104
def create_document_from_pdf(params = nil)
  raise_if_non_authed
  # URI for Request
  url = URI.parse('https://api.pandadoc.com/public/v1/documents/')
  # Payload will have a file along with other form-data
  json =
  {
      "name": params[:name],
      "recipients": params[:recipients],
      "fields": params[:fields],
      "metadata": params[:metadata],
      "parse_form_fields": params[:parse_form_fields]
  }

  payload = {
    data: JSON.dump(json),
    file: Faraday::UploadIO.new(params[:file], "application/pdf")
  }
  # making request connection
  connection = Faraday.new(url) do |conn|
    conn.authorization "API-Key", @key

    # request is multipart
    conn.request     :multipart
    # url_encoded request
    conn.request     :url_encoded

    # expects json
    conn.response      :json, content_type: /\bjson$/
    conn.adapter       Faraday.default_adapter
  end
  # make request
  connection.post(url, payload).body
end
create_document_from_template(params = nil) click to toggle source
# File lib/panda_api.rb, line 139
def create_document_from_template(params = nil)
  raise_if_non_authed

  self.class.post('https://api.pandadoc.com/public/v1/documents/', body: JSON.dump(params), headers: headers).parsed_response
end
create_template_folder(params = nil) click to toggle source
# File lib/panda_api.rb, line 162
def create_template_folder(params = nil)
  raise_if_non_authed
  self.class.post('https://api.pandadoc.com/public/v1/templates/folders', headers: headers, body: JSON.dump(params)).parsed_response
end
delete_document(params = nil) click to toggle source
# File lib/panda_api.rb, line 199
def delete_document(params = nil)
  raise_if_no_id(params)
  self.class.delete("https://api.pandadoc.com/public/v1/documents/#{params[:id]}", headers: headers).parsed_response
end
delete_template(params = nil) click to toggle source
# File lib/panda_api.rb, line 204
def delete_template(params = nil)
  raise_if_no_id(params)
  self.class.delete("https://api.pandadoc.com/public/v1/templates/#{params[:id]}", headers: headers).parsed_response
end
document_details(params = nil) click to toggle source
# File lib/panda_api.rb, line 49
def document_details(params = nil)
  raise_if_non_authed
  raise_if_no_id(params)

  self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/details", headers: headers).parsed_response
end
document_status(params = nil) click to toggle source
# File lib/panda_api.rb, line 42
def document_status(params = nil)
  raise_if_non_authed
  raise_if_no_id(params)

  self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}", headers: headers).parsed_response
end
download_document(params = nil) click to toggle source
# File lib/panda_api.rb, line 62
def download_document(params = nil)
  raise_if_non_authed
  raise_if_no_id(params)

  sanitized_params = params.nil? ? params : URI.encode_www_form(params)
  self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/download?#{sanitized_params}", headers: headers).parsed_response
end
download_protected_document(params = nil) click to toggle source
# File lib/panda_api.rb, line 70
def download_protected_document(params = nil)
  raise_if_non_authed
  raise_if_no_id(params)

  self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/download-protected", headers: headers).parsed_response
end
get_code(params = nil) click to toggle source
# File lib/panda_api.rb, line 167
def get_code(params = nil)
  first = "https://app.pandadoc.com/oauth2/authorize?client_id=#{params[:client_id]}&redirect_uri=#{params[:redirect_uri]}&scope=read+write&response_type=code"
  Launchy.open(first)
  puts "enter the code located on your redirect URI browser instance: "
  code = STDIN.gets
  params[:code] = code
  self.get_oauth_access_token(params)
end
headers() click to toggle source

generic headers EXCEPT create doc from PDF

# File lib/panda_api.rb, line 18
def headers
  if @key_type == "bearer"
    {
      'Authorization': "Bearer #{@key}",
      "Content-Type": "application/json"
    }
  else
    {
      'Authorization': "API-Key #{@key}",
      "Content-Type": "application/json"
    }
  end
end
list_document_folders(params = nil) click to toggle source
# File lib/panda_api.rb, line 90
def list_document_folders(params = nil)
  raise_if_non_authed
  sanitized_params = params.nil? ? params : URI.encode_www_form(params)
  self.class.get("https://api.pandadoc.com/public/v1/documents/folders?#{sanitized_params}", headers: headers).parsed_response
end
list_documents(params = nil) click to toggle source
# File lib/panda_api.rb, line 56
def list_documents(params = nil)
  raise_if_non_authed
  sanitized_params = params.nil? ? params : URI.encode_www_form(params)
  self.class.get("https://api.pandadoc.com/public/v1/documents?#{sanitized_params}", headers: headers).parsed_response
end
list_template_folders(params = nil) click to toggle source
# File lib/panda_api.rb, line 96
def list_template_folders(params = nil)
  raise_if_non_authed
  sanitized_params = params.nil? ? params : URI.encode_www_form(params)
  self.class.get("https://api.pandadoc.com/public/v1/templates/folders?#{sanitized_params}", headers: headers).parsed_response
end
list_templates(params = nil) click to toggle source
# File lib/panda_api.rb, line 77
def list_templates(params = nil)
  raise_if_non_authed
  sanitized_params = params.nil? ? params : URI.encode_www_form(params)
  self.class.get("https://api.pandadoc.com/public/v1/templates?#{sanitized_params}", headers: headers).parsed_response
end
raise_if_no_id(params) click to toggle source

show calls have corresponding ID

# File lib/panda_api.rb, line 38
def raise_if_no_id(params)
  raise 'No ID to make request' unless !params[:id].nil?
end
raise_if_non_authed() click to toggle source

key to make request is present

# File lib/panda_api.rb, line 33
def raise_if_non_authed
  raise 'No access key to make request' unless !@key.nil?
end
refresh_access_token(params = nil) click to toggle source
# File lib/panda_api.rb, line 176
def refresh_access_token(params = nil)
  raise_if_non_authed
  # required => client, client_secret, redirect
  parsed_params = {
    "grant_type": "refresh_token",
    "client_id": @client_id || params[:client_id],
    "client_secret": @client_secret || params[:client_secret],
    "refresh_token": params[:refresh_token],
    "code": params[:code],
    "scope": params[:scope] || 'read+write'
  }

  missing_keys = parsed_params.keys.select { |p| parsed_params[p.to_sym].nil? }

  raise "Please Provide #{missing_keys.join(', ')} to make request" if missing_keys.length > 0
  res = self.class.post("https://api.pandadoc.com/oauth2/access_token", body: URI.encode_www_form(parsed_params), headers: {"Accept": "application/json"}).parsed_response

  @key = res["access_token"]
  @key_type = "bearer"

  res
end
send_document(params = nil) click to toggle source
# File lib/panda_api.rb, line 145
def send_document(params = nil)
  raise_if_non_authed

  self.class.post("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/send", body: JSON.dump(params), headers: headers).parsed_response
end
template_details(params = nil) click to toggle source
# File lib/panda_api.rb, line 83
def template_details(params = nil)
  raise_if_non_authed
  raise_if_no_id(params)

  self.class.get("https://api.pandadoc.com/public/v1/templates/#{params[:id]}/details", headers: headers).parsed_response
end
update_document_folder(params = nil) click to toggle source
# File lib/panda_api.rb, line 209
def update_document_folder(params = nil)
  raise_if_no_id(params)
  self.class.put("https://api.pandadoc.com/public/v1/documents/folders/#{params[:id]}", headers: headers, body: JSON.dump(params)).parsed_response
end
update_template_folder(params = nil) click to toggle source
# File lib/panda_api.rb, line 214
def update_template_folder(params = nil)
  raise_if_no_id(params)
  self.class.put("https://api.pandadoc.com/public/v1/templates/folders/#{params[:id]}", headers: headers, body: JSON.dump(params)).parsed_response
end

Protected Instance Methods

get_oauth_access_token(params = nil) click to toggle source
# File lib/panda_api.rb, line 221
def get_oauth_access_token(params = nil)
  # required => client, client_secret, redirect
  parsed_params = {
    "grant_type": "authorization_code",
    "client_id": @client_id || params[:client_id],
    "client_secret": @client_secret || params[:client_secret],
    "code": params[:code],
    "scope": 'read+write',
    "redirect_uri": @redirect_uri || params[:redirect_uri]
  }

  missing_keys = parsed_params.keys.select { |p| parsed_params[p.to_sym].nil? }

  raise "Please Provide #{missing_keys.join(', ')} to make request" if missing_keys.length > 0

  res = self.class.post("https://api.pandadoc.com/oauth2/access_token", body: URI.encode_www_form(parsed_params), headers: {"Accept": "application/json"}).parsed_response

  @key = res["access_token"]
  @key_type = "bearer"

  res
end