moonshot-rails 0.0.8 → 0.0.10

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.
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Moonshot
4
+ module Convertkit
5
+ class UpsertJob < ApplicationJob
6
+ queue_as :default
7
+
8
+ delegate :convertkit_api_key, :convertkit_api_secret, :convertkit_form_id, to: 'MoonshotRails.configuration'
9
+
10
+ def perform user_object_or_klass, user_id: nil, first_name:, fields:
11
+ # return unless Rails.env.production?
12
+
13
+ user = if user_object_or_klass.is_a?(String)
14
+ klass = user_object_or_klass.constantize
15
+ klass.respond_to?(:with_deleted) ? klass.with_deleted.find(user_id) : klass.find(user_id)
16
+ else
17
+ user_object_or_klass
18
+ end
19
+
20
+ return unless user.respond_to?(:email) && user.email.present?
21
+
22
+ assert_required_config!
23
+
24
+ if existing_subscriber = find_by(email: user.email)
25
+ params = {
26
+ first_name: user.respond_to?(first_name) ? user.send(first_name) : nil
27
+ }
28
+ params.merge!(fields: user.send(fields)) if user.respond_to?(fields)
29
+
30
+ put_request "subscribers/#{existing_subscriber['id']}", params
31
+ else
32
+ params = {
33
+ email: user.email,
34
+ first_name: user.respond_to?(first_name) ? user.send(first_name) : nil
35
+ }
36
+ params.merge!(fields: user.send(fields)) if user.respond_to?(fields)
37
+
38
+ post_request "forms/#{convertkit_form_id}/subscribe", params
39
+ end
40
+ end
41
+
42
+ def find_by email:
43
+ response = get_request({ email_address: email })
44
+
45
+ return if response['total_subscribers'].zero?
46
+
47
+ if response['total_subscribers'] > 1
48
+ raise "Multiple (#{response['total_subscribers']}) subscribers found for email #{email}"
49
+ end
50
+
51
+ response['subscribers'].first
52
+ end
53
+
54
+ protected
55
+
56
+ def get_request query, path: 'subscribers'
57
+ params = query.merge({
58
+ api_key: convertkit_api_key,
59
+ api_secret: convertkit_api_secret
60
+ }).compact
61
+
62
+ url = "https://api.convertkit.com/v3/#{path}?#{params.to_query}"
63
+
64
+ Excon
65
+ .get(url)
66
+ .tap { |response| raise "Error #{response.status}: #{response.body}" unless response.status == 200 }
67
+ .then { |response| JSON.parse(response.body) }
68
+ end
69
+
70
+ def post_request path, body
71
+ json_body = body.merge(api_key: convertkit_api_key).to_json
72
+
73
+ Excon
74
+ .post("https://api.convertkit.com/v3/#{path}", body: json_body, headers: { 'Content-Type' => 'application/json' })
75
+ .tap { |response| raise "Error #{response.status}: #{response.body}" unless response.status == 200 }
76
+ .then { |response| JSON.parse(response.body) }
77
+ end
78
+
79
+ def put_request path, body
80
+ json_body = body.merge(api_secret: convertkit_api_secret).to_json
81
+
82
+ Excon
83
+ .put("https://api.convertkit.com/v3/#{path}", body: json_body, headers: { 'Content-Type' => 'application/json' })
84
+ .tap { |response| raise "Error #{response.status}: #{response.body}" unless response.status == 200 }
85
+ .then { |response| JSON.parse(response.body) }
86
+ end
87
+
88
+ def assert_required_config!
89
+ %i[convertkit_api_key convertkit_api_secret convertkit_form_id].each do |config|
90
+ raise MoonshotRails::MissingConfig, "#{config} is required" unless send(config).present?
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -5,14 +5,14 @@ module Moonshot
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  class_methods do
8
- def convertkit_sync
9
- after_save_commit :moonshot_convertkit_subscribe
8
+ def convertkit_sync first_name: :name, fields: :convertkit_fields
9
+ after_save_commit -> { moonshot_convertkit_upsert first_name: first_name, fields: fields }
10
10
  after_destroy_commit :moonshot_convertkit_unsubscribe
