notifications-ruby-client 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/DOCUMENTATION.md +83 -0
- data/bin/test_client.rb +74 -1
- data/lib/notifications/client.rb +13 -0
- data/lib/notifications/client/helper_methods.rb +9 -0
- data/lib/notifications/client/speaker.rb +18 -1
- data/lib/notifications/client/uuid_validator.rb +0 -1
- data/lib/notifications/client/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ee6c91540f71825cf6b96f6eb7e170383c2841bdc499bf45b625c2b0d48525c
|
4
|
+
data.tar.gz: eec0b7042a42330d7ab776eb39815928359a07ac732504738a64db5f2f06bf54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e310f4d25c85ac58d741076fd586b0b6720e49f916ad500d47dbc781dc0e5023375231f1b8ff121523b0a154b34bf00ef1f8a27b3e62347c8b0fb6402889f04e
|
7
|
+
data.tar.gz: 97c23e6f67ccee843ae3534bd209e7a295322c87c43381109291bd8b78dc1b7dbe4f9b86d465ecfd1b51fc05be49c3af93c64acca9b786b6a2f6d80c4088df2d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 2.9.0
|
2
|
+
|
3
|
+
* Added the `send_precompiled_letter` method which allows the client to send letters as PDF files.
|
4
|
+
* This requires two arguments - a reference for the letter and the PDF letter file. The file must conform to the Notify printing template.
|
5
|
+
* Added support for document uploads using the `send_email` method.
|
6
|
+
|
1
7
|
## 2.8.0
|
2
8
|
|
3
9
|
* Updated the Template class to have a `name` property, which is the name of the template as set in Notify.
|
data/DOCUMENTATION.md
CHANGED
@@ -207,6 +207,36 @@ email_reply_to_id: '8e222534-7f05-4972-86e3-17c5d9f894e2'
|
|
207
207
|
|
208
208
|
You can leave out this argument if your service only has one email reply-to address, or you want to use the default email address.
|
209
209
|
|
210
|
+
### Send a document by email
|
211
|
+
Send files without the need for email attachments.
|
212
|
+
|
213
|
+
To send a document by email, add a placeholder field to the template then upload a file. The placeholder field will contain a secure link to download the document.
|
214
|
+
|
215
|
+
[Contact the GOV.UK Notify team](https://www.notifications.service.gov.uk/support) to enable this function for your service.
|
216
|
+
|
217
|
+
#### Add a placeholder field to the template
|
218
|
+
|
219
|
+
In Notify, use double brackets to add a placeholder field to the email template. For example:
|
220
|
+
|
221
|
+
"Download your document at: ((link_to_document))"
|
222
|
+
|
223
|
+
#### Upload your document
|
224
|
+
|
225
|
+
The document you upload must be a PDF file smaller than 2MB.
|
226
|
+
|
227
|
+
Pass the file object as an argument to the `Notifications.prepare_upload` helper method. Then pass the result into the personalisation argument. For example:
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
File.open("file.pdf", "rb") do |f|
|
231
|
+
...
|
232
|
+
personalisation: {
|
233
|
+
first_name: "Amala",
|
234
|
+
application_date: "2018-01-01",
|
235
|
+
link_to_document: Notifications.prepare_upload(f),
|
236
|
+
}
|
237
|
+
end
|
238
|
+
```
|
239
|
+
|
210
240
|
### Response
|
211
241
|
|
212
242
|
If the request to the client is successful, the client returns a `Notifications::Client:ResponseNotification` object. In the example shown in the [Method section](/ruby.html#send-an-email-method), the object is named `emailresponse`.
|
@@ -229,11 +259,14 @@ If the request is not successful, the client returns a `Notifications::Client::R
|
|
229
259
|
|:--- |:---|:---|
|
230
260
|
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Can't send to this recipient using a team-only API key"`<br>`]}`|Use the correct type of [API key](/ruby.html#api-keys)|
|
231
261
|
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Can't send to this recipient when service is in trial mode - see https://www.notifications.service.gov.uk/trial-mode"`<br>`}]`|Your service cannot send this notification in [trial mode](https://www.notifications.service.gov.uk/features/using-notify#trial-mode)|
|
262
|
+
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Unsupported document type '{}'. Supported types are: {}"`<br>`}]`|The document you upload must be a PDF file|
|
263
|
+
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Document didn't pass the virus scan"`<br>`}]`|The document you upload must be virus free|
|
232
264
|
|`403`|`[{`<br>`"error": "AuthError",`<br>`"message": "Error: Your system clock must be accurate to within 30 seconds"`<br>`}]`|Check your system clock|
|
233
265
|
|`403`|`[{`<br>`"error": "AuthError",`<br>`"message": "Invalid token: signature, api token not found"`<br>`}]`|Use the correct API key. Refer to [API keys](/ruby.html#api-keys) for more information|
|
234
266
|
|`429`|`[{`<br>`"error": "RateLimitError",`<br>`"message": "Exceeded rate limit for key type TEAM/TEST/LIVE of 3000 requests per 60 seconds"`<br>`}]`|Refer to [API rate limits](/ruby.html#api-rate-limits) for more information|
|
235
267
|
|`429`|`[{`<br>`"error": "TooManyRequestsError",`<br>`"message": "Exceeded send limits (LIMIT NUMBER) for today"`<br>`}]`|Refer to [service limits](/ruby.html#service-limits) for the limit number|
|
236
268
|
|`500`|`[{`<br>`"error": "Exception",`<br>`"message": "Internal server error"`<br>`}]`|Notify was unable to process the request, resend your notification|
|
269
|
+
|-|`[{`<br>`"error": "ArgumentError",`<br>`"message": "Document is larger than 2MB")`<br>`}]`|Document size was too large, upload a smaller document|
|
237
270
|
|
238
271
|
## Send a letter
|
239
272
|
|
@@ -338,6 +371,56 @@ If the request is not successful, the client returns a `Notifications::Client::R
|
|
338
371
|
|`429`|`[{`<br>`"error": "TooManyRequestsError",`<br>`"message": "Exceeded send limits (LIMIT NUMBER) for today"`<br>`}]`|Refer to [service limits](/ruby.html#service-limits) for the limit number|
|
339
372
|
|`500`|`[{`<br>`"error": "Exception",`<br>`"message": "Internal server error"`<br>`}]`|Notify was unable to process the request, resend your notification|
|
340
373
|
|
374
|
+
## Send a pre-compiled letter
|
375
|
+
This is an invitation-only feature. Contact the GOV.UK Notify team on the [support page](https://www.notifications.service.gov.uk/support) or through the [Slack channel](https://ukgovernmentdigital.slack.com/messages/govuk-notify) for more information.
|
376
|
+
|
377
|
+
### Method
|
378
|
+
```ruby
|
379
|
+
precompiled_letter = client.send_precompiled_letter(reference, pdf_file)
|
380
|
+
```
|
381
|
+
|
382
|
+
### Arguments
|
383
|
+
|
384
|
+
#### reference (required)
|
385
|
+
A unique identifier you create. This reference identifies a single unique notification or a batch of notifications. It must not contain any personal information such as name or postal address.
|
386
|
+
|
387
|
+
#### pdf_file (required)
|
388
|
+
The pre-compiled letter must be a PDF file.
|
389
|
+
|
390
|
+
```ruby
|
391
|
+
File.open("path/to/pdf_file", "rb") do |pdf_file|
|
392
|
+
client.send_precompiled_letter("your reference", pdf_file)
|
393
|
+
end
|
394
|
+
```
|
395
|
+
|
396
|
+
### Response
|
397
|
+
|
398
|
+
If the request to the client is successful, the client returns a `Notifications::Client:ResponseNotification` object. In the example shown in the [Method section](/ruby.html#send-a-pre-compiled-letter-method), the object is named `precompiled_letter`.
|
399
|
+
|
400
|
+
You can then call different methods on this object to return the requested information.
|
401
|
+
|
402
|
+
|Method|Information|Type|
|
403
|
+
|:---|:---|:---|
|
404
|
+
|`precompiled_letter.id`|Notification UUID|String|
|
405
|
+
|`precompiled_letter.reference`|`reference` argument|String|
|
406
|
+
|`precompiled_letter.content`|Always `nil`|nil|
|
407
|
+
|`precompiled_letter.template`|Always `nil`|nil|
|
408
|
+
|`precompiled_letter.uri`|Always `nil`|nil|
|
409
|
+
|
410
|
+
### Error codes
|
411
|
+
|
412
|
+
If the request is not successful, the client returns a `Notifications::Client::RequestError` and an error code.
|
413
|
+
|
414
|
+
|error.status_code|error.message|How to fix|
|
415
|
+
|:---|:---|:---|
|
416
|
+
|`429`|`[{`<br>`"error": "RateLimitError",`<br>`"message": "Exceeded rate limit for key type live of 10 requests per 20 seconds"`<br>`}]`|Use the correct API key. Refer to [API keys](#api-keys) for more information|
|
417
|
+
|`429`|`[{`<br>`"error": "TooManyRequestsError",`<br>`"message": "Exceeded send limits (50) for today"`<br>`}]`|Refer to [service limits](#service-limits) for the limit number|
|
418
|
+
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Cannot send letters with a team api key"`<br>`]}`|Use the correct type of [API key](#api-keys)|
|
419
|
+
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Cannot send precompiled letters"`<br>`]}`|This is an invitation-only feature. Contact the GOV.UK Notify team on the [support page](https://www.notifications.service.gov.uk/support) or through the [Slack channel](https://ukgovernmentdigital.slack.com/messages/govuk-notify) for more information|
|
420
|
+
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Letter content is not a valid PDF"`<br>`]}`|PDF file format is required|
|
421
|
+
|`400`|`[{`<br>`"error": "BadRequestError",`<br>`"message": "Cannot send letters when service is in trial mode - see https://www.notifications.service.gov.uk/trial-mode"`<br>`}]`|Your service cannot send this notification in [trial mode](https://www.notifications.service.gov.uk/features/using-notify#trial-mode)|
|
422
|
+
|`400`|`[{`<br>`"error": "ValidationError",`<br>`"message": "reference is a required property"`<br>`}]`|Add a `reference` argument to the method call|
|
423
|
+
|
341
424
|
# Get message status
|
342
425
|
|
343
426
|
Message status depends on the type of message that you have sent.
|
data/bin/test_client.rb
CHANGED
@@ -9,11 +9,15 @@ def main
|
|
9
9
|
test_get_all_templates_filter_by_type(client)
|
10
10
|
test_generate_template_preview(client, ENV['EMAIL_TEMPLATE_ID'])
|
11
11
|
email_notification = test_send_email_endpoint(client)
|
12
|
+
email_notification_with_document = test_send_email_endpoint_with_document(client)
|
12
13
|
sms_notification = test_send_sms_endpoint(client)
|
13
14
|
letter_notification = test_send_letter_endpoint(client)
|
15
|
+
precompiled_letter_notification = test_send_precompiled_letter_endpoint(client)
|
14
16
|
test_get_notification_by_id_endpoint(client, email_notification.id, 'email')
|
17
|
+
test_get_notification_by_id_endpoint(client, email_notification_with_document.id, 'email')
|
15
18
|
test_get_notification_by_id_endpoint(client, sms_notification.id, 'sms')
|
16
19
|
test_get_notification_by_id_endpoint(client, letter_notification.id, 'letter')
|
20
|
+
test_get_notification_by_id_endpoint(client, precompiled_letter_notification.id, 'precompiled_letter')
|
17
21
|
test_get_all_notifications(client)
|
18
22
|
test_get_received_texts
|
19
23
|
p 'ruby client integration tests pass'
|
@@ -97,6 +101,19 @@ def test_send_email_endpoint(client)
|
|
97
101
|
email_resp
|
98
102
|
end
|
99
103
|
|
104
|
+
def test_send_email_endpoint_with_document(client)
|
105
|
+
email_resp = File.open('spec/test_files/test_pdf.pdf', 'rb') do |f|
|
106
|
+
client.send_email(email_address: ENV['FUNCTIONAL_TEST_EMAIL'],
|
107
|
+
template_id: ENV['EMAIL_TEMPLATE_ID'],
|
108
|
+
personalisation: { name: Notifications.prepare_upload(f) },
|
109
|
+
reference: "some reference",
|
110
|
+
email_reply_to_id: ENV['EMAIL_REPLY_TO_ID'])
|
111
|
+
end
|
112
|
+
|
113
|
+
test_notification_response_data_type(email_resp, 'email')
|
114
|
+
email_resp
|
115
|
+
end
|
116
|
+
|
100
117
|
def test_send_sms_endpoint(client)
|
101
118
|
sms_resp = client.send_sms(phone_number: ENV['FUNCTIONAL_TEST_NUMBER'], template_id: ENV['SMS_TEMPLATE_ID'],
|
102
119
|
personalisation: { "name" => "some name" },
|
@@ -120,6 +137,16 @@ def test_send_letter_endpoint(client)
|
|
120
137
|
letter_resp
|
121
138
|
end
|
122
139
|
|
140
|
+
def test_send_precompiled_letter_endpoint(client)
|
141
|
+
precompiled_letter_resp = File.open('spec/test_files/test_pdf.pdf', 'rb') do |file|
|
142
|
+
client.send_precompiled_letter("some reference", file)
|
143
|
+
end
|
144
|
+
|
145
|
+
test_notification_response_data_type(precompiled_letter_resp, 'precompiled_letter')
|
146
|
+
|
147
|
+
precompiled_letter_resp
|
148
|
+
end
|
149
|
+
|
123
150
|
def test_notification_response_data_type(notification, message_type)
|
124
151
|
unless notification.is_a?(Notifications::Client::ResponseNotification)
|
125
152
|
p 'failed ' + message_type + ' response is not a Notifications::Client::ResponseNotification'
|
@@ -129,6 +156,12 @@ def test_notification_response_data_type(notification, message_type)
|
|
129
156
|
p 'failed ' + message_type + 'id is not a String'
|
130
157
|
exit 1
|
131
158
|
end
|
159
|
+
|
160
|
+
if message_type == 'precompiled_letter'
|
161
|
+
field_should_not_be_nil(expected_fields_in_precompiled_letter_response, notification, 'send_precompiled_letter')
|
162
|
+
return
|
163
|
+
end
|
164
|
+
|
132
165
|
field_should_not_be_nil(expected_fields_in_notification_response, notification, 'send_' + message_type)
|
133
166
|
hash_key_should_not_be_nil(expected_fields_in_template, notification.send('template'), 'send_' + message_type + '.template')
|
134
167
|
|
@@ -161,6 +194,10 @@ def test_get_notification_by_id_endpoint(client, id, message_type)
|
|
161
194
|
field_should_not_be_nil(expected_fields_in_letter_notification, get_notification_response, 'Notifications::Client::Notification for type letter')
|
162
195
|
field_should_be_nil(expected_fields_in_letter_notification_that_are_nil, get_notification_response, 'Notifications::Client::Notification for type letter')
|
163
196
|
hash_key_should_not_be_nil(expected_fields_in_template, get_notification_response.send('template'), 'Notifications::Client::Notification.template for type letter')
|
197
|
+
elsif message_type == 'precompiled_letter'
|
198
|
+
field_should_not_be_nil(expected_fields_in_precompiled_letter_notification, get_notification_response, 'Notifications::Client::Notification for type precompiled letter')
|
199
|
+
field_should_be_nil(expected_fields_in_precompiled_letter_notification_that_are_nil, get_notification_response, 'Notifications::Client::Notification for type precompiled letter')
|
200
|
+
hash_key_should_not_be_nil(expected_fields_in_template, get_notification_response.send('template'), 'Notifications::Client::Notification.template for type precompiled letter')
|
164
201
|
end
|
165
202
|
end
|
166
203
|
|
@@ -216,6 +253,11 @@ def expected_fields_in_notification_response
|
|
216
253
|
uri)
|
217
254
|
end
|
218
255
|
|
256
|
+
def expected_fields_in_precompiled_letter_response
|
257
|
+
%w(id
|
258
|
+
reference)
|
259
|
+
end
|
260
|
+
|
219
261
|
def expected_fields_in_email_content
|
220
262
|
%w(from_email
|
221
263
|
body
|
@@ -223,7 +265,8 @@ def expected_fields_in_email_content
|
|
223
265
|
end
|
224
266
|
|
225
267
|
def expected_fields_in_sms_content
|
226
|
-
%w(body
|
268
|
+
%w(body
|
269
|
+
from_number)
|
227
270
|
end
|
228
271
|
|
229
272
|
def expected_fields_in_letter_content
|
@@ -309,6 +352,36 @@ def expected_fields_in_letter_notification_that_are_nil
|
|
309
352
|
)
|
310
353
|
end
|
311
354
|
|
355
|
+
def expected_fields_in_precompiled_letter_notification
|
356
|
+
%w(
|
357
|
+
body
|
358
|
+
created_at
|
359
|
+
id
|
360
|
+
line_1
|
361
|
+
reference
|
362
|
+
status
|
363
|
+
subject
|
364
|
+
template
|
365
|
+
type
|
366
|
+
)
|
367
|
+
end
|
368
|
+
|
369
|
+
def expected_fields_in_precompiled_letter_notification_that_are_nil
|
370
|
+
%w(
|
371
|
+
completed_at
|
372
|
+
created_by_name
|
373
|
+
email_address
|
374
|
+
line_2
|
375
|
+
line_3
|
376
|
+
line_4
|
377
|
+
line_5
|
378
|
+
line_6
|
379
|
+
phone_number
|
380
|
+
postcode
|
381
|
+
sent_at
|
382
|
+
)
|
383
|
+
end
|
384
|
+
|
312
385
|
def expected_fields_in_template
|
313
386
|
%w(id
|
314
387
|
version
|
data/lib/notifications/client.rb
CHANGED
@@ -9,6 +9,7 @@ require_relative "client/response_template"
|
|
9
9
|
require_relative "client/template_collection"
|
10
10
|
require_relative "client/template_preview"
|
11
11
|
require_relative "client/uuid_validator"
|
12
|
+
require_relative "client/helper_methods"
|
12
13
|
require "forwardable"
|
13
14
|
|
14
15
|
module Notifications
|
@@ -16,6 +17,7 @@ module Notifications
|
|
16
17
|
attr_reader :speaker
|
17
18
|
|
18
19
|
PRODUCTION_BASE_URL = "https://api.notifications.service.gov.uk".freeze
|
20
|
+
MAX_FILE_UPLOAD_SIZE = 2 * 1024 * 1024 # 2MB limit on uploaded documents
|
19
21
|
|
20
22
|
extend Forwardable
|
21
23
|
def_delegators :speaker, :service_id, :secret_token, :base_url, :base_url=
|
@@ -53,6 +55,17 @@ module Notifications
|
|
53
55
|
)
|
54
56
|
end
|
55
57
|
|
58
|
+
##
|
59
|
+
# @param reference [String]
|
60
|
+
# @param pdf_file [File]
|
61
|
+
# @see Notifications::Client::Speaker#post_precompiled_letter
|
62
|
+
# @return [ResponseNotification]
|
63
|
+
def send_precompiled_letter(reference, pdf_file)
|
64
|
+
ResponseNotification.new(
|
65
|
+
speaker.post_precompiled_letter(reference, pdf_file)
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
56
69
|
##
|
57
70
|
# @param id [String]
|
58
71
|
# @see Notifications::Client::Speaker#get
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require "base64"
|
1
2
|
require "net/https"
|
2
3
|
require "uri"
|
3
4
|
require "jwt"
|
@@ -95,6 +96,22 @@ module Notifications
|
|
95
96
|
perform_request!(request)
|
96
97
|
end
|
97
98
|
|
99
|
+
##
|
100
|
+
# @param reference [String] reference of the notification
|
101
|
+
# @param pdf_file [File] PDF file opened for reading
|
102
|
+
# @see #perform_request!
|
103
|
+
def post_precompiled_letter(reference, pdf_file)
|
104
|
+
content = Base64.strict_encode64(pdf_file.read)
|
105
|
+
form_data = { reference: reference, content: content }
|
106
|
+
|
107
|
+
request = Net::HTTP::Post.new(
|
108
|
+
"#{BASE_PATH}/letter",
|
109
|
+
headers
|
110
|
+
)
|
111
|
+
request.body = form_data.to_json
|
112
|
+
perform_request!(request)
|
113
|
+
end
|
114
|
+
|
98
115
|
private
|
99
116
|
|
100
117
|
##
|
@@ -103,7 +120,7 @@ module Notifications
|
|
103
120
|
# not successful
|
104
121
|
def perform_request!(request)
|
105
122
|
response = open(request)
|
106
|
-
if response.is_a?(Net::HTTPClientError)
|
123
|
+
if response.is_a?(Net::HTTPClientError) || response.is_a?(Net::HTTPServerError)
|
107
124
|
raise RequestError.new(response)
|
108
125
|
else
|
109
126
|
JSON.parse(response.body)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notifications-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Government Digital Service
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- docker/Dockerfile
|
141
141
|
- docker/Makefile
|
142
142
|
- lib/notifications/client.rb
|
143
|
+
- lib/notifications/client/helper_methods.rb
|
143
144
|
- lib/notifications/client/notification.rb
|
144
145
|
- lib/notifications/client/notifications_collection.rb
|
145
146
|
- lib/notifications/client/received_text.rb
|