mailerlite-ruby 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.env.example +1 -0
- data/.github/workflows/main.yml +17 -0
- data/.github/workflows/publish_gem.yml +21 -0
- data/.gitignore +60 -0
- data/.rspec +1 -0
- data/.rubocop.yml +36 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +801 -0
- data/Rakefile +8 -0
- data/bin/console +8 -0
- data/bin/setup +8 -0
- data/fixtures/automations/fetch.yml +61 -0
- data/fixtures/automations/get.yml +68 -0
- data/fixtures/automations/get_subscriber_activity.yml +71 -0
- data/fixtures/batch/request.yml +59 -0
- data/fixtures/campaigns/activity.yml +64 -0
- data/fixtures/campaigns/create.yml +65 -0
- data/fixtures/campaigns/delete.yml +53 -0
- data/fixtures/campaigns/fetch.yml +64 -0
- data/fixtures/campaigns/get.yml +68 -0
- data/fixtures/campaigns/languages.yml +60 -0
- data/fixtures/campaigns/schedule.yml +160 -0
- data/fixtures/campaigns/update.yml +159 -0
- data/fixtures/fields/create.yml +57 -0
- data/fixtures/fields/delete.yml +53 -0
- data/fixtures/fields/get.yml +60 -0
- data/fixtures/fields/update.yml +57 -0
- data/fixtures/forms/delete.yml +53 -0
- data/fixtures/forms/fetch.yml +60 -0
- data/fixtures/forms/fetch_subscribers.yml +59 -0
- data/fixtures/forms/list.yml +62 -0
- data/fixtures/forms/update.yml +60 -0
- data/fixtures/groups/assign_subscriber.yml +58 -0
- data/fixtures/groups/create.yml +58 -0
- data/fixtures/groups/delete.yml +53 -0
- data/fixtures/groups/get.yml +63 -0
- data/fixtures/groups/get_subscribers.yml +62 -0
- data/fixtures/groups/unassign_subscriber.yml +53 -0
- data/fixtures/groups/update.yml +58 -0
- data/fixtures/segments/delete.yml +53 -0
- data/fixtures/segments/get_subscribers.yml +61 -0
- data/fixtures/segments/list.yml +60 -0
- data/fixtures/segments/update.yml +58 -0
- data/fixtures/subscribers/create.yml +57 -0
- data/fixtures/subscribers/delete.yml +51 -0
- data/fixtures/subscribers/fetch.yml +68 -0
- data/fixtures/subscribers/fetch_count.yml +55 -0
- data/fixtures/subscribers/get.yml +62 -0
- data/fixtures/timezones/list.yml +575 -0
- data/fixtures/webhooks/create.yml +58 -0
- data/fixtures/webhooks/delete.yml +53 -0
- data/fixtures/webhooks/get.yml +58 -0
- data/fixtures/webhooks/list.yml +61 -0
- data/fixtures/webhooks/update.yml +58 -0
- data/lib/mailerlite/automations/automations.rb +62 -0
- data/lib/mailerlite/batch/batch.rb +24 -0
- data/lib/mailerlite/campaigns/campaigns.rb +216 -0
- data/lib/mailerlite/client.rb +35 -0
- data/lib/mailerlite/fields/fields.rb +61 -0
- data/lib/mailerlite/forms/forms.rb +73 -0
- data/lib/mailerlite/groups/groups.rb +90 -0
- data/lib/mailerlite/segments/segments.rb +62 -0
- data/lib/mailerlite/subscribers/subscribers.rb +116 -0
- data/lib/mailerlite/timezones/timezones.rb +22 -0
- data/lib/mailerlite/version.rb +5 -0
- data/lib/mailerlite/webhooks/webhooks.rb +67 -0
- data/lib/mailerlite-ruby.rb +3 -0
- data/lib/mailerlite.rb +13 -0
- data/mailerlite-ruby.gemspec +42 -0
- data/renovate.json +5 -0
- data/spec/automations_rspec.rb +63 -0
- data/spec/batches_rspec.rb +41 -0
- data/spec/campaigns_rspec.rb +155 -0
- data/spec/fields_rspec.rb +70 -0
- data/spec/forms_rspec.rb +81 -0
- data/spec/groups_rspec.rb +97 -0
- data/spec/segments_rspec.rb +70 -0
- data/spec/spec_helper.rb +101 -0
- data/spec/subscribers_rspec.rb +84 -0
- data/spec/timezones_rspec.rb +36 -0
- data/spec/webhooks_rspec.rb +86 -0
- metadata +303 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://connect.mailerlite.com/api/webhooks
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"events":["subscriber.created"],"url":"http://foobar.hook","name":"test_webhook"}'
|
9
|
+
headers:
|
10
|
+
Authorization:
|
11
|
+
- "<AUTH>"
|
12
|
+
User-Agent:
|
13
|
+
- MailerLite-client-ruby/0.1.1
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Content-Type:
|
17
|
+
- application/json
|
18
|
+
Connection:
|
19
|
+
- close
|
20
|
+
Host:
|
21
|
+
- connect.mailerlite.com
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 201
|
25
|
+
message: Created
|
26
|
+
headers:
|
27
|
+
Date:
|
28
|
+
- Fri, 23 Dec 2022 21:51:54 GMT
|
29
|
+
Content-Type:
|
30
|
+
- application/json
|
31
|
+
Transfer-Encoding:
|
32
|
+
- chunked
|
33
|
+
Connection:
|
34
|
+
- close
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, private
|
37
|
+
X-Locale:
|
38
|
+
- en
|
39
|
+
X-Ratelimit-Limit:
|
40
|
+
- '120'
|
41
|
+
X-Ratelimit-Remaining:
|
42
|
+
- '117'
|
43
|
+
Access-Control-Allow-Origin:
|
44
|
+
- "*"
|
45
|
+
Strict-Transport-Security:
|
46
|
+
- max-age=15724800; includeSubDomains
|
47
|
+
Cf-Cache-Status:
|
48
|
+
- DYNAMIC
|
49
|
+
Server:
|
50
|
+
- cloudflare
|
51
|
+
Cf-Ray:
|
52
|
+
- 77e45238dbecde53-MCT
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: '{"data":{"id":"75321640600209302","name":"test_webhook","url":"http:\/\/foobar.hook","events":["subscriber.created"],"enabled":true,"secret":"HigkdhMVbp","created_at":"2022-12-23
|
56
|
+
21:51:54","updated_at":"2022-12-23 21:51:54"}}'
|
57
|
+
recorded_at: Fri, 23 Dec 2022 21:51:53 GMT
|
58
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: delete
|
5
|
+
uri: https://connect.mailerlite.com/api/webhooks/75321640600209302
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Authorization:
|
11
|
+
- "<AUTH>"
|
12
|
+
User-Agent:
|
13
|
+
- MailerLite-client-ruby/0.1.1
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Content-Type:
|
17
|
+
- application/json
|
18
|
+
Connection:
|
19
|
+
- close
|
20
|
+
Host:
|
21
|
+
- connect.mailerlite.com
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 204
|
25
|
+
message: No Content
|
26
|
+
headers:
|
27
|
+
Date:
|
28
|
+
- Fri, 23 Dec 2022 21:52:46 GMT
|
29
|
+
Connection:
|
30
|
+
- close
|
31
|
+
Cache-Control:
|
32
|
+
- no-cache, private
|
33
|
+
X-Locale:
|
34
|
+
- en
|
35
|
+
X-Ratelimit-Limit:
|
36
|
+
- '120'
|
37
|
+
X-Ratelimit-Remaining:
|
38
|
+
- '119'
|
39
|
+
Access-Control-Allow-Origin:
|
40
|
+
- "*"
|
41
|
+
Strict-Transport-Security:
|
42
|
+
- max-age=15724800; includeSubDomains
|
43
|
+
Cf-Cache-Status:
|
44
|
+
- DYNAMIC
|
45
|
+
Server:
|
46
|
+
- cloudflare
|
47
|
+
Cf-Ray:
|
48
|
+
- 77e453821df6de47-MCT
|
49
|
+
body:
|
50
|
+
encoding: ASCII-8BIT
|
51
|
+
string: ''
|
52
|
+
recorded_at: Fri, 23 Dec 2022 21:52:45 GMT
|
53
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://connect.mailerlite.com/api/webhooks/75321551702984317
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Authorization:
|
11
|
+
- "<AUTH>"
|
12
|
+
User-Agent:
|
13
|
+
- MailerLite-client-ruby/0.1.1
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Content-Type:
|
17
|
+
- application/json
|
18
|
+
Connection:
|
19
|
+
- close
|
20
|
+
Host:
|
21
|
+
- connect.mailerlite.com
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
Date:
|
28
|
+
- Fri, 23 Dec 2022 21:51:22 GMT
|
29
|
+
Content-Type:
|
30
|
+
- application/json
|
31
|
+
Transfer-Encoding:
|
32
|
+
- chunked
|
33
|
+
Connection:
|
34
|
+
- close
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, private
|
37
|
+
X-Locale:
|
38
|
+
- en
|
39
|
+
X-Ratelimit-Limit:
|
40
|
+
- '120'
|
41
|
+
X-Ratelimit-Remaining:
|
42
|
+
- '119'
|
43
|
+
Access-Control-Allow-Origin:
|
44
|
+
- "*"
|
45
|
+
Strict-Transport-Security:
|
46
|
+
- max-age=15724800; includeSubDomains
|
47
|
+
Cf-Cache-Status:
|
48
|
+
- DYNAMIC
|
49
|
+
Server:
|
50
|
+
- cloudflare
|
51
|
+
Cf-Ray:
|
52
|
+
- 77e45174ed1fd1f0-MCT
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: '{"data":{"id":"75321551702984317","name":"test_webhook","url":"http:\/\/foobar.hook","events":["subscriber.created"],"enabled":true,"secret":"pv04URxAE4","created_at":"2022-12-23
|
56
|
+
21:50:29","updated_at":"2022-12-23 21:50:29"}}'
|
57
|
+
recorded_at: Fri, 23 Dec 2022 21:51:21 GMT
|
58
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,61 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://connect.mailerlite.com/api/webhooks
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Authorization:
|
11
|
+
- "<AUTH>"
|
12
|
+
User-Agent:
|
13
|
+
- MailerLite-client-ruby/0.1.1
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Content-Type:
|
17
|
+
- application/json
|
18
|
+
Connection:
|
19
|
+
- close
|
20
|
+
Host:
|
21
|
+
- connect.mailerlite.com
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
Date:
|
28
|
+
- Fri, 23 Dec 2022 21:52:21 GMT
|
29
|
+
Content-Type:
|
30
|
+
- application/json
|
31
|
+
Transfer-Encoding:
|
32
|
+
- chunked
|
33
|
+
Connection:
|
34
|
+
- close
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, private
|
37
|
+
X-Locale:
|
38
|
+
- en
|
39
|
+
X-Ratelimit-Limit:
|
40
|
+
- '120'
|
41
|
+
X-Ratelimit-Remaining:
|
42
|
+
- '116'
|
43
|
+
Access-Control-Allow-Origin:
|
44
|
+
- "*"
|
45
|
+
Strict-Transport-Security:
|
46
|
+
- max-age=15724800; includeSubDomains
|
47
|
+
Cf-Cache-Status:
|
48
|
+
- DYNAMIC
|
49
|
+
Server:
|
50
|
+
- cloudflare
|
51
|
+
Cf-Ray:
|
52
|
+
- 77e452e6ae74de4f-MCT
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: '{"data":[{"id":"75321640600209302","name":"test_webhook","url":"http:\/\/foobar.hook","events":["subscriber.created"],"enabled":true,"secret":"HigkdhMVbp","created_at":"2022-12-23
|
56
|
+
21:51:54","updated_at":"2022-12-23 21:51:54"},{"id":"75321551702984317","name":"test_webhook","url":"http:\/\/foobar.hook","events":["subscriber.created"],"enabled":true,"secret":"pv04URxAE4","created_at":"2022-12-23
|
57
|
+
21:50:29","updated_at":"2022-12-23 21:50:29"}],"links":{"first":"https:\/\/connect.mailerlite.com\/api\/webhooks?page=1","last":"https:\/\/connect.mailerlite.com\/api\/webhooks?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"links":[{"url":null,"label":"«
|
58
|
+
Previous","active":false},{"url":"https:\/\/connect.mailerlite.com\/api\/webhooks?page=1","label":"1","active":true},{"url":null,"label":"Next
|
59
|
+
»","active":false}],"path":"https:\/\/connect.mailerlite.com\/api\/webhooks","per_page":50,"to":2,"total":2}}'
|
60
|
+
recorded_at: Fri, 23 Dec 2022 21:52:20 GMT
|
61
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: put
|
5
|
+
uri: https://connect.mailerlite.com/api/webhooks/75233700096247795
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"name":"test_webhook2"}'
|
9
|
+
headers:
|
10
|
+
Authorization:
|
11
|
+
- "<AUTH>"
|
12
|
+
User-Agent:
|
13
|
+
- MailerLite-client-ruby/0.1.1
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Content-Type:
|
17
|
+
- application/json
|
18
|
+
Connection:
|
19
|
+
- close
|
20
|
+
Host:
|
21
|
+
- connect.mailerlite.com
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
Date:
|
28
|
+
- Thu, 22 Dec 2022 22:35:04 GMT
|
29
|
+
Content-Type:
|
30
|
+
- application/json
|
31
|
+
Transfer-Encoding:
|
32
|
+
- chunked
|
33
|
+
Connection:
|
34
|
+
- close
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, private
|
37
|
+
X-Locale:
|
38
|
+
- en
|
39
|
+
X-Ratelimit-Limit:
|
40
|
+
- '120'
|
41
|
+
X-Ratelimit-Remaining:
|
42
|
+
- '117'
|
43
|
+
Access-Control-Allow-Origin:
|
44
|
+
- "*"
|
45
|
+
Strict-Transport-Security:
|
46
|
+
- max-age=15724800; includeSubDomains
|
47
|
+
Cf-Cache-Status:
|
48
|
+
- DYNAMIC
|
49
|
+
Server:
|
50
|
+
- cloudflare
|
51
|
+
Cf-Ray:
|
52
|
+
- 77dc54153eb8d1d8-MCT
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: '{"data":{"id":"75233700096247795","name":"test_webhook2","url":"http:\/\/foobar.hook","events":["subscriber.created"],"enabled":true,"secret":"Hym6hUN1bO","created_at":"2022-12-22
|
56
|
+
22:34:07","updated_at":"2022-12-22 22:35:04"}}'
|
57
|
+
recorded_at: Thu, 22 Dec 2022 22:35:03 GMT
|
58
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MailerLite
|
4
|
+
# This is a class for manipulating the Automation from MailerLite API.
|
5
|
+
class Automations
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
# Inits the `Automations` class with the specified `client`.
|
9
|
+
#
|
10
|
+
# @param client [MailerLite::Client] the `Client` instance to use
|
11
|
+
def initialize(client: MailerLite::Client.new)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns a list of Automations that match the specified filter criteria.
|
16
|
+
#
|
17
|
+
# @param filter[:status,:name,:group] [Array] filters for automation
|
18
|
+
# @param limit [Integer] the maximum number of Automations to return
|
19
|
+
# @param page [Integer] the page number of the results to return
|
20
|
+
# @return [HTTP::Response] the response from the API
|
21
|
+
def get(limit: nil, page: nil, filter: {})
|
22
|
+
params = {}
|
23
|
+
params['filter[status]'] = filter[:status] if filter.key?(:status)
|
24
|
+
params['filter[name]'] = filter[:name] if filter.key?(:name)
|
25
|
+
params['filter[group]'] = filter[:group] if filter.key?(:group)
|
26
|
+
params['limit'] = limit if limit
|
27
|
+
params['page'] = page if page
|
28
|
+
uri = URI("#{API_URL}/automations")
|
29
|
+
uri.query = URI.encode_www_form(params.compact)
|
30
|
+
client.http.get(uri)
|
31
|
+
end
|
32
|
+
|
33
|
+
# fetch the specified Automation
|
34
|
+
#
|
35
|
+
# @param automation_id [String] the ID of the Automation to fetch
|
36
|
+
# @return [HTTP::Response] the response from the API
|
37
|
+
def fetch(automation_id)
|
38
|
+
client.http.get("#{API_URL}/automations/#{automation_id}")
|
39
|
+
end
|
40
|
+
|
41
|
+
# get_subscriber_activity the subscriber activity for specified Automation
|
42
|
+
#
|
43
|
+
# @param automation_id [Integer] the ID of the Automation to get_subscriber_activity
|
44
|
+
# @param filter[:status,:date_from,:date_to,:scheduled_from,:scheduled_to,:keyword] [Array] Must be one of the following: completed, active, canceled, failed
|
45
|
+
# @param limit [Integer] the maximum number of Automations to return
|
46
|
+
# @param page [Integer] the page number of the results to return
|
47
|
+
# @return [HTTP::Response] the response from the API
|
48
|
+
def get_subscriber_activity(automation_id:, filter: {}, page: nil, limit: nil)
|
49
|
+
params = { 'filter[status]' => filter[:status] }
|
50
|
+
params['filter[date_from]'] = filter[:date_from] if filter.key?(:date_from)
|
51
|
+
params['filter[date_to]'] = filter[:date_to] if filter.key?(:date_to)
|
52
|
+
params['filter[scheduled_from]'] = filter[:scheduled_from] if filter.key?(:scheduled_from)
|
53
|
+
params['filter[scheduled_to]'] = filter[:scheduled_to] if filter.key?(:scheduled_to)
|
54
|
+
params['filter[keyword]'] = filter[:keyword] if filter.key?(:keyword)
|
55
|
+
params['page'] = page if page
|
56
|
+
params['limit'] = limit if limit
|
57
|
+
uri = URI("#{API_URL}/automations/#{automation_id}/activity")
|
58
|
+
uri.query = URI.encode_www_form(params.compact)
|
59
|
+
client.http.get(uri)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MailerLite
|
4
|
+
# This is a class for manipulating the Batch from MailerLite API.
|
5
|
+
class Batch
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
# Inits the `Batch` class with the specified `client`.
|
9
|
+
#
|
10
|
+
# @param client [MailerLite::Client] the `Client` instance to use
|
11
|
+
def initialize(client: MailerLite::Client.new)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
# Create a Batch Request
|
16
|
+
#
|
17
|
+
# @param requests [Array] Array of objects containing required method and path properties and optional body
|
18
|
+
# @return [HTTP::Response] the response from the API
|
19
|
+
def request(requests:)
|
20
|
+
params = { requests: requests }
|
21
|
+
client.http.post("#{API_URL}/batch", body: params.to_json)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MailerLite
|
4
|
+
# This is a class for manipulating the Campaigns from MailerLite API.
|
5
|
+
class Campaigns
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
# Inits the `Campaigns` class with the specified `client`.
|
9
|
+
#
|
10
|
+
# @param client [MailerLite::Client] the `Client` instance to use
|
11
|
+
def initialize(client: MailerLite::Client.new)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns a list of Campaigns that match the specified filter criteria.
|
16
|
+
#
|
17
|
+
# @param filter[:status,:type] [String] the status of the Campaigns to include in the results, must be one of [sent, draft, ready], Defaults to ready.
|
18
|
+
# The filter type of the Campaigns to include in the results, must be one of [regular, ab, resend, rss], Defaults to all
|
19
|
+
# @param limit [Integer] the maximum number of Campaigns to return
|
20
|
+
# @param page [Integer] the page number of the results to return
|
21
|
+
# @return [HTTP::Response] the response from the API
|
22
|
+
def get(filter:, limit: nil, page: nil)
|
23
|
+
params = { 'filter[status]' => filter[:status] }
|
24
|
+
params['filter[type]'] = filter[:type] if filter.key?(:type)
|
25
|
+
params['limit'] = limit if limit
|
26
|
+
params['page'] = page if page
|
27
|
+
uri = URI("#{API_URL}/campaigns")
|
28
|
+
uri.query = URI.encode_www_form(params.compact)
|
29
|
+
client.http.get(uri)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Creates a new campaign with the specified details.
|
33
|
+
#
|
34
|
+
# @param name [String] Maximum string length of 255 characters
|
35
|
+
# @param language_id [integer] Used to define the language in the unsubscribe template. Must be a valid language id. Defaults to english
|
36
|
+
# @param type [String] Must be one of the following: regular, ab, resend. Type resend is only available for accounts on growing or advanced plans
|
37
|
+
# @param emails [Array] Must contain 1 email object item
|
38
|
+
# @param groups [Array] Must contain valid group ids belonging to the account
|
39
|
+
# @param segments [Array] Must contain valid segment ids belonging to the account. If both groups and segments are provided, only segments are used
|
40
|
+
# @param ab_settings [Array<Array>] only if type is ab - All items of the array are required
|
41
|
+
# @param resend_settings [:test_type,:select_winner_by,:b_value] https://developers.mailerlite.com/docs/campaigns.html#create-a-campaign
|
42
|
+
# @return [HTTP::Response] the response from the API
|
43
|
+
def create(name:, type:, emails:, language_id: nil, groups: nil, segments: nil, ab_settings: nil, resend_settings: nil)
|
44
|
+
params = { 'name' => name }
|
45
|
+
params['type'] = type
|
46
|
+
params['emails'] = emails
|
47
|
+
params['language_id'] = language_id if language_id
|
48
|
+
params['groups'] = groups if groups
|
49
|
+
params['segments'] = segments if segments
|
50
|
+
case type
|
51
|
+
when 'ab'
|
52
|
+
params['ab_settings'] = {
|
53
|
+
test_type: ab_settings[:test_type],
|
54
|
+
select_winner_by: ab_settings[:select_winner_by],
|
55
|
+
after_time_amount: ab_settings[:after_time_amount],
|
56
|
+
after_time_unit: ab_settings[:after_time_unit],
|
57
|
+
test_split: ab_settings[:test_split]
|
58
|
+
}
|
59
|
+
case ab_settings[:test_type]
|
60
|
+
when 'subject'
|
61
|
+
params['ab_settings']['b_value'] = {
|
62
|
+
subject: ab_settings[:b_value][:subject]
|
63
|
+
}
|
64
|
+
|
65
|
+
when 'sender'
|
66
|
+
params['ab_settings']['b_value'] = {
|
67
|
+
from_name: ab_settings[:b_value][:from_name],
|
68
|
+
from: ab_settings[:b_value][:from]
|
69
|
+
}
|
70
|
+
end
|
71
|
+
when 'resend'
|
72
|
+
params['resend_settings'] = {
|
73
|
+
test_type: resend_settings[:test_type],
|
74
|
+
select_winner_by: resend_settings[:select_winner_by],
|
75
|
+
b_value: {
|
76
|
+
subject: resend_settings[:b_value][:subject]
|
77
|
+
}
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
client.http.post("#{API_URL}/campaigns", body: params.compact.to_json)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Update a new campaign with the specified details.
|
85
|
+
#
|
86
|
+
# @param campaign_id [Integer] the ID of the campaign to update
|
87
|
+
# @param name [String] Maximum string length of 255 characters
|
88
|
+
# @param language_id [integer] Used to define the language in the unsubscribe template. Must be a valid language id. Defaults to english
|
89
|
+
# @param type [String] Must be one of the following: regular, ab, resend. Type resend is only available for accounts on growing or advanced plans
|
90
|
+
# @param emails [Array<Array>] Must contain 1 email object item
|
91
|
+
# @param groups [Array] Must contain valid group ids belonging to the account
|
92
|
+
# @param segments [Array] Must contain valid segment ids belonging to the account. If both groups and segments are provided, only segments are used
|
93
|
+
# @param ab_settings [Array<Array>] only if type is ab - All items of the array are required
|
94
|
+
# @param resend_settings [:test_type,:select_winner_by,:b_value] https://developers.mailerlite.com/docs/campaigns.html#update-campaign
|
95
|
+
# @return [HTTP::Response] the response from the API
|
96
|
+
def update(campaign_id:, name:, type:, emails:, language_id: nil, groups: nil, segments: nil, ab_settings: nil, resend_settings: nil)
|
97
|
+
params = { 'name' => name }
|
98
|
+
params['emails'] = emails
|
99
|
+
params['language_id'] = language_id if language_id
|
100
|
+
params['groups'] = groups if groups
|
101
|
+
params['segments'] = segments if segments
|
102
|
+
case type
|
103
|
+
when 'ab'
|
104
|
+
params['ab_settings'] = {
|
105
|
+
test_type: ab_settings[:test_type],
|
106
|
+
select_winner_by: ab_settings[:select_winner_by],
|
107
|
+
after_time_amount: ab_settings[:after_time_amount],
|
108
|
+
after_time_unit: ab_settings[:after_time_unit],
|
109
|
+
test_split: ab_settings[:test_split]
|
110
|
+
}
|
111
|
+
case ab_settings[:test_type]
|
112
|
+
when 'subject'
|
113
|
+
params['ab_settings']['b_value'] = {
|
114
|
+
subject: ab_settings[:b_value][:subject]
|
115
|
+
}
|
116
|
+
|
117
|
+
when 'sender'
|
118
|
+
params['ab_settings']['b_value'] = {
|
119
|
+
from_name: ab_settings[:b_value][:from_name],
|
120
|
+
from: ab_settings[:b_value][:from]
|
121
|
+
}
|
122
|
+
|
123
|
+
end
|
124
|
+
when 'resend'
|
125
|
+
params['resend_settings'] = {
|
126
|
+
test_type: resend_settings[:test_type],
|
127
|
+
select_winner_by: resend_settings[:select_winner_by],
|
128
|
+
b_value: {
|
129
|
+
subject: resend_settings[:b_value][:subject]
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
client.http.put("#{API_URL}/campaigns/#{campaign_id}", body: params.compact.to_json)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Schedules the specified campaign.
|
139
|
+
#
|
140
|
+
# @param campaign_id [Integer] the ID of the campaign to schedule
|
141
|
+
# @param delivery [String] yes unless campaign type is rss Must be one of the following: instant, scheduled, timezone_based
|
142
|
+
# @param schedule[:date,:hours,:minutes,:timezone_id] [Array] campaign schedule
|
143
|
+
# @param resend[:delivery,:date,:hours,:minutes,:timezone_id] [String] resend settings
|
144
|
+
# https://developers.mailerlite.com/docs/campaigns.html#schedule-a-campaign
|
145
|
+
# @return [HTTP::Response] the response from the API
|
146
|
+
def schedule(campaign_id:, delivery:, schedule: nil, resend: nil)
|
147
|
+
params = {}
|
148
|
+
params['delivery'] = delivery if delivery
|
149
|
+
if %w[scheduled timezone_based].include?(delivery) && schedule
|
150
|
+
params['schedule'] = {}
|
151
|
+
params['schedule']['date'] = schedule[:date] if (delivery == 'scheduled') && schedule.key?(:date)
|
152
|
+
params['schedule']['hours'] = schedule[:hours] if schedule.key?(:hours)
|
153
|
+
params['schedule']['minutes'] = schedule[:minutes] if schedule.key?(:minutes)
|
154
|
+
params['schedule']['timezone_id'] = schedule[:timezone_id] if schedule.key?(:timezone_id)
|
155
|
+
end
|
156
|
+
params['resend'] = {} if resend
|
157
|
+
params['resend']['delivery'] = resend[:delivery] if resend&.key?(:delivery)
|
158
|
+
params['resend']['date'] = resend[:date] if resend&.key?(:date)
|
159
|
+
params['resend']['hours'] = resend[:hours] if resend&.key?(:hours)
|
160
|
+
params['resend']['minutes'] = resend[:minutes] if resend&.key?(:minutes)
|
161
|
+
params['resend']['timezone_id'] = resend[:timezone_id] if resend&.key?(:timezone_id)
|
162
|
+
|
163
|
+
client.http.post("#{API_URL}/campaigns/#{campaign_id}/schedule", body: params.compact.to_json)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Returns the details of the specified Campaigns
|
167
|
+
#
|
168
|
+
# @param campaign_id [String] the ID of the campaign to fetch
|
169
|
+
# @return [HTTP::Response] the response from the API
|
170
|
+
def fetch(campaign_id)
|
171
|
+
client.http.get("#{API_URL}/campaigns/#{campaign_id}")
|
172
|
+
end
|
173
|
+
|
174
|
+
# Cancels the specified campaign.
|
175
|
+
#
|
176
|
+
# @param campaign_id [String] the ID of the campaign to delete
|
177
|
+
# @return [HTTP::Response] the response from the API
|
178
|
+
def cancel(campaign_id)
|
179
|
+
client.http.post("#{API_URL}/campaigns/#{campaign_id}/cancel")
|
180
|
+
end
|
181
|
+
|
182
|
+
# Deletes the specified campaign.
|
183
|
+
#
|
184
|
+
# @param campaign_id [String] the ID of the campaign to delete
|
185
|
+
# @return [HTTP::Response] the response from the API
|
186
|
+
def delete(campaign_id)
|
187
|
+
client.http.delete("#{API_URL}/campaigns/#{campaign_id}")
|
188
|
+
end
|
189
|
+
|
190
|
+
# activity the subscriber activity for specified campaign
|
191
|
+
#
|
192
|
+
# @param campaign_id [Integer] the ID of the campaign to activity
|
193
|
+
# @param filter[:type,:search] [String] specify filters
|
194
|
+
# @param limit [Integer] the maximum number of campaigns to return
|
195
|
+
# @param page [Integer] the page number of the results to return
|
196
|
+
# https://developers.mailerlite.com/docs/campaigns.html#get-subscribers-activity-of-a-sent-campaign
|
197
|
+
# @return [HTTP::Response] the response from the API
|
198
|
+
def activity(campaign_id:, filter: nil, page: nil, limit: nil, sort: nil)
|
199
|
+
params = {}
|
200
|
+
params['filter'] = {} if filter
|
201
|
+
params['filter']['type'] = filter[:type] if filter.key?(:type)
|
202
|
+
params['filter']['search'] = filter[:search] if filter.key?(:search)
|
203
|
+
params['page'] = page if page
|
204
|
+
params['limit'] = limit if limit
|
205
|
+
params['sort'] = sort if sort
|
206
|
+
client.http.post("#{API_URL}/campaigns/#{campaign_id}/reports/subscriber-activity", body: params.compact.to_json)
|
207
|
+
end
|
208
|
+
|
209
|
+
# Get a list of all campaign languages available
|
210
|
+
#
|
211
|
+
# @return [HTTP::Response] the response from the API
|
212
|
+
def languages
|
213
|
+
client.http.get("#{API_URL}/campaigns/languages")
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'http'
|
4
|
+
require 'dotenv/load'
|
5
|
+
|
6
|
+
API_URL = 'https://connect.mailerlite.com/api'
|
7
|
+
|
8
|
+
Dotenv.require_keys('MAILERLITE_API_TOKEN')
|
9
|
+
|
10
|
+
# mailerlite-ruby is a gem that integrates all endpoints from MailerLite API
|
11
|
+
module MailerLite
|
12
|
+
attr_reader :api_token
|
13
|
+
|
14
|
+
# Inits the client.
|
15
|
+
class Client
|
16
|
+
def initialize(api_token = ENV.fetch('MAILERLITE_API_TOKEN', nil))
|
17
|
+
@api_token = api_token
|
18
|
+
end
|
19
|
+
|
20
|
+
def headers
|
21
|
+
{
|
22
|
+
'User-Agent' => "MailerLite-client-ruby/#{MailerLite::VERSION}",
|
23
|
+
'Accept' => 'application/json',
|
24
|
+
'Content-type' => 'application/json'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def http
|
29
|
+
HTTP
|
30
|
+
.timeout(connect: 15, read: 30)
|
31
|
+
.auth("Bearer #{@api_token}")
|
32
|
+
.headers(headers)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|