panda_api 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/panda_api.rb +222 -0
  3. metadata +211 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7a2a7d41dc98c786e2367da1756d29c1e3412f27c252752c276e4778e5170fd7
4
+ data.tar.gz: f6d2eb153fd8a4d8cc4619251824f5e019475ed10e750b39078c817d2a7ae356
5
+ SHA512:
6
+ metadata.gz: e78a4d52385cc515f51b104a2b75fbe875f01984a7825c81c3437ce8b7c962b1761ffb286fa5e58fe223eef0a25fb720c0667f2566939041ceca884c0d959f6d
7
+ data.tar.gz: e0f7ba0b8bfaa8a181c27344df8ffcb01f5f002c0a8271a1aba4b359ea418888212f00a9c4d0bb3e06d076a348366038bbd95b606a4a5f33b29e2c8576701062
@@ -0,0 +1,222 @@
1
+ require 'httparty'
2
+ require 'faraday_middleware'
3
+ require 'launchy'
4
+ require 'uri'
5
+ require 'pry'
6
+
7
+ class PandaDoc
8
+ include HTTParty
9
+
10
+ attr_accessor :key, :key_type
11
+
12
+ def initialize(params)
13
+ @key = params[:key]
14
+ @key_type = params[:key_type]
15
+ end
16
+
17
+ # generic headers EXCEPT create doc from PDF
18
+ def headers
19
+ if @key_type == "bearer"
20
+ {
21
+ 'Authorization': "Bearer #{@key}",
22
+ "Content-Type": "application/json"
23
+ }
24
+ else
25
+ {
26
+ 'Authorization': "API-Key #{@key}",
27
+ "Content-Type": "application/json"
28
+ }
29
+ end
30
+ end
31
+
32
+ # key to make request is present
33
+ def raise_if_non_authed
34
+ raise 'No access key to make request' unless !@key.nil?
35
+ end
36
+
37
+ # show calls have corresponding ID
38
+ def raise_if_no_id(params)
39
+ raise 'No ID to make request' unless !params[:id].nil?
40
+ end
41
+
42
+ def document_status(params = nil)
43
+ raise_if_non_authed
44
+ raise_if_no_id(params)
45
+
46
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}", headers: headers).parsed_response
47
+ end
48
+
49
+ def document_details(params = nil)
50
+ raise_if_non_authed
51
+ raise_if_no_id(params)
52
+
53
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/details", headers: headers).parsed_response
54
+ end
55
+
56
+ def list_documents(params = nil)
57
+ raise_if_non_authed
58
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
59
+ self.class.get("https://api.pandadoc.com/public/v1/documents?#{sanitized_params}", headers: headers).parsed_response
60
+ end
61
+
62
+ def download_document(params = nil)
63
+ raise_if_non_authed
64
+ raise_if_no_id(params)
65
+
66
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
67
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/download?#{sanitized_params}", headers: headers).parsed_response
68
+ end
69
+
70
+ def download_protected_document(params = nil)
71
+ raise_if_non_authed
72
+ raise_if_no_id(params)
73
+
74
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/download-protected", headers: headers).parsed_response
75
+ end
76
+
77
+ def list_templates(params = nil)
78
+ raise_if_non_authed
79
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
80
+ self.class.get("https://api.pandadoc.com/public/v1/templates?#{sanitized_params}", headers: headers).parsed_response
81
+ end
82
+
83
+ def template_details(params = nil)
84
+ raise_if_non_authed
85
+ raise_if_no_id(params)
86
+
87
+ self.class.get("https://api.pandadoc.com/public/v1/templates/#{params[:id]}/details", headers: headers).parsed_response
88
+ end
89
+
90
+ def list_document_folders(params = nil)
91
+ raise_if_non_authed
92
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
93
+ self.class.get("https://api.pandadoc.com/public/v1/documents/folders?#{sanitized_params}", headers: headers).parsed_response
94
+ end
95
+
96
+ def list_template_folders(params = nil)
97
+ raise_if_non_authed
98
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
99
+ self.class.get("https://api.pandadoc.com/public/v1/templates/folders?#{sanitized_params}", headers: headers).parsed_response
100
+ end
101
+
102
+ # POST
103
+
104
+ def create_document_from_pdf(params = nil)
105
+ raise_if_non_authed
106
+ # URI for Request
107
+ url = URI.parse('https://api.pandadoc.com/public/v1/documents/')
108
+ # Payload will have a file along with other form-data
109
+ json =
110
+ {
111
+ "name": params[:name],
112
+ "recipients": params[:recipients],
113
+ "fields": params[:fields],
114
+ "metadata": params[:metadata],
115
+ "parse_form_fields": params[:parse_form_fields]
116
+ }
117
+
118
+ payload = {
119
+ data: JSON.dump(json),
120
+ file: Faraday::UploadIO.new(params[:file], "application/pdf")
121
+ }
122
+ # making request connection
123
+ connection = Faraday.new(url) do |conn|
124
+ conn.authorization "API-Key", @key
125
+
126
+ # request is multipart
127
+ conn.request :multipart
128
+ # url_encoded request
129
+ conn.request :url_encoded
130
+
131
+ # expects json
132
+ conn.response :json, content_type: /\bjson$/
133
+ conn.adapter Faraday.default_adapter
134
+ end
135
+ # make request
136
+ connection.post(url, payload).body
137
+ end
138
+
139
+ def create_document_from_template(params = nil)
140
+ raise_if_non_authed
141
+
142
+ self.class.post('https://api.pandadoc.com/public/v1/documents/', body: JSON.dump(params), headers: headers).parsed_response
143
+ end
144
+
145
+ def send_document(params = nil)
146
+ raise_if_non_authed
147
+
148
+ self.class.post("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/send", body: JSON.dump(params), headers: headers).parsed_response
149
+ end
150
+
151
+ def create_document_link(params = nil)
152
+ raise_if_non_authed
153
+
154
+ self.class.post("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/session", body: JSON.dump(params), headers: headers).parsed_response
155
+ end
156
+
157
+ def create_document_folder(params = nil)
158
+ raise_if_non_authed
159
+ self.class.post('https://api.pandadoc.com/public/v1/documents/folders', headers: headers, body: JSON.dump(params)).parsed_response
160
+ end
161
+
162
+ def create_template_folder(params = nil)
163
+ raise_if_non_authed
164
+ self.class.post('https://api.pandadoc.com/public/v1/templates/folders', headers: headers, body: JSON.dump(params)).parsed_response
165
+ end
166
+
167
+ def get_code(params = nil)
168
+ first = "https://app.pandadoc.com/oauth2/authorize?client_id=#{params[:client_id]}&redirect_uri=#{params[:redirect_uri]}&scope=read+write&response_type=code"
169
+ Launchy.open(first)
170
+ puts "enter the code located on your redirect URI browser instance: "
171
+ code = STDIN.gets
172
+ params[:code] = code
173
+ self.get_oauth_access_token(params)
174
+ end
175
+
176
+ def refresh_access_token(params = nil)
177
+ raise_if_non_authed
178
+ # required => client, client_secret, redirect
179
+ parsed_params = {
180
+ "grant_type": "refresh_token",
181
+ "client_id": @client_id || params[:client_id],
182
+ "client_secret": @client_secret || params[:client_secret],
183
+ "refresh_token": @key,
184
+ "scope": 'read+write'
185
+ }
186
+
187
+ missing_keys = parsed_params.keys.select { |p| parsed_params[p.to_sym].nil? }
188
+
189
+ raise "Please Provide #{missing_keys.join(', ')} to make request" if missing_keys.length > 0
190
+ res = self.class.post("https://api.pandadoc.com/oauth2/access_token", body: URI.encode_www_form(parsed_params), headers: {"Accept": "application/json"}).parsed_response
191
+
192
+ @key = res["access_token"]
193
+ @key_type = "bearer"
194
+
195
+ res
196
+ end
197
+
198
+ protected
199
+
200
+ def get_oauth_access_token(params = nil)
201
+ # required => client, client_secret, redirect
202
+ parsed_params = {
203
+ "grant_type": "authorization_code",
204
+ "client_id": @client_id || params[:client_id],
205
+ "client_secret": @client_secret || params[:client_secret],
206
+ "code": params[:code],
207
+ "scope": 'read+write',
208
+ "redirect_uri": @redirect_uri || params[:redirect_uri]
209
+ }
210
+
211
+ missing_keys = parsed_params.keys.select { |p| parsed_params[p.to_sym].nil? }
212
+
213
+ raise "Please Provide #{missing_keys.join(', ')} to make request" if missing_keys.length > 0
214
+
215
+ res = self.class.post("https://api.pandadoc.com/oauth2/access_token", body: URI.encode_www_form(parsed_params), headers: {"Accept": "application/json"}).parsed_response
216
+
217
+ @key = res["access_token"]
218
+ @key_type = "bearer"
219
+
220
+ res
221
+ end
222
+ end
metadata ADDED
@@ -0,0 +1,211 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: panda_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Matt Deatherage
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday_middleware
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: launchy
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: launchy
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activesupport
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activesupport
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: uri
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: uri
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: fillable-pdf
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: Wrapper for PandaDoc API
182
+ email: matt.deatherage@pandadoc.com
183
+ executables: []
184
+ extensions: []
185
+ extra_rdoc_files: []
186
+ files:
187
+ - lib/panda_api.rb
188
+ homepage: https://rubygems.org/gems/panda_api
189
+ licenses:
190
+ - MIT
191
+ metadata: {}
192
+ post_install_message:
193
+ rdoc_options: []
194
+ require_paths:
195
+ - lib
196
+ required_ruby_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ required_rubygems_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ requirements: []
207
+ rubygems_version: 3.0.6
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: PandaDoc API
211
+ test_files: []