11
11
  end
12
12
  end
13
13
 
14
- def moonshot_convertkit_subscribe
15
- Moonshot::Convertkit::SubscribeJob.perform_later self
14
+ def moonshot_convertkit_upsert first_name: :name, fields: :convertkit_fields
15
+ Moonshot::Convertkit::UpsertJob.perform_later self.class.name, user_id: id, first_name: first_name, fields: fields
16
16
  end
17
17
 
18
18
  def moonshot_convertkit_unsubscribe
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MoonshotRails
4
- VERSION = '0.0.8'
4
+ VERSION = '0.0.10'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moonshot-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Catalin Ionescu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-03 00:00:00.000000000 Z
11
+ date: 2024-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 3.0.0
47
+ version: 2.0.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 3.0.0
54
+ version: 2.0.0
55
55
  description:
56
56
  email:
57
57
  - catalin.ionescu282@gmail.com
@@ -70,8 +70,8 @@ files:
70
70
  - app/components/moonshot/app/jobs_to_be_done.rb
71
71
  - app/helpers/moonshot/moonshot_helper.rb
72
72
  - app/jobs/moonshot/application_job.rb
73
- - app/jobs/moonshot/convertkit/subscribe_job.rb
74
73
  - app/jobs/moonshot/convertkit/unsubscribe_job.rb
74
+ - app/jobs/moonshot/convertkit/upsert_job.rb
75
75
  - app/models/moonshot/model_helper.rb
76
76
  - lib/generators/moonshot_rails_generator.rb
77
77
  - lib/moonshot-rails.rb
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Moonshot
4
- module Convertkit
5
- class SubscribeJob < ApplicationJob
6
- queue_as :default
7
-
8
- delegate :convertkit_api_key, :convertkit_api_secret, :convertkit_form_id, to: 'MoonshotRails.configuration'
9
-
10
- def perform user
11
- return unless Rails.env.production?
12
-
13
- assert_required_config!
14
-
15
- existing_subscriber = find_by(email: user.email)
16
- return existing_subscriber if existing_subscriber
17
-
18
- params = {
19
- email: user.email
20
- }
21
- params.merge!(fields: user.convertkit_fields) if user.respond_to?(:convertkit_fields)
22
-
23
- post_request "forms/#{convertkit_form_id}/subscribe", params
24
- end
25
-
26
- def find_by email:
27
- response = get_request({ email_address: email })
28
-
29
- return if response['total_subscribers'].zero?
30
-
31
- if response['total_subscribers'] > 1
32
- raise "Multiple (#{response['total_subscribers']}) subscribers found for email #{email}"
33
- end
34
-
35
- response['subscribers'].first
36
- end
37
-
38
- protected
39
-
40
- def get_request query, path: 'subscribers'
41
- params = query.merge({
42
- api_key: convertkit_api_key,
43
- api_secret: convertkit_api_secret
44
- }).compact
45
-
46
- url = "https://api.convertkit.com/v3/#{path}?#{params.to_query}"
47
-
48
- Excon
49
- .get(url)
50
- .then { |response| JSON.parse(response.body) }
51
- end
52
-
53
- def post_request path, body
54
- json_body = body.merge(api_key: convertkit_api_key).to_json
55
-
56
- Excon
57
- .post("https://api.convertkit.com/v3/#{path}", body: json_body, headers: { 'Content-Type' => 'application/json' })
58
- .then { |response| JSON.parse(response.body) }
59
- end
60
-
61
- def assert_required_config!
62
- %i[convertkit_api_key convertkit_api_secret convertkit_form_id].each do |config|
63
- raise MoonshotRails::MissingConfig, "#{config} is required" unless send(config).present?
64
- end
65
- end
66
- end
67
- end
68
- end