unione-ruby 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -3
- data/Rakefile +3 -0
- data/examples/api/domain.rb +2 -2
- data/examples/api/email.rb +34 -19
- data/examples/api/project.rb +27 -10
- data/examples/api/system.rb +10 -0
- data/examples/api/template.rb +24 -18
- data/examples/api/unsubscribed.rb +8 -6
- data/examples/api/webhook.rb +26 -19
- data/examples/sending_mail.rb +32 -0
- data/examples/setup.rb +27 -0
- data/lib/unione/client.rb +12 -9
- data/lib/unione/client/domain.rb +0 -3
- data/lib/unione/client/email.rb +1 -9
- data/lib/unione/client/project.rb +40 -22
- data/lib/unione/client/system.rb +24 -0
- data/lib/unione/client/template.rb +3 -2
- data/lib/unione/client/webhook.rb +30 -3
- data/lib/unione/connection.rb +17 -13
- data/lib/unione/helpers/mail/mail.rb +9 -4
- data/lib/unione/helpers/template/template.rb +2 -1
- data/lib/unione/helpers/webhook/webhook.rb +2 -1
- data/lib/unione/validation.rb +1 -6
- data/lib/unione/version.rb +1 -1
- metadata +7 -4
- data/examples/1_setup.rb +0 -25
- data/examples/2_mail_sending.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e22befdd1f1c883aea070dc4fc563186de323067b32d3d5d9f992185b6f2daed
|
4
|
+
data.tar.gz: 95d1729d578640a7853b44498198a4253a587270344ba3b1893452e28489c4b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2679550487b3d69e2bb922309a9581d3f6905f534a5d3a809e957ee7797fed443124c9454a1449e3983538daa88a94860c91153d630da1aef34ba7970586c647
|
7
|
+
data.tar.gz: 363db7dd049ddd4921de5ef64354b741b9353db1423cc2bace4a0ea99c460b6656531aeef371846cda6aaf17abe7c88b82115da2f54ab3d8483802858cb64f66
|
data/README.md
CHANGED
@@ -3,12 +3,16 @@ UniOne (unione.io) integration gem for Ruby
|
|
3
3
|
|
4
4
|
[Examples of usage](https://github.com/unione-repo/unione-ruby/tree/master/examples)
|
5
5
|
|
6
|
+
## Install
|
7
|
+
|
8
|
+
gem install unione-ruby
|
9
|
+
|
6
10
|
## Working with API responses
|
7
11
|
This library using [faraday](https://github.com/lostisland/faraday) gem for making HTTP queries along with [mashify middleware](https://github.com/hashie/hashie#mash) for post-processing response body. So, you can use extended syntax for accessing response fields.
|
8
12
|
|
9
13
|
Example of work with responses:
|
10
14
|
|
11
|
-
|
15
|
+
~~~ruby
|
12
16
|
require 'unione-ruby'
|
13
17
|
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
14
18
|
response = unione.get_dns_records("example.com")
|
@@ -18,6 +22,12 @@ puts response.headers
|
|
18
22
|
# Access fields as hash or as methods
|
19
23
|
puts response.body['status']
|
20
24
|
puts response.body.status
|
25
|
+
~~~
|
26
|
+
|
27
|
+
By default authentication produced through X-API-KEY header. For passing API key in params use:
|
28
|
+
|
29
|
+
```
|
30
|
+
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'], api_key_in_params: true)
|
21
31
|
```
|
22
32
|
|
23
33
|
## Handling API errors
|
@@ -25,7 +35,7 @@ Library using [`raise-error' middleware](https://lostisland.github.io/faraday/mi
|
|
25
35
|
|
26
36
|
Example of work with errors:
|
27
37
|
|
28
|
-
|
38
|
+
~~~ruby
|
29
39
|
require 'unione-ruby'
|
30
40
|
begin
|
31
41
|
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
@@ -39,4 +49,4 @@ rescue Faraday::Error => e
|
|
39
49
|
puts e.response[:body]
|
40
50
|
puts e.response[:headers]
|
41
51
|
end
|
42
|
-
|
52
|
+
~~~
|
data/Rakefile
ADDED
data/examples/api/domain.rb
CHANGED
@@ -9,10 +9,10 @@ puts response.body.to_h
|
|
9
9
|
puts response.headers
|
10
10
|
|
11
11
|
# Validate domain verification record before use
|
12
|
-
response = unione.validate_verification_record(
|
12
|
+
response = unione.validate_verification_record('example.com')
|
13
13
|
|
14
14
|
# Validate DKIM signature before sending
|
15
|
-
response = unione.validate_dkim(
|
15
|
+
response = unione.validate_dkim('example.com')
|
16
16
|
|
17
17
|
# Get a list of your domains and their verification/DKIM statuses
|
18
18
|
response = unione.list_domains
|
data/examples/api/email.rb
CHANGED
@@ -1,36 +1,51 @@
|
|
1
1
|
require 'unione-ruby'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
|
4
|
+
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
+
|
6
|
+
# sending mail
|
5
7
|
mail = UniOne::Mail.new
|
6
|
-
mail.body = {html: "<b>Hello {{substitutionName}}</b>"}
|
7
|
-
mail.from = {from_email: 'test@example.com', from_name: 'userName'}
|
8
|
-
mail.subject = 'Email Subject'
|
9
|
-
mail.template = {"template_engine" => "simple", "template_id" => "template_id"}
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
mail.subject = 'Email Subject'
|
10
|
+
mail.from = { from_email: 'test@qadns.net', from_name: 'userName' }
|
11
|
+
|
12
|
+
# Using body
|
13
|
+
mail.body = { html: '<b>Hello {{substitutionName}}</b>' }
|
14
|
+
|
15
|
+
# Using template
|
16
|
+
# mail.template = { template_engine: 'simple', template_id: 'template_id' }
|
17
|
+
|
18
|
+
substitutions = { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname 1' }
|
19
|
+
recipient1 = { email: 'test1@example.com', substitutions: substitutions, metadata: { key1: 'val1' } }
|
13
20
|
mail.recipients << recipient1
|
14
21
|
|
15
|
-
substitutions = {
|
16
|
-
recipient2
|
22
|
+
substitutions = { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname 2' }
|
23
|
+
recipient2 = { email: 'test2@example.com', substitutions: substitutions, metadata: { key1: 'val1' } }
|
17
24
|
mail.recipients << recipient2
|
18
25
|
|
19
|
-
mail.
|
20
|
-
mail.headers = {
|
21
|
-
mail.
|
22
|
-
mail.
|
23
|
-
|
26
|
+
mail.global_metadata = { key1: 'val1' }
|
27
|
+
mail.headers = { 'X-ReplyTo' => 'reply@qadns.net' }
|
28
|
+
mail.track = { track_links: 1, track_read: 1 }
|
29
|
+
mail.options = { unsubscribe_url: 'someurl' }
|
30
|
+
|
31
|
+
# Should have rights to use this option
|
32
|
+
# mail.skip_unsubscribe = 1
|
33
|
+
mail.force_send = 0
|
34
|
+
|
35
|
+
mail.attachments << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
|
36
|
+
mail.inline_attachments << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
|
24
37
|
|
25
38
|
puts mail.to_json
|
26
39
|
|
27
|
-
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
28
40
|
response = unione.send_email(mail.to_json)
|
41
|
+
|
29
42
|
puts response.status
|
30
43
|
puts response.body
|
31
44
|
puts response.headers
|
32
45
|
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
46
|
+
# subscribe email
|
47
|
+
response = unione.subscribe_email(
|
48
|
+
from_email: 'from@qadns.net',
|
49
|
+
from_name: 'Example Sender',
|
50
|
+
to_email: 'blackhole@example.com'
|
51
|
+
)
|
data/examples/api/project.rb
CHANGED
@@ -1,20 +1,37 @@
|
|
1
1
|
require 'unione-ruby'
|
2
2
|
|
3
|
-
# Create project
|
4
3
|
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
-
|
6
|
-
|
4
|
+
|
5
|
+
# create project
|
6
|
+
response = unione.create_project({
|
7
|
+
name: 'Project Name',
|
8
|
+
send_enabled: true,
|
9
|
+
# custom_unsubscribe_url_enabled: true, # Should have rights to use
|
10
|
+
})
|
11
|
+
|
7
12
|
puts response.status
|
8
13
|
puts response.body.to_h
|
9
14
|
puts response.headers
|
10
15
|
|
11
|
-
|
12
|
-
response = unione.update_project("5qugsquc85i1e87xfb4spgxh8bnmi1pjfrtx1w1c",
|
13
|
-
{"name" => "Projectname 2", "send_enabled" => true, "custom_unsubscribe_url_enabled" => true})
|
16
|
+
project_id = response.body.project_id
|
14
17
|
|
15
|
-
#
|
16
|
-
response = unione.
|
18
|
+
# update project
|
19
|
+
response = unione.update_project(
|
20
|
+
{
|
21
|
+
project_id: project_id
|
22
|
+
},
|
23
|
+
{
|
24
|
+
name: 'New Project Name',
|
25
|
+
send_enabled: true,
|
26
|
+
# custom_unsubscribe_url_enabled: true, # Should have rights to use
|
27
|
+
}
|
28
|
+
)
|
17
29
|
|
18
|
-
#
|
30
|
+
# list all projects
|
19
31
|
response = unione.list_projects
|
20
|
-
|
32
|
+
|
33
|
+
# list project by id
|
34
|
+
response = unione.list_projects({ project_id: project_id })
|
35
|
+
|
36
|
+
# delete project
|
37
|
+
response = unione.delete_project({ project_id: project_id })
|
data/examples/api/template.rb
CHANGED
@@ -1,36 +1,42 @@
|
|
1
1
|
require 'unione-ruby'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
|
4
|
+
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
+
|
6
|
+
# set template
|
5
7
|
template = UniOne::Template.new
|
6
|
-
|
7
|
-
template.
|
8
|
+
|
9
|
+
template.name = 'Template Name'
|
10
|
+
template.editor_type = 'html'
|
11
|
+
template.subject = 'Email Subject'
|
8
12
|
template.template_engine = 'simple'
|
9
|
-
template.global_substitutions = {"someVar" => "someVal"}
|
10
13
|
|
11
|
-
template.
|
12
|
-
|
13
|
-
template.
|
14
|
+
template.global_substitutions = { 'someVar' => 'someVal' }
|
15
|
+
|
16
|
+
template.from = { from_email: 'test@example.com', from_name: 'userName' }
|
17
|
+
template.headers = { 'X-ReplyTo' => 'reply@example.com' }
|
18
|
+
template.body = { html: '<b>Hello {{substitutionName}}</b>' }
|
19
|
+
template.options = { unsubscribe_url: 'someurl' }
|
14
20
|
|
15
|
-
template.attachments
|
16
|
-
template.inline_attachments << {
|
17
|
-
template.options = {"unsubscribe_url" => "someurl"}
|
21
|
+
template.attachments << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
|
22
|
+
template.inline_attachments << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
|
18
23
|
|
19
24
|
puts template.to_json
|
20
25
|
|
21
|
-
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
22
26
|
response = unione.set_template(template.to_json)
|
27
|
+
|
23
28
|
puts response.status
|
24
29
|
puts response.body.to_h
|
25
|
-
puts response.body.template.id # Get Id of created template for later referencing
|
26
30
|
puts response.headers
|
27
31
|
|
28
|
-
#
|
29
|
-
|
30
|
-
|
32
|
+
# get id of created template
|
33
|
+
template_id = response.body.template.id
|
34
|
+
|
35
|
+
# get template
|
36
|
+
response = unione.get_template(template_id)
|
31
37
|
|
32
|
-
#
|
38
|
+
# list all templates
|
33
39
|
response = unione.list_templates(50, 0)
|
34
40
|
|
35
|
-
#
|
36
|
-
response = unione.delete_template(
|
41
|
+
# delete template
|
42
|
+
response = unione.delete_template(template_id)
|
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'unione-ruby'
|
2
2
|
|
3
|
-
# Unsubscribe subscriber
|
4
3
|
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
-
|
4
|
+
|
5
|
+
# unsubscribe email
|
6
|
+
response = unione.unsubscribe('email@example.com')
|
7
|
+
|
6
8
|
puts response.status
|
7
9
|
puts response.body.to_h
|
8
10
|
puts response.headers
|
9
11
|
|
10
|
-
#
|
11
|
-
response = unione.check_unsubscribed(
|
12
|
+
# check email is unsubscribed
|
13
|
+
response = unione.check_unsubscribed('email@example.com')
|
12
14
|
|
13
|
-
#
|
14
|
-
response = unione.list_unsubscribed(
|
15
|
+
# list unsubscribed emails
|
16
|
+
response = unione.list_unsubscribed('2019-01-01')
|
data/examples/api/webhook.rb
CHANGED
@@ -1,32 +1,39 @@
|
|
1
1
|
require 'unione-ruby'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
|
4
|
+
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
+
|
6
|
+
# set webhook
|
5
7
|
webhook = UniOne::Webhook.new
|
6
|
-
|
7
|
-
webhook.
|
8
|
-
webhook.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
|
9
|
+
webhook.url = 'http://example.com'
|
10
|
+
webhook.status = :active
|
11
|
+
|
12
|
+
webhook.settings = {
|
13
|
+
event_format: :json_post,
|
14
|
+
delivery_info: 1,
|
15
|
+
single_event: 0,
|
16
|
+
max_parallel: 10
|
17
|
+
}
|
18
|
+
|
19
|
+
webhook.events = {
|
20
|
+
email_status: %w(sent delivered opened hard_bounced soft_bounced spam clicked unsubscribed),
|
21
|
+
spam_block: ["*"]
|
22
|
+
}
|
18
23
|
|
19
24
|
puts webhook.to_json
|
20
25
|
|
21
|
-
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
22
26
|
response = unione.set_webhook(webhook.to_json)
|
27
|
+
|
23
28
|
puts response.status
|
24
29
|
puts response.body.to_h
|
25
30
|
puts response.headers
|
26
31
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
32
|
+
# get webhook
|
33
|
+
response = unione.get_webhook('http://example.com')
|
34
|
+
|
35
|
+
# list all webhooks
|
36
|
+
response = unione.list_webhooks(50, 0)
|
30
37
|
|
31
|
-
#
|
32
|
-
response = unione.delete_webhook(
|
38
|
+
# delete webhook
|
39
|
+
response = unione.delete_webhook('http://example.com')
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'unione-ruby'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
+
|
6
|
+
mail = UniOne::Mail.new
|
7
|
+
|
8
|
+
template_id = "bc0372d4-69f2-11eb-9d14-366b3a36c9e1"
|
9
|
+
mail.template = { template_engine: 'simple', template_id: template_id }
|
10
|
+
|
11
|
+
mail.from = { from_email: 'test@qadns.net', from_name: 'userName' }
|
12
|
+
|
13
|
+
substitutions = { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname 1' }
|
14
|
+
recipient = { email: 'test1@example.com', substitutions: substitutions, metadata: { key1: 'val1' } }
|
15
|
+
mail.recipients << recipient
|
16
|
+
|
17
|
+
substitutions = { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname 2' }
|
18
|
+
recipient = { email: 'test2@example.com', substitutions: substitutions, metadata: { key1: 'val1' } }
|
19
|
+
mail.recipients << recipient
|
20
|
+
|
21
|
+
mail.global_metadata = { key1: 'val1' }
|
22
|
+
mail.headers = { 'X-ReplyTo' => 'reply@example.com' }
|
23
|
+
mail.options = { unsubscribe_url: 'someurl' }
|
24
|
+
|
25
|
+
mail.attachments << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
|
26
|
+
mail.inline_attachments << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
|
27
|
+
|
28
|
+
response = unione.send_email(mail.to_json)
|
29
|
+
|
30
|
+
puts response.status
|
31
|
+
puts response.body.to_h
|
32
|
+
puts response.headers
|
data/examples/setup.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'unione-ruby'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
+
|
6
|
+
# Validate domain verification record
|
7
|
+
unione.validate_verification_record('example.com')
|
8
|
+
|
9
|
+
# Create template
|
10
|
+
template = UniOne::Template.new
|
11
|
+
|
12
|
+
template.name = 'Template Name'
|
13
|
+
template.subject = 'Email Subject'
|
14
|
+
template.template_engine = 'simple'
|
15
|
+
template.headers = { 'X-ReplyTo' => 'reply@example.com' }
|
16
|
+
template.global_substitutions = { 'someVar' => 'someVal' }
|
17
|
+
|
18
|
+
template.from = { from_email: 'test@example.com', from_name: 'userName' }
|
19
|
+
template.body = { html: '<b>Hello {{substitutionName}}</b>' }
|
20
|
+
|
21
|
+
template.attachments << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
|
22
|
+
template.inline_attachments << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
|
23
|
+
|
24
|
+
template.options = { unsubscribe_url: 'someurl' }
|
25
|
+
|
26
|
+
response = unione.set_template(template.to_json)
|
27
|
+
template_id = response.body.template.id
|
data/lib/unione/client.rb
CHANGED
@@ -2,10 +2,11 @@ require_relative 'connection'
|
|
2
2
|
require_relative 'validation'
|
3
3
|
require_relative 'client/domain'
|
4
4
|
require_relative 'client/email'
|
5
|
+
require_relative 'client/project'
|
6
|
+
require_relative 'client/system'
|
5
7
|
require_relative 'client/template'
|
6
|
-
require_relative 'client/webhook'
|
7
8
|
require_relative 'client/unsubscribed'
|
8
|
-
require_relative 'client/
|
9
|
+
require_relative 'client/webhook'
|
9
10
|
|
10
11
|
module UniOne
|
11
12
|
|
@@ -15,10 +16,11 @@ module UniOne
|
|
15
16
|
include UniOne::Validation
|
16
17
|
include UniOne::Client::Domain
|
17
18
|
include UniOne::Client::Email
|
19
|
+
include UniOne::Client::Project
|
20
|
+
include UniOne::Client::System
|
18
21
|
include UniOne::Client::Template
|
19
|
-
include UniOne::Client::Webhook
|
20
22
|
include UniOne::Client::Unsubscribed
|
21
|
-
include UniOne::Client::
|
23
|
+
include UniOne::Client::Webhook
|
22
24
|
|
23
25
|
API_ENDPOINT =
|
24
26
|
'https://%{data_center}.unione.io/%{lang}/transactional/api/v1/'
|
@@ -27,11 +29,12 @@ module UniOne
|
|
27
29
|
# - +data_center+ -> data center: ['eu1', 'us1']
|
28
30
|
# - +lang+ -> Two-letter ISO 639-1 language abbreviation, e.g. 'en'
|
29
31
|
# - +api_key+ -> your UniOne API key
|
30
|
-
#
|
31
|
-
def initialize(
|
32
|
-
@data_center
|
33
|
-
@lang
|
34
|
-
@api_key
|
32
|
+
# - +api_key_in_params+ -> boolean, pass API key inside form, otherwise pass in headers (default in headers)
|
33
|
+
def initialize(params = {})
|
34
|
+
@data_center = params[:data_center]
|
35
|
+
@lang = params[:lang]
|
36
|
+
@api_key = params[:api_key]
|
37
|
+
@api_key_in_params = !!params[:api_key_in_params]
|
35
38
|
end
|
36
39
|
|
37
40
|
private
|
data/lib/unione/client/domain.rb
CHANGED
data/lib/unione/client/email.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module UniOne
|
2
2
|
class Client
|
3
|
-
|
4
3
|
module Email
|
5
|
-
|
6
4
|
def send_email(message)
|
7
5
|
post 'email/send.json', message
|
8
6
|
validate_response({
|
@@ -14,19 +12,13 @@ module UniOne
|
|
14
12
|
})
|
15
13
|
end
|
16
14
|
|
17
|
-
def subscribe_email(
|
18
|
-
params = {
|
19
|
-
email_address_from: email_address_from,
|
20
|
-
email_address_to: email_address_to,
|
21
|
-
name_from: name_from
|
22
|
-
}
|
15
|
+
def subscribe_email(params)
|
23
16
|
post 'email/subscribe.json', params
|
24
17
|
validate_response({
|
25
18
|
'type' => 'object', 'required' => ['status'], 'properties' => {
|
26
19
|
'status' => {'type' => 'string'}}
|
27
20
|
})
|
28
21
|
end
|
29
|
-
|
30
22
|
end
|
31
23
|
end
|
32
24
|
end
|
@@ -1,55 +1,73 @@
|
|
1
1
|
module UniOne
|
2
2
|
class Client
|
3
|
-
|
4
3
|
module Project
|
5
|
-
|
6
4
|
def create_project(project)
|
7
5
|
params = { project: project }
|
8
6
|
post 'project/create.json', params
|
9
7
|
validate_response({
|
10
|
-
'type' => 'object', 'required' => ['status', 'project_api_key'], 'properties' => {
|
8
|
+
'type' => 'object', 'required' => ['status', 'project_id', 'project_api_key'], 'properties' => {
|
11
9
|
'status' => {'type' => 'string'},
|
10
|
+
'project_id' => {'type' => 'string'},
|
12
11
|
'project_api_key' => {'type' => 'string'}}
|
13
12
|
})
|
14
13
|
end
|
15
14
|
|
16
|
-
def update_project(
|
17
|
-
params =
|
15
|
+
def update_project(project_identity, project)
|
16
|
+
params = get_identity(project_identity).merge(project: project)
|
18
17
|
post 'project/update.json', params
|
19
18
|
validate_response({
|
20
|
-
'type' => 'object', 'required' => ['status'
|
19
|
+
'type' => 'object', 'required' => ['status'], 'properties' => {
|
21
20
|
'status' => {'type' => 'string'},
|
22
21
|
'project_api_key' => {'type' => 'string'}}
|
23
22
|
})
|
24
23
|
end
|
25
24
|
|
26
|
-
def
|
27
|
-
params =
|
28
|
-
post 'project/
|
25
|
+
def list_projects(project_identity = nil)
|
26
|
+
params = get_identity(project_identity)
|
27
|
+
post 'project/list.json', params
|
29
28
|
validate_response({
|
30
|
-
'type'
|
31
|
-
|
29
|
+
'type' => 'object',
|
30
|
+
'required' => %w{ status },
|
31
|
+
'properties' => {
|
32
|
+
'status' => { 'type' => 'string' },
|
33
|
+
'projects' => { 'items' => project_schema }
|
34
|
+
}
|
32
35
|
})
|
33
36
|
end
|
34
37
|
|
35
|
-
def
|
36
|
-
params =
|
37
|
-
post 'project/
|
38
|
+
def delete_project(project_identity)
|
39
|
+
params = get_identity(project_identity)
|
40
|
+
post 'project/delete.json', params
|
38
41
|
validate_response({
|
39
|
-
'type'
|
40
|
-
|
41
|
-
|
42
|
+
'type' => 'object',
|
43
|
+
'required' => %w{ status },
|
44
|
+
'properties' => {
|
45
|
+
'status' => { 'type' => 'string' }
|
46
|
+
}
|
42
47
|
})
|
43
48
|
end
|
44
49
|
|
45
50
|
private
|
46
51
|
|
52
|
+
def get_identity(project_identity)
|
53
|
+
if project_identity.is_a?(Hash)
|
54
|
+
project_identity
|
55
|
+
elsif project_identity
|
56
|
+
{ project_api_key: project_identity }
|
57
|
+
else
|
58
|
+
{}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
47
62
|
def project_schema
|
48
|
-
{'type'
|
49
|
-
|
50
|
-
|
51
|
-
'
|
52
|
-
'
|
63
|
+
{'type' => 'object',
|
64
|
+
'required' => %w{ id api_key name reg_time send_enabled custom_unsubscribe_url_enabled },
|
65
|
+
'properties' => {
|
66
|
+
'id' => {'type' => 'string'},
|
67
|
+
'api_key' => {'type' => 'string'},
|
68
|
+
'name' => {'type' => 'string'},
|
69
|
+
'reg_time' => {'type' => 'string'},
|
70
|
+
'send_enabled' => {'type' => 'boolean'},
|
53
71
|
'custom_unsubscribe_url_enabled' => {'type' => 'boolean'}
|
54
72
|
}}
|
55
73
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module UniOne
|
2
|
+
class Client
|
3
|
+
module System
|
4
|
+
def info
|
5
|
+
post 'system/info.json', {}
|
6
|
+
validate_response({
|
7
|
+
'type' => 'object', 'required' => ['status', 'user_id', 'email'], 'properties' => {
|
8
|
+
'status' => {'type' => 'string'},
|
9
|
+
'user_id' => {'type' => 'integer'},
|
10
|
+
'email' => {'type' => 'string'},
|
11
|
+
'accounting' =>
|
12
|
+
{'type' => 'object', 'required' => ['period_start', 'period_end', 'emails_included', 'emails_sent'], 'properties' => [
|
13
|
+
'period_start' => {'type' => 'string'},
|
14
|
+
'period_end' => {'type' => 'string'},
|
15
|
+
'emails_included' => {'type' => 'integer'},
|
16
|
+
'emails_sent' => {'type' => 'integer'}
|
17
|
+
]},
|
18
|
+
'project_id' => {'type' => 'string'},
|
19
|
+
'project_name' => {'type' => 'string'}}
|
20
|
+
})
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -45,10 +45,11 @@ module UniOne
|
|
45
45
|
private
|
46
46
|
|
47
47
|
def template_schema
|
48
|
-
{'type' => 'object', 'required' => ['id', 'name', 'subject', 'from_name', 'body', 'headers', 'attachments',
|
49
|
-
'inline_attachments', '
|
48
|
+
{'type' => 'object', 'required' => ['id', 'name', 'editor_type', 'subject', 'from_name', 'body', 'headers', 'attachments',
|
49
|
+
'inline_attachments', 'created', 'user_id'], 'properties' => {
|
50
50
|
'id' => {'type' => 'string'},
|
51
51
|
'name' => {'type' => 'string'},
|
52
|
+
'editor_type' => {'type' => 'string'},
|
52
53
|
'subject' => {'type' => 'string'},
|
53
54
|
'from_name' => {'type' => 'string'},
|
54
55
|
'body' => template_body_schema,
|
@@ -21,6 +21,31 @@ module UniOne
|
|
21
21
|
}})
|
22
22
|
end
|
23
23
|
|
24
|
+
def list_webhooks(limit, offset)
|
25
|
+
params = { limit: limit, offset: offset }
|
26
|
+
post 'webhook/list.json', params
|
27
|
+
validate_response({
|
28
|
+
'type' => 'object', 'required' => ['status', 'objects'], 'properties' => {
|
29
|
+
'status' => {'type' => 'string'},
|
30
|
+
'objects' =>
|
31
|
+
{'items' =>
|
32
|
+
{'type' => 'object', 'required' => ['id', 'url', 'status', 'updated_at', 'events', 'event_format', 'delivery_info', 'single_event', 'max_parallel'], 'properties' => [
|
33
|
+
'id' => {'type' => 'integer'},
|
34
|
+
'url' => {'type' => 'string'},
|
35
|
+
'status' => {'type' => 'string'},
|
36
|
+
'updated_at' => {'type' => 'string'},
|
37
|
+
'events' =>
|
38
|
+
{'type' => 'object', 'required' => ['email_status', 'spam_block'], 'properties' => [
|
39
|
+
'email_status' => {'items' => {'type' => 'string'}},
|
40
|
+
'spam_block' => {'items' => {'type' => 'string'}}]},
|
41
|
+
'event_format' => {'type' => 'string'},
|
42
|
+
'delivery_info' => {'type' => 'integer'},
|
43
|
+
'single_event' => {'type' => 'integer'},
|
44
|
+
'max_parallel' => {'type' => 'integer'}
|
45
|
+
]}}}
|
46
|
+
})
|
47
|
+
end
|
48
|
+
|
24
49
|
def delete_webhook(url)
|
25
50
|
params = { url: url }
|
26
51
|
post 'webhook/delete.json', params
|
@@ -32,13 +57,15 @@ module UniOne
|
|
32
57
|
private
|
33
58
|
|
34
59
|
def webhook_schema
|
35
|
-
{'type' => 'object', 'required' => ['url', 'events', 'event_format', 'delivery_info', 'single_event', 'max_parallel'], 'properties' => {
|
60
|
+
{'type' => 'object', 'required' => ['url', 'status', 'events', 'event_format', 'delivery_info', 'single_event', 'max_parallel'], 'properties' => {
|
61
|
+
'id' => {'type' => 'integer'},
|
36
62
|
'url' => {'type' => 'string'},
|
37
|
-
'
|
63
|
+
'status' => {'type' => 'string'},
|
38
64
|
'event_format' => {'type' => 'string'},
|
39
65
|
'delivery_info' => {'type' => 'integer'},
|
40
66
|
'single_event' => {'type' => 'integer'},
|
41
|
-
'max_parallel' => {'type' => 'integer'}
|
67
|
+
'max_parallel' => {'type' => 'integer'},
|
68
|
+
'events' => webhook_events_schema,
|
42
69
|
}}
|
43
70
|
end
|
44
71
|
|
data/lib/unione/connection.rb
CHANGED
@@ -7,33 +7,33 @@ module UniOne
|
|
7
7
|
module Connection
|
8
8
|
|
9
9
|
def get(url, params)
|
10
|
-
|
10
|
+
prepare_params!(params)
|
11
|
+
|
11
12
|
# Assume HTTP library receives params as Hash
|
12
|
-
request
|
13
|
+
request(:get, url, params)
|
13
14
|
end
|
14
15
|
|
15
16
|
def post(url, params)
|
16
|
-
|
17
|
+
prepare_params!(params)
|
18
|
+
|
17
19
|
# Assume HTTP library receives payload body as String
|
18
|
-
request
|
20
|
+
request(:post, url, JSON.dump(params))
|
19
21
|
end
|
20
22
|
|
21
23
|
private
|
22
24
|
|
23
25
|
def request(method, path, data)
|
24
26
|
path = add_version(path)
|
25
|
-
|
26
|
-
@last_response = conn.send(method, path, data)
|
27
|
-
rescue Faraday::Error => e
|
28
|
-
puts e.response[:body]
|
29
|
-
raise
|
30
|
-
end
|
27
|
+
@last_response = conn.send(method, path, data)
|
31
28
|
end
|
32
29
|
|
33
30
|
def conn
|
31
|
+
headers = {'Content-Type' => 'application/json'}
|
32
|
+
prepare_headers!(headers)
|
33
|
+
|
34
34
|
@conn ||= Faraday.new(
|
35
35
|
url: api_endpoint,
|
36
|
-
headers:
|
36
|
+
headers: headers,
|
37
37
|
request: { timeout: 30 }
|
38
38
|
) do |conn|
|
39
39
|
conn.response :mashify, content_type: /\bjson$/
|
@@ -43,8 +43,12 @@ module UniOne
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
def
|
47
|
-
{
|
46
|
+
def prepare_params!(params)
|
47
|
+
params.merge!({api_key: @api_key}) if @api_key_in_params
|
48
|
+
end
|
49
|
+
|
50
|
+
def prepare_headers!(headers)
|
51
|
+
headers.merge!('X-API-KEY' => @api_key) unless @api_key_in_params
|
48
52
|
end
|
49
53
|
|
50
54
|
def add_version(path)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module UniOne
|
2
2
|
class Mail
|
3
|
-
attr_accessor :template, :body, :track, :from, :subject, :
|
3
|
+
attr_accessor :template, :body, :track, :from, :subject, :global_metadata, :headers, :options,
|
4
4
|
:global_substitutions, :recipients, :attachments, :inline_attachments,
|
5
|
-
:reply_to
|
5
|
+
:reply_to, :skip_unsubscribe, :force_send
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@template = {}
|
@@ -14,6 +14,9 @@ module UniOne
|
|
14
14
|
@inline_attachments = []
|
15
15
|
end
|
16
16
|
|
17
|
+
# backward compatibility
|
18
|
+
alias_method :"metadata=", :"global_metadata="
|
19
|
+
|
17
20
|
def to_json(*)
|
18
21
|
{
|
19
22
|
message: {
|
@@ -22,11 +25,13 @@ module UniOne
|
|
22
25
|
subject: self.subject,
|
23
26
|
reply_to: self.reply_to,
|
24
27
|
recipients: self.recipients,
|
25
|
-
|
28
|
+
global_metadata: self.global_metadata,
|
26
29
|
headers: self.headers,
|
27
30
|
attachments: self.attachments,
|
28
31
|
inline_attachments: self.inline_attachments,
|
29
|
-
options: self.options
|
32
|
+
options: self.options,
|
33
|
+
skip_unsubscribe: self.skip_unsubscribe,
|
34
|
+
force_send: self.force_send
|
30
35
|
}.merge(self.template)
|
31
36
|
.merge(self.from)
|
32
37
|
.merge(self.track)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module UniOne
|
2
2
|
class Template
|
3
|
-
attr_accessor :name, :subject, :template_engine, :global_substitutions, :from,
|
3
|
+
attr_accessor :name, :editor_type, :subject, :template_engine, :global_substitutions, :from,
|
4
4
|
:headers, :body, :attachments, :inline_attachments, :options
|
5
5
|
|
6
6
|
def initialize
|
@@ -15,6 +15,7 @@ module UniOne
|
|
15
15
|
template: {
|
16
16
|
id: '',
|
17
17
|
name: self.name,
|
18
|
+
editor_type: self.editor_type,
|
18
19
|
subject: self.subject,
|
19
20
|
template_engine: self.template_engine,
|
20
21
|
global_substitutions: self.global_substitutions,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module UniOne
|
2
2
|
class Webhook
|
3
|
-
attr_accessor :url, :settings, :events
|
3
|
+
attr_accessor :url, :status, :settings, :events
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@settings = {}
|
@@ -9,6 +9,7 @@ module UniOne
|
|
9
9
|
def to_json(*)
|
10
10
|
{
|
11
11
|
url: self.url,
|
12
|
+
status: self.status,
|
12
13
|
events: self.events
|
13
14
|
}.merge(self.settings)
|
14
15
|
.delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {}}
|
data/lib/unione/validation.rb
CHANGED
@@ -6,12 +6,7 @@ module UniOne
|
|
6
6
|
private
|
7
7
|
|
8
8
|
def validate_response(schema)
|
9
|
-
|
10
|
-
JSON::Validator.validate!(schema, @last_response.body)
|
11
|
-
rescue JSON::Schema::ValidationError => e
|
12
|
-
puts @last_response.body
|
13
|
-
raise
|
14
|
-
end
|
9
|
+
JSON::Validator.validate!(schema, @last_response.body)
|
15
10
|
@last_response
|
16
11
|
end
|
17
12
|
|
data/lib/unione/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unione-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- UniOne developer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -102,19 +102,22 @@ extra_rdoc_files: []
|
|
102
102
|
files:
|
103
103
|
- LICENSE
|
104
104
|
- README.md
|
105
|
-
-
|
106
|
-
- examples/2_mail_sending.rb
|
105
|
+
- Rakefile
|
107
106
|
- examples/api/domain.rb
|
108
107
|
- examples/api/email.rb
|
109
108
|
- examples/api/project.rb
|
109
|
+
- examples/api/system.rb
|
110
110
|
- examples/api/template.rb
|
111
111
|
- examples/api/unsubscribed.rb
|
112
112
|
- examples/api/webhook.rb
|
113
|
+
- examples/sending_mail.rb
|
114
|
+
- examples/setup.rb
|
113
115
|
- lib/unione-ruby.rb
|
114
116
|
- lib/unione/client.rb
|
115
117
|
- lib/unione/client/domain.rb
|
116
118
|
- lib/unione/client/email.rb
|
117
119
|
- lib/unione/client/project.rb
|
120
|
+
- lib/unione/client/system.rb
|
118
121
|
- lib/unione/client/template.rb
|
119
122
|
- lib/unione/client/unsubscribed.rb
|
120
123
|
- lib/unione/client/webhook.rb
|
data/examples/1_setup.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'unione-ruby'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
-
|
6
|
-
# Validate domain verification record
|
7
|
-
unione.validate_verification_record("example.com")
|
8
|
-
|
9
|
-
# Create template
|
10
|
-
template = UniOne::Template.new
|
11
|
-
template.name = 'Template Name'
|
12
|
-
template.subject = 'Email Subject'
|
13
|
-
template.template_engine = 'simple'
|
14
|
-
template.global_substitutions = {"someVar" => "someVal"}
|
15
|
-
|
16
|
-
template.from = {from_email: 'test@example.com', from_name: 'userName'}
|
17
|
-
template.headers = {"X-ReplyTo" => "reply@example.com"}
|
18
|
-
template.body = {html: "<b>Hello {{substitutionName}}</b>"}
|
19
|
-
|
20
|
-
template.attachments << {"type" => "text/plain", "name" => "myfile.txt", "content" => "ZXhhbXBsZSBmaWxl"}
|
21
|
-
template.inline_attachments << {"type" => "image/png", "name" => "IMAGECID", "content" => "iVBORw0KGgo"}
|
22
|
-
template.options = {"unsubscribe_url" => "someurl"}
|
23
|
-
|
24
|
-
response = unione.set_template(template.to_json)
|
25
|
-
template_id = response.body.template.id
|
data/examples/2_mail_sending.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'unione-ruby'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
unione = UniOne::Client.new(data_center: 'eu1', lang: 'en', api_key: ENV['UNIONE_API_KEY'])
|
5
|
-
|
6
|
-
mail = UniOne::Mail.new
|
7
|
-
mail.template = {"template_engine" => "simple", "template_id" => template_id}
|
8
|
-
|
9
|
-
substitutions = {"substitutionName" => "substitutionVal", "to_name" => "Name Surname 1"}
|
10
|
-
recipient = {email: 'test1@example.com', substitutions: substitutions, metadata: {"key1" => "val1"}}
|
11
|
-
mail.recipients << recipient
|
12
|
-
|
13
|
-
substitutions = {"substitutionName" => "substitutionVal", "to_name" => "Name Surname 2"}
|
14
|
-
recipient = {email: 'test2@example.com', substitutions: substitutions, metadata: {"key1" => "val1"}}
|
15
|
-
mail.recipients << recipient
|
16
|
-
|
17
|
-
mail.metadata = {"key1" => "val1"}
|
18
|
-
mail.headers = {"X-ReplyTo" => "reply@example.com"}
|
19
|
-
mail.attachments << {"type" => "text/plain", "name" => "myfile.txt", "content" => "ZXhhbXBsZSBmaWxl"}
|
20
|
-
mail.inline_attachments << {"type" => "image/png", "name" => "IMAGECID", "content" => "iVBORw0KGgo"}
|
21
|
-
mail.options = {"unsubscribe_url" => "someurl"}
|
22
|
-
|
23
|
-
unione.send_email(mail.to_json)
|