groupdocs 1.5.7 → 1.5.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. data/CHANGELOG.md +51 -0
  2. data/examples/api-samples/Gemfile +1 -1
  3. data/examples/api-samples/Gemfile.lock +43 -0
  4. data/examples/api-samples/public/docs/{sample2.html → sample01.html} +39 -19
  5. data/examples/api-samples/public/docs/{sample3.html → sample02.html} +28 -22
  6. data/examples/api-samples/public/docs/sample03.html +285 -0
  7. data/examples/api-samples/public/docs/{sample4.html → sample04.html} +30 -36
  8. data/examples/api-samples/public/docs/{sample5.html → sample05.html} +68 -31
  9. data/examples/api-samples/public/docs/sample06.html +299 -0
  10. data/examples/api-samples/public/docs/{sample7.html → sample07.html} +53 -18
  11. data/examples/api-samples/public/docs/{sample8.html → sample08.html} +64 -41
  12. data/examples/api-samples/public/docs/sample09.html +260 -0
  13. data/examples/api-samples/public/docs/sample10.html +67 -28
  14. data/examples/api-samples/public/docs/sample11.html +171 -55
  15. data/examples/api-samples/public/docs/sample12.html +53 -17
  16. data/examples/api-samples/public/docs/sample13.html +52 -16
  17. data/examples/api-samples/public/docs/sample14.html +51 -8
  18. data/examples/api-samples/public/docs/sample15.html +46 -10
  19. data/examples/api-samples/public/docs/sample16.html +81 -7
  20. data/examples/api-samples/public/docs/sample17.html +103 -15
  21. data/examples/api-samples/public/docs/sample18.html +117 -41
  22. data/examples/api-samples/public/docs/sample19.html +410 -36
  23. data/examples/api-samples/public/docs/sample20.html +46 -10
  24. data/examples/api-samples/public/docs/sample21.html +504 -45
  25. data/examples/api-samples/public/docs/sample22.html +166 -28
  26. data/examples/api-samples/public/docs/sample23.html +61 -25
  27. data/examples/api-samples/public/docs/sample24.html +100 -12
  28. data/examples/api-samples/public/docs/sample25.html +123 -49
  29. data/examples/api-samples/public/docs/sample26.html +41 -8
  30. data/examples/api-samples/public/docs/sample27.html +125 -50
  31. data/examples/api-samples/public/docs/sample28.html +27 -9
  32. data/examples/api-samples/public/docs/sample29.html +10 -10
  33. data/examples/api-samples/public/docs/sample30.html +70 -14
  34. data/examples/api-samples/public/docs/sample31.html +108 -67
  35. data/examples/api-samples/public/docs/sample32.html +71 -99
  36. data/examples/api-samples/public/docs/sample33.html +107 -32
  37. data/examples/api-samples/public/docs/{sample1.html → sample34.html} +58 -18
  38. data/examples/api-samples/public/docs/sample35.html +666 -0
  39. data/examples/api-samples/public/docs/{sample6.html → sample36.html} +56 -37
  40. data/examples/api-samples/public/docs/sample37.html +815 -0
  41. data/examples/api-samples/public/docs/sample38.html +508 -0
  42. data/examples/api-samples/public/docs/sample39.html +921 -0
  43. data/examples/api-samples/public/docs/sample40.html +510 -0
  44. data/examples/api-samples/public/docs/sample41.html +452 -0
  45. data/examples/api-samples/public/docs/sample42.html +311 -0
  46. data/examples/api-samples/public/templates/test_all_fields2.pdf +0 -0
  47. data/examples/api-samples/samples/sample01.rb +37 -0
  48. data/examples/api-samples/samples/sample02.rb +41 -0
  49. data/examples/api-samples/samples/sample03.rb +73 -0
  50. data/examples/api-samples/samples/sample04.rb +47 -0
  51. data/examples/api-samples/samples/{sample5.rb → sample05.rb} +26 -14
  52. data/examples/api-samples/samples/sample06.rb +80 -0
  53. data/examples/api-samples/samples/sample07.rb +52 -0
  54. data/examples/api-samples/samples/sample08.rb +69 -0
  55. data/examples/api-samples/samples/sample09.rb +83 -0
  56. data/examples/api-samples/samples/sample10.rb +29 -15
  57. data/examples/api-samples/samples/sample11.rb +89 -37
  58. data/examples/api-samples/samples/sample12.rb +22 -11
  59. data/examples/api-samples/samples/sample13.rb +22 -10
  60. data/examples/api-samples/samples/sample14.rb +23 -5
  61. data/examples/api-samples/samples/sample15.rb +18 -7
  62. data/examples/api-samples/samples/sample16.rb +28 -4
  63. data/examples/api-samples/samples/sample17.rb +31 -5
  64. data/examples/api-samples/samples/sample18.rb +36 -8
  65. data/examples/api-samples/samples/sample19.rb +138 -18
  66. data/examples/api-samples/samples/sample20.rb +14 -3
  67. data/examples/api-samples/samples/sample21.rb +162 -23
  68. data/examples/api-samples/samples/sample22.rb +73 -22
  69. data/examples/api-samples/samples/sample23.rb +17 -6
  70. data/examples/api-samples/samples/sample24.rb +34 -7
  71. data/examples/api-samples/samples/sample25.rb +37 -12
  72. data/examples/api-samples/samples/sample26.rb +12 -5
  73. data/examples/api-samples/samples/sample27.rb +38 -12
  74. data/examples/api-samples/samples/sample28.rb +25 -6
  75. data/examples/api-samples/samples/sample29.rb +12 -12
  76. data/examples/api-samples/samples/sample30.rb +27 -15
  77. data/examples/api-samples/samples/sample31.rb +44 -33
  78. data/examples/api-samples/samples/sample32.rb +43 -41
  79. data/examples/api-samples/samples/sample33.rb +42 -14
  80. data/examples/api-samples/samples/sample34.rb +40 -0
  81. data/examples/api-samples/samples/sample35.rb +224 -0
  82. data/examples/api-samples/samples/sample36.rb +58 -0
  83. data/examples/api-samples/samples/sample37.rb +229 -0
  84. data/examples/api-samples/samples/sample38.rb +128 -0
  85. data/examples/api-samples/samples/sample39.rb +252 -0
  86. data/examples/api-samples/samples/sample40.rb +164 -0
  87. data/examples/api-samples/samples/sample41.rb +118 -0
  88. data/examples/api-samples/samples/sample42.rb +97 -0
  89. data/examples/api-samples/views/_others_samples.haml +25 -11
  90. data/examples/api-samples/views/index.haml +23 -11
  91. data/examples/api-samples/views/popup.haml +32 -0
  92. data/examples/api-samples/views/{sample1.haml → sample01.haml} +12 -7
  93. data/examples/api-samples/views/{sample2.haml → sample02.haml} +20 -15
  94. data/examples/api-samples/views/sample03.haml +83 -0
  95. data/examples/api-samples/views/sample04.haml +49 -0
  96. data/examples/api-samples/views/{sample5.haml → sample05.haml} +19 -14
  97. data/examples/api-samples/views/sample06.haml +53 -0
  98. data/examples/api-samples/views/sample07.haml +47 -0
  99. data/examples/api-samples/views/{sample8.haml → sample08.haml} +17 -12
  100. data/examples/api-samples/views/{sample9.haml → sample09.haml} +19 -4
  101. data/examples/api-samples/views/sample10.haml +18 -13
  102. data/examples/api-samples/views/sample11.haml +48 -19
  103. data/examples/api-samples/views/sample12.haml +26 -21
  104. data/examples/api-samples/views/sample13.haml +18 -12
  105. data/examples/api-samples/views/sample14.haml +21 -15
  106. data/examples/api-samples/views/sample15.haml +16 -9
  107. data/examples/api-samples/views/sample16.haml +18 -5
  108. data/examples/api-samples/views/sample17.haml +14 -9
  109. data/examples/api-samples/views/sample18.haml +13 -7
  110. data/examples/api-samples/views/sample19.haml +37 -8
  111. data/examples/api-samples/views/sample20.haml +13 -8
  112. data/examples/api-samples/views/sample21.haml +71 -13
  113. data/examples/api-samples/views/sample22.haml +53 -16
  114. data/examples/api-samples/views/sample23.haml +9 -4
  115. data/examples/api-samples/views/sample24.haml +9 -4
  116. data/examples/api-samples/views/sample25.haml +18 -13
  117. data/examples/api-samples/views/sample26.haml +8 -3
  118. data/examples/api-samples/views/sample27.haml +20 -14
  119. data/examples/api-samples/views/sample28.haml +16 -10
  120. data/examples/api-samples/views/sample29.haml +4 -4
  121. data/examples/api-samples/views/sample30.haml +16 -10
  122. data/examples/api-samples/views/sample31.haml +39 -32
  123. data/examples/api-samples/views/sample32.haml +25 -36
  124. data/examples/api-samples/views/sample33.haml +14 -17
  125. data/examples/api-samples/views/sample34.haml +48 -0
  126. data/examples/api-samples/views/sample35.haml +95 -0
  127. data/examples/api-samples/views/sample36.haml +64 -0
  128. data/examples/api-samples/views/sample37.haml +124 -0
  129. data/examples/api-samples/views/sample38.haml +115 -0
  130. data/examples/api-samples/views/sample39.haml +236 -0
  131. data/examples/api-samples/views/sample40.haml +95 -0
  132. data/examples/api-samples/views/{sample4.haml → sample41.haml} +90 -72
  133. data/examples/api-samples/views/sample42.haml +59 -0
  134. data/lib/groupdocs/api/helpers/rest_helper.rb +13 -1
  135. data/lib/groupdocs/datasource.rb +2 -1
  136. data/lib/groupdocs/document.rb +101 -13
  137. data/lib/groupdocs/document/annotation.rb +28 -13
  138. data/lib/groupdocs/document/annotation/marker.rb +18 -0
  139. data/lib/groupdocs/document/annotation/reply.rb +9 -2
  140. data/lib/groupdocs/document/field.rb +5 -1
  141. data/lib/groupdocs/job.rb +12 -2
  142. data/lib/groupdocs/questionnaire.rb +174 -4
  143. data/lib/groupdocs/questionnaire/collector.rb +21 -0
  144. data/lib/groupdocs/questionnaire/question.rb +19 -0
  145. data/lib/groupdocs/questionnaire/question/answer.rb +5 -0
  146. data/lib/groupdocs/questionnaire/question/conditions.rb +20 -0
  147. data/lib/groupdocs/signature.rb +36 -308
  148. data/lib/groupdocs/signature/envelope.rb +146 -4
  149. data/lib/groupdocs/signature/field.rb +20 -1
  150. data/lib/groupdocs/signature/field/location.rb +18 -7
  151. data/lib/groupdocs/signature/form.rb +199 -10
  152. data/lib/groupdocs/signature/shared/document_methods.rb +38 -0
  153. data/lib/groupdocs/signature/shared/entity_methods.rb +0 -1
  154. data/lib/groupdocs/signature/shared/field_methods.rb +13 -38
  155. data/lib/groupdocs/signature/shared/recipient_methods.rb +8 -0
  156. data/lib/groupdocs/signature/template.rb +3 -1
  157. data/lib/groupdocs/storage.rb +4 -1
  158. data/lib/groupdocs/storage/file.rb +18 -1
  159. data/lib/groupdocs/subscription.rb +8 -3
  160. data/lib/groupdocs/user.rb +8 -0
  161. data/lib/groupdocs/version.rb +1 -1
  162. data/spec/groupdocs/document/annotation_spec.rb +1 -14
  163. data/spec/groupdocs/subscription_spec.rb +2 -2
  164. metadata +86 -32
  165. checksums.yaml +0 -15
  166. data/examples/api-samples/public/docs/sample9.html +0 -200
  167. data/examples/api-samples/samples/sample1.rb +0 -25
  168. data/examples/api-samples/samples/sample2.rb +0 -29
  169. data/examples/api-samples/samples/sample3.rb +0 -33
  170. data/examples/api-samples/samples/sample4.rb +0 -51
  171. data/examples/api-samples/samples/sample6.rb +0 -49
  172. data/examples/api-samples/samples/sample7.rb +0 -42
  173. data/examples/api-samples/samples/sample8.rb +0 -61
  174. data/examples/api-samples/samples/sample9.rb +0 -48
  175. data/examples/api-samples/views/sample3.haml +0 -44
  176. data/examples/api-samples/views/sample6.haml +0 -49
  177. data/examples/api-samples/views/sample7.haml +0 -42
