office_boy 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 19fc9b40583fd4d9e6b3a8b7732c48687f13b35ffa3f4b7c17088fc69ec8d976
4
+ data.tar.gz: 010f8106f4926bca760fdc085c3b5a2509e02a8bb2476954b68b9c070614b7df
5
+ SHA512:
6
+ metadata.gz: 6576a7859b3c3abca78b1f0c3f77efcb71719cdceda63a4777d79d620d2e1223fe03897460ef1f6ba7e66243cd18b8671a67cd374ceca218e4e7cf3e17f759e5
7
+ data.tar.gz: e6bdd9619ca8e67162c77257e6860fc1418106595eb2644d20107df2f31b9cad981f6f2302a8a4900743108f630985fb01fbf7fb3ca7b9d8794ad8f34381b336
@@ -0,0 +1,51 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require 'pry'
4
+
5
+ require 'office_boy/errors/not_definied_subscription_list'
6
+ require 'office_boy/errors/not_definied_api_key'
7
+ require 'office_boy/errors/subscriber_not_found'
8
+ require 'office_boy/errors/not_defined_email_template'
9
+
10
+ require 'office_boy/subscriber'
11
+ require 'office_boy/mail'
12
+ require 'office_boy/request'
13
+
14
+ module OfficeBoy
15
+ # Shortcuts
16
+
17
+ class << self
18
+ def deliver(template:, attributes:)
19
+ Mail.deliver(template: template, attributes: attributes)
20
+ end
21
+
22
+ def add_subscriber(list:, attributes:)
23
+ Subscriber.add(list: list, attributes: attributes)
24
+ end
25
+
26
+ def remove_subscriber(list:, email:)
27
+ Subscriber.remove(list: list, email: email)
28
+ end
29
+ end
30
+
31
+ # Configuration
32
+
33
+ class << self
34
+ attr_accessor :configuration
35
+ end
36
+
37
+ def self.configure
38
+ self.configuration ||= Configuration.new
39
+ yield(configuration)
40
+ end
41
+
42
+ class Configuration
43
+ attr_accessor :sendgrid_api_key, :lists, :templates
44
+
45
+ def initialize
46
+ @sendgrid_api_key = nil
47
+ @lists = {}
48
+ @templates = {}
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ module OfficeBoy
2
+ module Errors
3
+ class NotDefiniedEmailTemplate < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module OfficeBoy
2
+ module Errors
3
+ class NotDefiniedApiKey < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module OfficeBoy
2
+ module Errors
3
+ class NotDefiniedSubscriptionList < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module OfficeBoy
2
+ module Errors
3
+ class SubscriberNotFound < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ module OfficeBoy
2
+ class Mail
3
+ def self.deliver(template:, attributes:)
4
+ raise Errors::NotDefiniedEmailTemplate unless OfficeBoy.configuration.templates.key?(template)
5
+
6
+ response = OfficeBoy::Request.call(
7
+ method_name: :post,
8
+ path: 'mail/send',
9
+ payload: {
10
+ from: {
11
+ email: attributes[:from_email],
12
+ name: attributes[:from_name]
13
+ },
14
+ template_id: OfficeBoy.configuration.templates[template],
15
+ personalizations: [
16
+ {
17
+ to: [{
18
+ email: attributes[:to_email],
19
+ name: attributes[:to_name]
20
+ }],
21
+ subject: attributes[:subject]
22
+ }
23
+ ],
24
+ headers: attributes[:substitutions]
25
+ }
26
+ )
27
+
28
+ response.code == 202
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ module OfficeBoy
2
+ class Request
3
+ def self.call(method_name:, path:, payload: '')
4
+ raise Errors::NotDefiniedApiKey unless OfficeBoy.configuration.sendgrid_api_key
5
+
6
+ RestClient::Request.execute(
7
+ method: method_name,
8
+ url: "https://api.sendgrid.com/v3/#{path}",
9
+ payload: JSON.generate(payload),
10
+ headers: {
11
+ 'Authorization' => "Bearer #{OfficeBoy.configuration.sendgrid_api_key}",
12
+ 'Content-Type' => 'application/json'
13
+ }
14
+ )
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,56 @@
1
+ module OfficeBoy
2
+ class Subscriber
3
+ class << self
4
+ def add(list:, attributes:)
5
+ raise Errors::NotDefiniedSubscriptionList unless OfficeBoy.configuration.lists.key?(list)
6
+
7
+ list_id = OfficeBoy.configuration.lists[list]
8
+
9
+ params = {
10
+ 'list_ids' => [list_id],
11
+ 'contacts' => [attributes]
12
+ }
13
+
14
+ response = OfficeBoy::Request.call(
15
+ method_name: :put,
16
+ path: 'marketing/contacts',
17
+ payload: params
18
+ )
19
+
20
+ response.code == 202
21
+ end
22
+
23
+ def remove(list:, email:)
24
+ raise Errors::NotDefiniedSubscriptionList unless OfficeBoy.configuration.lists.key?(list)
25
+
26
+ list_id = OfficeBoy.configuration.lists[list]
27
+
28
+ subscriber = find(list: list_id, email: email)
29
+
30
+ raise Errors::SubscriberNotFound unless subscriber
31
+
32
+ response = OfficeBoy::Request.call(
33
+ method_name: :delete,
34
+ path: "marketing/contacts?ids=#{subscriber['id']}"
35
+ )
36
+
37
+ response.code == 202
38
+ end
39
+
40
+ def find(list:, email:)
41
+ query = "primary_email LIKE '#{email}%' AND CONTAINS(list_ids, '#{list}')"
42
+
43
+ response = OfficeBoy::Request.call(
44
+ method_name: :post,
45
+ path: 'marketing/contacts/search',
46
+ payload: { query: query }
47
+ )
48
+
49
+ parsed_response = JSON.parse(response.body)
50
+ return unless parsed_response['result'].size == 1
51
+
52
+ parsed_response['result'].first
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,12 @@
1
+ module OfficeBoy
2
+ module Version
3
+ module_function
4
+
5
+ # Gem current version
6
+ #
7
+ # @return [String]
8
+ def to_s
9
+ "0.0.1"
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: office_boy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Paweł Dąbrowski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-11-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.7'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.7.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.7'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.7.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rest-client
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: sendgrid-ruby
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ description: Wrapper for the Sendgrid API addressed to the technical bloggers
62
+ email: dziamber@gmail.com
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - lib/office_boy.rb
68
+ - lib/office_boy/errors/not_defined_email_template.rb
69
+ - lib/office_boy/errors/not_definied_api_key.rb
70
+ - lib/office_boy/errors/not_definied_subscription_list.rb
71
+ - lib/office_boy/errors/subscriber_not_found.rb
72
+ - lib/office_boy/mail.rb
73
+ - lib/office_boy/request.rb
74
+ - lib/office_boy/subscriber.rb
75
+ - lib/office_boy/version.rb
76
+ homepage: http://github.com/rubyhero/office_boy
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 2.5.0
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.7.7
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Wrapper for the Sendgrid API addressed to the technical bloggers
100
+ test_files: []