@@ -0,0 +1,58 @@
1
+ # GET request
2
+ get '/sample36' do
3
+ haml :sample36
4
+ end
5
+
6
+
7
+
8
+
9
+ # POST request
10
+ post '/sample36' do
11
+ # Set variables
12
+ set :client_id, params[:clientId]
13
+ set :private_key, params[:privateKey]
14
+ set :envelope, params[:envelopeGuid]
15
+ set :base_path, params[:basePath]
16
+
17
+ # Set download path
18
+ downloads_path = "#{File.dirname(__FILE__)}/../public/downloads"
19
+
20
+ # Remove all files from download directory or create folder if it not there
21
+ if File.directory?(downloads_path)
22
+ Dir.foreach(downloads_path) { |f| fn = File.join(downloads_path, f); File.delete(fn) if f != '.' && f != '..' }
23
+ else
24
+ Dir::mkdir(downloads_path)
25
+ end
26
+
27
+
28
+ begin
29
+ # Check required variables
30
+ raise 'Please enter all required parameters' if settings.client_id.empty? or settings.private_key.empty?
31
+
32
+ if settings.base_path.empty? then settings.base_path = 'https://api.groupdocs.com' end
33
+
34
+ # Configure your access to API server
35
+ GroupDocs.configure do |groupdocs|
36
+ groupdocs.client_id = settings.client_id
37
+ groupdocs.private_key = settings.private_key
38
+ # Optionally specify API server and version
39
+ groupdocs.api_server = settings.base_path # default is 'https://api.groupdocs.com'
40
+ end
41
+
42
+ # Get envelope from GroupDocs Storage
43
+ envelope = GroupDocs::Signature::Envelope.get!(settings.envelope)
44
+
45
+ #Download signed files
46
+ path = envelope.signed_documents!(downloads_path)
47
+
48
+ #Get file name
49
+ file = path.split('/').last
50
+
51
+ message = "<span style=\"color:green\">Files from the envelope were downloaded to server's local folder. You can check them <a href=\"/downloads/#{file}\">here</a></span>"
52
+ rescue Exception => e
53
+ err = e.message
54
+ end
55
+
56
+ # set variables for template
57
+ haml :sample36, :locals => {:userId => settings.client_id, :privateKey => settings.private_key, :envelopeGuid => settings.envelope, :message => message, :err => err}
58
+ end
@@ -0,0 +1,229 @@
1
+ # Route the handler url "/sample37"
2
+ get '/sample37' do
3
+ haml :sample37
4
+ end
5
+
6
+ # GET request
7
+
8
+ # Route the handler url "/sample37/signature_callback". The block function for callback with server
9
+ post '/sample37/signature_callback' do
10
+ # Get data json from callback
11
+ data = JSON.parse(request.body.read)
12
+ begin
13
+
14
+ raise 'Empty params!' if data.empty?
15
+
16
+ # Set variables from data json
17
+ source_id = data['SourceId']
18
+ event_type = data['EventType']
19
+
20
+ # Set variables
21
+ client_id = nil
22
+ private_key = nil
23
+
24
+ return if event_type != 'JobCompleted'
25
+
26
+ # Set download path
27
+ downloads_path = "#{File.dirname(__FILE__)}/../public/downloads"
28
+
29
+ # Get private key and client_id from file user_info.txt
30
+ if File.exist?("#{File.dirname(__FILE__)}/../public/user_info.txt")
31
+ contents = File.read("#{File.dirname(__FILE__)}/../public/user_info.txt")
32
+ contents = contents.split(' ')
33
+ client_id = contents[0]
34
+ private_key = contents[1]
35
+ end
36
+
37
+ # Get Envelope instance
38
+ envelope = GroupDocs::Signature::Envelope.get!(source_id, {:client_id => client_id, :private_key => private_key})
39
+
40
+ # Get document by envelope
41
+ envelope.signed_documents!(downloads_path, {:client_id => client_id, :private_key => private_key})
42
+
43
+
44
+ rescue Exception => e
45
+ err = e.message
46
+ end
47
+ end
48
+
49
+
50
+ # Route the handler url "/sample37/check"
51
+
52
+ get '/sample37/check' do
53
+
54
+ # Check is there download directory
55
+ unless File.directory?("#{File.dirname(__FILE__)}/../public/downloads")
56
+ return 'Directory was not found.'
57
+ end
58
+
59
+ # Get file name from download directory
60
+ name = nil
61
+
62
+ i = 0
63
+
64
+ # Checking, if file exist
65
+ while i<10 do
66
+ sleep(5)
67
+ Dir.entries("#{File.dirname(__FILE__)}/../public/downloads").each do |file|
68
+ name = file if file != '.' && file != '..'
69
+ end
70
+ break if name
71
+ i += 1
72
+ end
73
+
74
+ name
75
+ end
76
+
77
+ # Route the handler url "/sample37/downloads"
78
+ get '/sample37/downloads/:filename' do |filename|
79
+ # Send file with header to download it
80
+ send_file "#{File.dirname(__FILE__)}/../public/downloads/#{filename}", :filename => filename, :type => 'Application/octet-stream'
81
+ end
82
+
83
+ # Route the handler url "/sample37". The function block creates new envelope
84
+ post '/sample37' do
85
+ # Set variables from form
86
+ set :client_id, params[:clientId]
87
+ set :private_key, params[:privateKey]
88
+ set :email, params[:email]
89
+ set :name, params[:name]
90
+ set :lastName, params[:lastName]
91
+ set :fileId, params[:fileId]
92
+ set :callback, params[:callback]
93
+ set :base_path, params[:basePath]
94
+ set :url, params[:url]
95
+ set :source, params[:source]
96
+
97
+ # Set download path
98
+ downloads_path = "#{File.dirname(__FILE__)}/../public/downloads"
99
+
100
+ # Remove all files from download directory or create folder if it not there
101
+ if File.directory?(downloads_path)
102
+ Dir.foreach(downloads_path) { |f| fn = File.join(downloads_path, f); File.delete(fn) if f != '.' && f != '..' }
103
+ else
104
+ Dir::mkdir(downloads_path)
105
+ end
106
+
107
+ begin
108
+ # Check required variables
109
+ raise 'Please enter all required parameters' if settings.client_id.empty? or settings.private_key.empty? or settings.email.empty? or settings.name.empty? or settings.lastName.empty?
110
+
111
+ if settings.base_path.empty? then settings.base_path = 'https://api.groupdocs.com' end
112
+
113
+ # Configure your access to API server
114
+ GroupDocs.configure do |groupdocs|
115
+ groupdocs.client_id = settings.client_id
116
+ groupdocs.private_key = settings.private_key
117
+ # Optionally specify API server and version
118
+ groupdocs.api_server = settings.base_path # default is 'https://api.groupdocs.com'
119
+ end
120
+
121
+ # Write client and private key to the file for callback job
122
+ if settings.callback
123
+ out_file = File.new("#{File.dirname(__FILE__)}/../public/user_info.txt", 'w')
124
+ # white space is required
125
+ out_file.write("#{settings.client_id} ")
126
+ out_file.write("#{settings.private_key}")
127
+ out_file.close
128
+ end
129
+
130
+ file = nil
131
+ # get document by file GUID
132
+ case settings.source
133
+ when 'guid'
134
+ # Create instance of File
135
+ file = GroupDocs::Storage::File.new({:guid => settings.fileId}).to_document.metadata!()
136
+ file = file.last_view.document.file.to_document
137
+ when 'local'
138
+ # construct path
139
+ file_path = "#{Dir.tmpdir}/#{params[:file][:filename]}"
140
+
141
+ # open file
142
+ File.open(file_path, 'wb') { |f| f.write(params[:file][:tempfile].read) }
143
+ # make a request to API using client_id and private_key
144
+ file = GroupDocs::Storage::File.upload!(file_path, {}).to_document
145
+ when 'url'
146
+ # Upload file from defined url
147
+ file = GroupDocs::Storage::File.upload_web!(settings.url).to_document
148
+ else
149
+ raise 'Wrong GUID source.'
150
+ end
151
+
152
+ name = file.name
153
+ # create envelope using user id and entered by user name
154
+ envelope = GroupDocs::Signature::Envelope.new
155
+ envelope.name = file.name
156
+ envelope.email_subject = 'Sing this!'
157
+ envelope.create!({})
158
+
159
+ # Add uploaded document to envelope
160
+ envelope.add_document!(file, {})
161
+
162
+ # Get role list for current user
163
+ roles = GroupDocs::Signature::Role.get!({})
164
+
165
+ # Create new recipient
166
+ recipient = GroupDocs::Signature::Recipient.new
167
+ recipient.email = settings.email
168
+ recipient.first_name = settings.name
169
+ recipient.last_name = settings.lastName
170
+ recipient.role_id = roles.detect { |role| role.name == 'Signer' }.id
171
+
172
+ # Add recipient to envelope
173
+ add = envelope.add_recipient!(recipient)
174
+
175
+ # Get recipient id
176
+ recipient.id = add[:recipient][:id]
177
+
178
+ # Get document id
179
+ document = envelope.documents!
180
+
181
+
182
+ # Get field and add the location to field
183
+ field = GroupDocs::Signature::Field.get!.detect { |f| f.type == :signature }
184
+ field.location = {:location_x => 0.15, :location_y => 0.73, :location_w => 150, :location_h => 50, :page => 1}
185
+ field.name = 'EMPLOYEE SIGNATURE'
186
+
187
+ # Add field to envelope
188
+ envelope.add_field!(field, document[0], recipient)
189
+
190
+
191
+
192
+ # Send envelop
193
+ envelope.send!({:callbackUrl => settings.callback})
194
+
195
+ # Write client and private key to the file for callback job
196
+ if settings.callback
197
+ out_file = File.new("#{File.dirname(__FILE__)}/../public/user_info.txt", 'w')
198
+ # white space is required
199
+ out_file.write("#{settings.client_id} ")
200
+ out_file.write("#{settings.private_key}")
201
+ out_file.write("#{envelope.id}")
202
+ out_file.close
203
+ end
204
+
205
+ #Get url from request
206
+ case settings.base_path
207
+
208
+ when 'https://stage-api-groupdocs.dynabic.com'
209
+ url = "http://stage-apps-groupdocs.dynabic.com/signature/signembed/#{envelope.id}/#{recipient.id}"
210
+ when 'https://dev-api-groupdocs.dynabic.com'
211
+ url = "http://dev-apps-groupdocs.dynabic.com/signature/signembed/#{envelope.id}/#{recipient.id}"
212
+ else
213
+ url = "https://apps.groupdocs.com/signature/signembed/#{envelope.id}/#{recipient.id}"
214
+ end
215
+
216
+
217
+ iframe = GroupDocs::Api::Request.new(:path => url).prepare_and_sign_url
218
+ # Make iframe
219
+ iframe = "<iframe src='#{iframe}' frameborder='0' width='720' height='600'></iframe>"
220
+ message = "<p>File was uploaded to GroupDocs. Here you can see your <strong>#{name}</strong> file in the GroupDocs Embedded Viewer.</p>"
221
+ rescue Exception => e
222
+ err = e.message
223
+ end
224
+
225
+ # Set variables for template
226
+ haml :sample37, :locals => {:userId => settings.client_id, :privateKey => settings.private_key, :email => settings.email, :name => settings.name, :lastName => settings.lastName, :iframe => iframe, :massage => message, :err => err, :callback => settings.callback,}
227
+ end
228
+
229
+
@@ -0,0 +1,128 @@
1
+ # GET request
2
+ get '/sample38' do
3
+ haml :sample38
4
+ end
5
+
6
+
7
+
8
+
9
+ # POST request
10
+ post '/sample38' do
11
+ # Set variables
12
+ set :client_id, params[:clientId]
13
+ set :private_key, params[:privateKey]
14
+ set :email, params[:email]
15
+ set :source, params[:source]
16
+ set :file_id, params[:fileId]
17
+ set :url, params[:url]
18
+ set :first_name, params[:firstName]
19
+ set :last_name, params[:lastName]
20
+ set :base_path, params[:basePath]
21
+ #raise params.to_yaml
22
+ # Set download path
23
+ downloads_path = "#{File.dirname(__FILE__)}/../public/downloads"
24
+
25
+ # Remove all files from download directory or create folder if it not there
26
+ if File.directory?(downloads_path)
27
+ Dir.foreach(downloads_path) { |f| fn = File.join(downloads_path, f); File.delete(fn) if f != '.' && f != '..' }
28
+ else
29
+ Dir::mkdir(downloads_path)
30
+ end
31
+
32
+
33
+ begin
34
+ # Check required variables
35
+ #raise 'Please enter all required parameters' if settings.client_id.empty? or settings.private_key.empty? or settings.email.empty? or settings.first_name.empty? or settings.last_name?
36
+
37
+ if settings.base_path.empty? then settings.base_path = 'https://api.groupdocs.com' end
38
+
39
+ # Configure your access to API server
40
+ GroupDocs.configure do |groupdocs|
41
+ groupdocs.client_id = settings.client_id
42
+ groupdocs.private_key = settings.private_key
43
+ # Optionally specify API server and version
44
+ groupdocs.api_server = settings.base_path # default is 'https://api.groupdocs.com'
45
+ end
46
+
47
+ # Get document by file GUID
48
+ case settings.source
49
+ when 'guid'
50
+ # Create instance of File
51
+ file = GroupDocs::Storage::File.new({:guid => settings.file_id})
52
+ when 'local'
53
+ # Construct path
54
+ file_path = "#{Dir.tmpdir}/#{params[:file][:filename]}"
55
+ # Open file
56
+ File.open(file_path, 'wb') { |f| f.write(params[:file][:tempfile].read) }
57
+ # Make a request to API using client_id and private_key
58
+ file = GroupDocs::Storage::File.upload!(file_path, {})
59
+ when 'url'
60
+ # Upload file from defined url
61
+ file = GroupDocs::Storage::File.upload_web!(settings.url)
62
+ else
63
+ raise 'Wrong GUID source.'
64
+ end
65
+
66
+ #Get all users from accaunt
67
+ user = GroupDocs::User.get!
68
+ userGuid = nil
69
+ users = user.users!
70
+ users.map do |user|
71
+ email = user.primary_email
72
+ # Check whether there is a user with entered email
73
+ if settings.email == email
74
+ # Get user GUID
75
+ userGuid = user.guid
76
+ break
77
+ end
78
+ end
79
+ # Check is user with entered email was founded in GroupDocs account, if not user will be created
80
+ if userGuid.nil?
81
+ userNew = GroupDocs::User.new
82
+ # Set email as entered email
83
+ userNew.primary_email = settings.email
84
+ # Set nick name as entered first name
85
+ userNew.nickname = settings.email
86
+ # Set first name as entered first name
87
+ userNew.firstname = settings.first_name
88
+ # Set last name as entered last name
89
+ userNew.lastname = settings.last_name
90
+ # Set roles
91
+ userNew.roles = [{:id => '3', :name => 'User'}]
92
+
93
+ # Update account
94
+ new_user = GroupDocs::User.update_account!(userNew)
95
+
96
+ guid = new_user.guid
97
+ # Create array with entered email for set_collaborators! method
98
+ emails = [settings.email]
99
+ document = file.to_document
100
+ # Make request to Ant api for set new user as annotation collaborator
101
+ addCollaborator = document.set_collaborators!(emails)
102
+ getCollaborator = document.collaborators!
103
+ getCollaborator.each do |reviewer|
104
+ reviewer.access_rights = %w(view)
105
+ end
106
+ setReviewers = document.set_reviewers! getCollaborator
107
+ if setReviewers
108
+ case settings.base_path
109
+ when 'https://stage-api-groupdocs.dynabic.com'
110
+ iframe = "https://stage-api-groupdocs.dynabic.com/document-annotation2/embed/#{file.guid}?&uid=#{guid}&download=true"
111
+ when 'https://dev-api-groupdocs.dynabic.com'
112
+ iframe = "https://dev-apps.groupdocs.com//document-annotation2/embed/#{file.guid}?&uid=#{guid}&download=true"
113
+ else
114
+ iframe = "https://apps.groupdocs.com//document-annotation2/embed/#{file.guid}?&uid=#{guid}&download=true"
115
+ end
116
+ # Construct result string
117
+ url = GroupDocs::Api::Request.new(:path => iframe).prepare_and_sign_url
118
+ iframe = "<iframe src='#{url}' width='800' height='1000'></iframe>"
119
+ end
120
+ end
121
+
122
+ rescue Exception => e
123
+ err = e.message
124
+ end
125
+
126
+ # set variables for template
127
+ haml :sample38, :locals => {:userId => settings.client_id, :fileId => file.guid, :privateKey => settings.private_key, :iframe => iframe, :email => settings.email, :firstName => settings.first_name, :lastName => settings.last_name, :err => err}
128
+ end
@@ -0,0 +1,252 @@
1
+ # GET request
2
+ get '/sample39' do
3
+ haml :sample39
4
+ end
5
+
6
+ # GET request
7
+ get '/popup' do
8
+ haml :popup
9
+ end
10
+
11
+ # POST request
12
+ post '/sample39/signature_callback' do
13
+ begin
14
+ # Get callback request
15
+ data = JSON.parse(request.body.read)
16
+
17
+ raise 'Empty params!' if data.empty?
18
+ source_id = nil
19
+ client_id = nil
20
+ private_key = nil
21
+
22
+ # Get value of SourceId
23
+ data.each do |key, value|
24
+ if key == 'SourceId'
25
+ source_id = value
26
+ end
27
+ end
28
+
29
+ # Get private key and client_id from file user_info.txt
30
+ if File.exist?("#{File.dirname(__FILE__)}/../public/user_info.txt")
31
+ contents = File.read("#{File.dirname(__FILE__)}/../public/user_info.txt")
32
+ contents = contents.split(' ')
33
+ client_id = contents.first
34
+ private_key = contents.last
35
+ end
36
+
37
+ # Create Job instance
38
+ job = GroupDocs::Signature::Envelope.new({:id => source_id})
39
+
40
+ # Get document by job id
41
+ documents = job.documents!({}, {:client_id => client_id, :private_key => private_key}).first
42
+
43
+ # Get guid from file
44
+ guid = documents.file.guid
45
+
46
+ # Create new file callback_info.txt and write the guid document
47
+ out_file = File.new("#{File.dirname(__FILE__)}/../public/callback_info.txt", 'w')
48
+ # White space is required
49
+ out_file.write("#{guid}")
50
+ out_file.close
51
+
52
+ rescue Exception => e
53
+ err = e.message
54
+ end
55
+ end
56
+
57
+ # POST request
58
+ post '/sample39/check' do
59
+ begin
60
+ result = nil
61
+ i = 0
62
+ for i in 1..10
63
+ i +=1
64
+
65
+ # Check is downloads folder exist
66
+ if File.exist?("#{File.dirname(__FILE__)}/../public/callback_info.txt")
67
+ result = File.read("#{File.dirname(__FILE__)}/../public/callback_info.txt")
68
+ if result.nil? then break end
69
+ end
70
+ sleep(5)
71
+ end
72
+
73
+ # Check result
74
+ if result == 'Error'
75
+ result = "File was not found. Looks like something went wrong."
76
+ else
77
+ result
78
+ end
79
+
80
+ rescue Exception => e
81
+ err = e.message
82
+ end
83
+ end
84
+
85
+
86
+ # POST request
87
+ post '/sample39/postdata' do
88
+
89
+ data = request.body.read
90
+ # Decode ajax data
91
+ json_post_data = JSON.parse(data);
92
+ # Get Client ID
93
+ clientId = json_post_data['userId'];
94
+ # Get Private Key
95
+ privateKey = json_post_data['privateKey'];
96
+ #Get document for sign
97
+ documents = json_post_data['documents'];
98
+ # Get signature file
99
+ signers = json_post_data['signers'];
100
+ def strict_decode64(str)
101
+ str.unpack("m0").first
102
+ end
103
+ # Documents local path
104
+ document_path = "#{File.dirname(__FILE__)}/../public/downloads/#{documents[0]['name']}"
105
+ signer_path = "#{File.dirname(__FILE__)}/../public/downloads/#{signers[0]['name']}.png"
106
+
107
+ # Get base64 string
108
+ base64_documents = documents[0]['data'].split(',').last
109
+ base64_signers = signers[0]['data'].split(',').last
110
+
111
+ # Write to the files decode base64 strings
112
+ File.open(document_path, 'wb') do |f|
113
+ f.write(Base64.strict_decode64(base64_documents))
114
+ end
115
+
116
+ File.open(signer_path, 'wb') do |f|
117
+ f.write(Base64.strict_decode64(base64_signers))
118
+ end
119
+
120
+ # Set document for signing
121
+ documents = GroupDocs::Storage::File.new(:name=>documents[0]['name'], :local_path=>document_path).to_document
122
+ # Set signature
123
+ signers = GroupDocs::Signature.new(:name=>signers[0]['name'], :image_path=>signer_path)
124
+ signers.position = {top: 0.83319, left: 0.72171, width: 100, height: 40}
125
+
126
+ # Make request to sign documnet
127
+ signDocument = GroupDocs::Document.sign_documents!([documents], [signers], {}, {:client_id=>clientId, :private_key=>privateKey})
128
+ sleep(5)
129
+ # Get the document guid
130
+ document = GroupDocs::Signature.sign_document_status!(signDocument, {:client_id=>clientId, :private_key=>privateKey})
131
+ # Get file GUID
132
+ guid = document.guid
133
+ # Create array with result data
134
+ result = ['guid' => guid,'clientId' => clientId,'privateKey' => privateKey]
135
+ # Decode array to json and return json string to ajax request
136
+ result.to_json
137
+ end
138
+
139
+
140
+ # POST request
141
+ post '/sample39' do
142
+ # set variables
143
+ set :client_id, params[:clientId]
144
+ set :private_key, params[:privateKey]
145
+ set :name, params[:name]
146
+ set :email, params[:email]
147
+ set :callback, params[:callbackUrl]
148
+ set :last_name, params[:lastName]
149
+
150
+ # Set download path
151
+ downloads_path = "#{File.dirname(__FILE__)}/../public/downloads"
152
+
153
+ # Remove all files from download directory or create folder if it not there
154
+ if File.directory?(downloads_path)
155
+ Dir.foreach(downloads_path) { |f| fn = File.join(downloads_path, f); File.delete(fn) if f != '.' && f != '..' }
156
+ else
157
+ Dir::mkdir(downloads_path)
158
+ end
159
+
160
+ begin
161
+ # check required variables
162
+ raise 'Please enter all required parameters' if settings.client_id.empty? or settings.private_key.empty? or settings.name.empty? or settings.email.empty? or settings.last_name.empty?
163
+
164
+ # Configure your access to API server
165
+ GroupDocs.configure do |groupdocs|
166
+ groupdocs.client_id = settings.client_id
167
+ groupdocs.private_key = settings.private_key
168
+ end
169
+
170
+ # Write client and private key to the file for callback job
171
+ if settings.callback[0]
172
+ out_file = File.new("#{File.dirname(__FILE__)}/../public/user_info.txt", 'w')
173
+ # white space is required
174
+ out_file.write("#{settings.client_id} ")
175
+ out_file.write("#{settings.private_key}")
176
+ out_file.close
177
+ end
178
+
179
+ # Construct path
180
+ file_path = "#{Dir.tmpdir}/#{params[:file][:filename]}"
181
+ # Open file
182
+ File.open(file_path, 'wb') { |f| f.write(params[:file][:tempfile].read) }
183
+ # Make a request to API using client_id and private_key
184
+ file = GroupDocs::Storage::File.upload!(file_path)
185
+ document = file.to_document
186
+
187
+
188
+ # create envelope using user id and entered by user name
189
+ envelope = GroupDocs::Signature::Envelope.new
190
+ envelope.name = file.name
191
+ envelope.email_subject = 'Sing this!'
192
+ envelope.create!
193
+
194
+ # Add uploaded document to envelope
195
+ envelope.add_document!(document)
196
+
197
+ # Get role list for current user
198
+ roles = GroupDocs::Signature::Role.get!
199
+
200
+ # Create new recipient
201
+ recipient = GroupDocs::Signature::Recipient.new
202
+ recipient.email = settings.email
203
+ recipient.first_name = settings.name
204
+ recipient.last_name = settings.last_name
205
+ recipient.role_id = roles.detect { |role| role.name == 'Signer' }.id
206
+
207
+ # Add recipient to envelope
208
+ add = envelope.add_recipient!(recipient)
209
+
210
+ # Get recipient id
211
+ recipient.id = add[:recipient][:id]
212
+
213
+ # Get document id
214
+ document = envelope.documents!()
215
+
216
+
217
+ # Get field and add the location to field
218
+ field = GroupDocs::Signature::Field.get!().detect { |f| f.type == :signature }
219
+ field.location = {:location_x => 0.15, :location_y => 0.73, :location_w => 150, :location_h => 50, :page => 1}
220
+ field.name = 'EMPLOYEE SIGNATURE'
221
+
222
+ # Add field to envelope
223
+ envelope.add_field!(field, document[0], recipient, {})
224
+
225
+
226
+ # Send envelop
227
+ envelope.send!({:callbackUrl => settings.callback})
228
+
229
+
230
+ #Get url from request
231
+ url = "https://apps.groupdocs.com/signature/signembed/#{envelope.id}/#{recipient.id}"
232
+
233
+ iframe = GroupDocs::Api::Request.new(:path => url).prepare_and_sign_url
234
+ # Make iframe
235
+ iframe = "<iframe id='downloadframe' src='#{iframe}' width='800' height='1000'></iframe>"
236
+
237
+
238
+ rescue Exception => e
239
+ err = e.message
240
+ end
241
+
242
+ # set variables for template
243
+ haml :sample39, :locals => {:userId => settings.client_id,
244
+ :privateKey => settings.private_key,
245
+ :callback => settings.callback,
246
+ :email => settings.email,
247
+ :name => settings.name,
248
+ :lastName => settings.last_name,
249
+ :iframe => iframe,
250
+ :err => err}
251
+ end
252
+