app_manager 1.3.6 → 1.3.9
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/Gemfile.lock +6 -6
- data/app/controllers/app_manager/charges_controller.rb +32 -8
- data/app/controllers/app_manager/plans_controller.rb +21 -7
- data/lib/app_manager/client/connection.rb +9 -6
- data/lib/app_manager/fail_safe.rb +47 -7
- data/lib/app_manager/graphql_helper.rb +15 -3
- data/lib/app_manager/version.rb +1 -1
- data/lib/generators/app_manager/install/templates/app_manager.rb.tt +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dfdd07111c73c3c82b14f21099777f2b8f173e5ee38a8a8bd2eb1413993690f
|
4
|
+
data.tar.gz: 23e680f4470a0ac86745fc51379f60770e75d9391f02758a9152930afe42c463
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64f68a22812c58a5cb3c2156b8dc1a5d8c0d95a216b61d5bc145494ca53157e3faa424be03cee86bf93a4b5d5466b1e2e2076960e5ef8fd770be91980e38d909
|
7
|
+
data.tar.gz: a014b7af9a38fecdd17cebb6d978984cfa95fae711931fca5968a7c1d4160d758acb264e677e9be36a584ca4ee1ca7194739a6dff16784e8b7998c54081f102c
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
app_manager (1.3.
|
4
|
+
app_manager (1.3.9)
|
5
5
|
activerecord-import (~> 1.4)
|
6
6
|
httparty
|
7
7
|
kaminari (>= 0.16.3)
|
@@ -88,7 +88,7 @@ GEM
|
|
88
88
|
diff-lcs (1.5.0)
|
89
89
|
digest (3.1.0)
|
90
90
|
dotenv (2.1.2)
|
91
|
-
erubi (1.
|
91
|
+
erubi (1.11.0)
|
92
92
|
globalid (1.0.0)
|
93
93
|
activesupport (>= 5.0)
|
94
94
|
hashdiff (1.0.1)
|
@@ -121,7 +121,7 @@ GEM
|
|
121
121
|
mime-types-data (3.2022.0105)
|
122
122
|
mini_mime (1.1.2)
|
123
123
|
mini_portile2 (2.8.0)
|
124
|
-
minitest (5.16.
|
124
|
+
minitest (5.16.3)
|
125
125
|
multi_xml (0.6.0)
|
126
126
|
net-imap (0.2.3)
|
127
127
|
digest
|
@@ -138,7 +138,7 @@ GEM
|
|
138
138
|
net-protocol
|
139
139
|
timeout
|
140
140
|
nio4r (2.5.8)
|
141
|
-
nokogiri (1.13.
|
141
|
+
nokogiri (1.13.8)
|
142
142
|
mini_portile2 (~> 2.8.0)
|
143
143
|
racc (~> 1.4)
|
144
144
|
pry (0.14.1)
|
@@ -192,10 +192,10 @@ GEM
|
|
192
192
|
diff-lcs (>= 1.2.0, < 2.0)
|
193
193
|
rspec-support (~> 3.11.0)
|
194
194
|
rspec-support (3.11.0)
|
195
|
-
strscan (3.0.
|
195
|
+
strscan (3.0.4)
|
196
196
|
thor (1.2.1)
|
197
197
|
timeout (0.3.0)
|
198
|
-
tzinfo (2.0.
|
198
|
+
tzinfo (2.0.5)
|
199
199
|
concurrent-ruby (~> 1.0)
|
200
200
|
webmock (3.14.0)
|
201
201
|
addressable (>= 2.8.0)
|
@@ -10,6 +10,7 @@ module AppManager
|
|
10
10
|
def process_plan
|
11
11
|
if params[:shop].present? && params[:plan_id].present?
|
12
12
|
@shop = shop_data
|
13
|
+
grandfathered_field = @field_names['grandfathered']
|
13
14
|
if !@shop.nil?
|
14
15
|
plan_obj = AppManager::Client.new
|
15
16
|
plan_data = plan_obj.get_plan(params[:plan_id], params[:shop])
|
@@ -29,8 +30,13 @@ module AppManager
|
|
29
30
|
rescue Exception => e
|
30
31
|
Rollbar.error("APP MANAGER Process Plan Failed #{e}")
|
31
32
|
end
|
32
|
-
|
33
|
-
|
33
|
+
@trial_activated_field = AppManager.configuration.field_names['trial_activated_at']
|
34
|
+
update_info = {@plan_field => params[:plan_id], @trial_activated_field => nil,grandfathered_field => 0}
|
35
|
+
if !config_trial_days.nil? && !plan_data.nil?
|
36
|
+
trial_days = plan_data['trial_days'] || 0
|
37
|
+
update_info[config_trial_days] = trial_days
|
38
|
+
end
|
39
|
+
if @shop.update(update_info)
|
34
40
|
begin
|
35
41
|
AppManager::EventHandler.new('charge_created', {
|
36
42
|
"plan" => plan_data,
|
@@ -42,8 +48,8 @@ module AppManager
|
|
42
48
|
Rollbar.error("APP MANAGER Error in Process Plan #{e}")
|
43
49
|
end
|
44
50
|
AppManager.clear_cache
|
45
|
-
render json: {'redirect_url' => "#{app_url}?shop=#{params[:shop]}"} and return true
|
46
|
-
|
51
|
+
# render json: {'redirect_url' => "#{app_url}?shop=#{params[:shop]}"} and return true
|
52
|
+
render json: {'status' => true,'plan_type' => 'free_plan'} and return true
|
47
53
|
else
|
48
54
|
raise Error, "Invalid charge"
|
49
55
|
end
|
@@ -106,7 +112,14 @@ module AppManager
|
|
106
112
|
|
107
113
|
if response['message'] == "success"
|
108
114
|
AppManager.clear_cache
|
109
|
-
|
115
|
+
|
116
|
+
update_info = {@plan_field => params[:plan],grandfathered_field => 0}
|
117
|
+
if !config_trial_days.nil? && !plan_data.nil?
|
118
|
+
trial_days = plan_data['trial_days'] || 0
|
119
|
+
update_info[config_trial_days] = trial_days
|
120
|
+
end
|
121
|
+
|
122
|
+
@shop.update(update_info)
|
110
123
|
Thread.new do
|
111
124
|
charge_data = plan_obj.get_charge(@shop[shopify_domain])
|
112
125
|
begin
|
@@ -121,7 +134,9 @@ module AppManager
|
|
121
134
|
end
|
122
135
|
end
|
123
136
|
end
|
124
|
-
|
137
|
+
embed_host = Base64.encode64(params[:shop] + "/admin")
|
138
|
+
# redirect_to "/login?host=#{embed_host}&shop=#{shop}" and return
|
139
|
+
redirect_to "#{app_url}?host=#{embed_host}&shop=#{params[:shop]}", :status => 301 and return
|
125
140
|
else
|
126
141
|
raise Error, "Invalid shopify charge #{charges.insect}"
|
127
142
|
end
|
@@ -130,10 +145,10 @@ module AppManager
|
|
130
145
|
end
|
131
146
|
else
|
132
147
|
if params[:shop].present?
|
133
|
-
|
148
|
+
embed_host = Base64.encode64(params[:shop] + "/admin")
|
149
|
+
redirect_to "#{app_url}?host=#{embed_host}&shop=#{params[:shop]}", :status => 301 and return
|
134
150
|
else
|
135
151
|
raise Error, "Invalid params, must have charge_id,shop && plan in charge controller"
|
136
|
-
|
137
152
|
end
|
138
153
|
end
|
139
154
|
end
|
@@ -170,6 +185,15 @@ module AppManager
|
|
170
185
|
AppManager.configuration.app_url
|
171
186
|
end
|
172
187
|
|
188
|
+
def config_trial_days
|
189
|
+
@field_names = AppManager.configuration.field_names
|
190
|
+
if !@field_names.nil? && @field_names.has_key?('total_trial_days') && !@field_names['total_trial_days'].nil? && !@field_names['total_trial_days'].blank?
|
191
|
+
return @field_names['total_trial_days']
|
192
|
+
else
|
193
|
+
return nil
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
173
197
|
|
174
198
|
end
|
175
199
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require_dependency "app_manager/application_controller"
|
2
|
-
|
2
|
+
require 'kaminari'
|
3
3
|
module AppManager
|
4
4
|
class PlansController < ApplicationController
|
5
5
|
cache_response_for :plans
|
@@ -86,17 +86,17 @@ module AppManager
|
|
86
86
|
plans = plans.values if !plans.nil?
|
87
87
|
shopify_plans = params[:shopify_plans] || nil
|
88
88
|
shopify_plans = shopify_plans.values if !shopify_plans.nil?
|
89
|
-
items_per_page =
|
89
|
+
items_per_page = 25
|
90
90
|
@shopify_email = AppManager.configuration.field_names['shopify_email']
|
91
91
|
@shopify_plan_name_field = AppManager.configuration.field_names['shopify_plan']
|
92
|
-
data = model
|
93
92
|
if params[:search]
|
94
93
|
data = model.where("#{@shopify_domain} LIKE :search OR #{@shopify_email} LIKE :search", search: "%#{search}%")
|
95
94
|
data = data.where(@plan_field => plans) if !plans.nil?
|
96
95
|
data = data.where(@shopify_plan_name_field => shopify_plans) if !shopify_plans.nil?
|
97
96
|
data = data.page(params[:page]).per(items_per_page)
|
98
97
|
else
|
99
|
-
data = model
|
98
|
+
data = model
|
99
|
+
data = data.where(@plan_field => plans) if !plans.nil?
|
100
100
|
data = data.where(@shopify_plan_name_field => shopify_plans) if !shopify_plans.nil?
|
101
101
|
data = data.page(params[:page]).per(items_per_page)
|
102
102
|
end
|
@@ -126,11 +126,16 @@ module AppManager
|
|
126
126
|
if params[:shop_domain].present? && params[:plan_id].present? && model
|
127
127
|
@shop = shop_data
|
128
128
|
@trial_activated_field = AppManager.configuration.field_names['trial_activated_at']
|
129
|
-
|
129
|
+
plan_obj = AppManager::Client.new
|
130
|
+
plan_data = plan_obj.get_plan(params[:plan_id], params[:shop_domain]) rescue nil
|
131
|
+
update_info = {@plan_field => params[:plan_id], @trial_activated_field => DateTime.now}
|
132
|
+
if !config_trial_days.nil? && !plan_data.nil?
|
133
|
+
trial_days = plan_data['trial_days'] || 0
|
134
|
+
update_info[config_trial_days] = trial_days
|
135
|
+
end
|
136
|
+
if @shop.update(update_info)
|
130
137
|
begin
|
131
138
|
AppManager.clear_cache
|
132
|
-
plan_obj = AppManager::Client.new
|
133
|
-
plan_data = plan_obj.get_plan(params[:plan_id], params[:shop_domain]) rescue nil
|
134
139
|
AppManager::EventHandler.new('charge_created', {
|
135
140
|
"plan" => plan_data,
|
136
141
|
"charge" => nil,
|
@@ -210,5 +215,14 @@ module AppManager
|
|
210
215
|
AppManager.configuration.app_url
|
211
216
|
end
|
212
217
|
|
218
|
+
def config_trial_days
|
219
|
+
@field_names = AppManager.configuration.field_names
|
220
|
+
if !@field_names.nil? && @field_names.has_key?('total_trial_days') && !@field_names['total_trial_days'].nil? && !@field_names['total_trial_days'].blank?
|
221
|
+
return @field_names['total_trial_days']
|
222
|
+
else
|
223
|
+
return nil
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
213
227
|
end
|
214
228
|
end
|
@@ -28,7 +28,8 @@ module AppManager
|
|
28
28
|
response = response_from_cache_for_api(http_method, path, options)
|
29
29
|
failsafe_or_caching_done = true
|
30
30
|
else
|
31
|
-
|
31
|
+
time_out = Rails.env.development? ? 120 : 30
|
32
|
+
response = self.class.send(http_method, path, { body: options, timeout: time_out })
|
32
33
|
end
|
33
34
|
if path.include? "/get-status"
|
34
35
|
data = response
|
@@ -60,13 +61,15 @@ module AppManager
|
|
60
61
|
end
|
61
62
|
begin
|
62
63
|
response = self.class.send(http_method, path, { body: options, timeout: 15 })
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
if response.class.to_s == "HTTParty::Response" && (response.code.to_s.start_with?('2') or response.code.to_s.start_with?('4')) && (response.code.to_s != '429')
|
65
|
+
Rails.cache.write(cache_key, response, expires_in: AppManager.configuration.expires_in)
|
66
|
+
else
|
67
|
+
response = response_from_failsafe(path,options)
|
68
|
+
end
|
68
69
|
rescue Net::ReadTimeout => error
|
69
70
|
response = response_from_failsafe(path,options)
|
71
|
+
rescue Exception => e
|
72
|
+
response = response_from_failsafe(path,options)
|
70
73
|
end
|
71
74
|
return response
|
72
75
|
end
|
@@ -63,7 +63,12 @@ module AppManager
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def save_api_plans(plans)
|
66
|
-
|
66
|
+
begin
|
67
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE plans RESTART IDENTITY")
|
68
|
+
AppManager::Plan.connection.truncate(AppManager::Plan.table_name)
|
69
|
+
rescue
|
70
|
+
AppManager::Plan.delete_all
|
71
|
+
end
|
67
72
|
if plans.any?
|
68
73
|
plan_data = []
|
69
74
|
plans.each do |plan|
|
@@ -87,7 +92,12 @@ module AppManager
|
|
87
92
|
|
88
93
|
|
89
94
|
def save_api_charges(charges)
|
90
|
-
|
95
|
+
begin
|
96
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE charges RESTART IDENTITY")
|
97
|
+
AppManager::Charge.connection.truncate(AppManager::Charge.table_name)
|
98
|
+
rescue
|
99
|
+
AppManager::Charge.delete_all
|
100
|
+
end
|
91
101
|
if charges.any?
|
92
102
|
charge_data = []
|
93
103
|
charges.each do |charge|
|
@@ -100,7 +110,12 @@ module AppManager
|
|
100
110
|
|
101
111
|
|
102
112
|
def save_api_apps(apps)
|
103
|
-
|
113
|
+
begin
|
114
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE apps RESTART IDENTITY")
|
115
|
+
AppManager::App.connection.truncate(AppManager::App.table_name)
|
116
|
+
rescue
|
117
|
+
AppManager::App.delete_all
|
118
|
+
end
|
104
119
|
if apps.any?
|
105
120
|
apps_data = []
|
106
121
|
apps.each do |app|
|
@@ -112,12 +127,22 @@ module AppManager
|
|
112
127
|
|
113
128
|
#Complete
|
114
129
|
def save_api_app_structures(app_structures)
|
115
|
-
|
130
|
+
begin
|
131
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE app_structures RESTART IDENTITY")
|
132
|
+
AppManager::AppStructure.connection.truncate(AppManager::AppStructure.table_name)
|
133
|
+
rescue
|
134
|
+
AppManager::AppStructure.delete_all
|
135
|
+
end
|
116
136
|
AppManager::AppStructure.create(banners: app_structures.to_h)
|
117
137
|
end
|
118
138
|
|
119
139
|
def save_api_discount_plans(discount_plans)
|
120
|
-
|
140
|
+
begin
|
141
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE discount_plans RESTART IDENTITY")
|
142
|
+
AppManager::DiscountPlan.connection.truncate(AppManager::DiscountPlan.table_name)
|
143
|
+
rescue
|
144
|
+
AppManager::DiscountPlan.delete_all
|
145
|
+
end
|
121
146
|
if discount_plans.any?
|
122
147
|
discount_plans_data = []
|
123
148
|
discount_plans.each do |discount_plan|
|
@@ -128,7 +153,12 @@ module AppManager
|
|
128
153
|
end
|
129
154
|
|
130
155
|
def save_api_extend_trials(extend_trials)
|
131
|
-
|
156
|
+
begin
|
157
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE extend_trials RESTART IDENTITY")
|
158
|
+
AppManager::ExtendTrial.connection.truncate(AppManager::ExtendTrial.table_name)
|
159
|
+
rescue
|
160
|
+
AppManager::ExtendTrial.delete_all
|
161
|
+
end
|
132
162
|
if extend_trials.any?
|
133
163
|
extend_trials_data = []
|
134
164
|
extend_trials.each do |extend_trial|
|
@@ -139,7 +169,12 @@ module AppManager
|
|
139
169
|
end
|
140
170
|
|
141
171
|
def save_api_plan_users(plan_users)
|
142
|
-
|
172
|
+
begin
|
173
|
+
# ActiveRecord::Base.establish_connection(:app_manager).connection.execute("TRUNCATE plan_users RESTART IDENTITY")
|
174
|
+
AppManager::PlanUser.connection.truncate(AppManager::PlanUser.table_name)
|
175
|
+
rescue
|
176
|
+
AppManager::PlanUser.delete_all
|
177
|
+
end
|
143
178
|
if plan_users.any?
|
144
179
|
extend_plan_users = []
|
145
180
|
plan_users.each do |plan_user|
|
@@ -376,6 +411,11 @@ module AppManager
|
|
376
411
|
if charge['trial_ends_on'] && DateTime.now < charge['trial_ends_on']
|
377
412
|
@remaining_days = (charge['trial_ends_on'].to_datetime - DateTime.now.to_datetime).to_i
|
378
413
|
end
|
414
|
+
|
415
|
+
# ADD EXTRA DAY
|
416
|
+
if charge['created_at'] && ((charge['created_at'].to_datetime - DateTime.now.to_datetime).to_i == 0)
|
417
|
+
@remaining_days = @remaining_days + 1
|
418
|
+
end
|
379
419
|
# TODO: Uncomment this code when we implement Shopify trial extension apis
|
380
420
|
# trial_extension_data = AppManager::ExtendTrial.where(shop_domain: @shop_domain, plan_id: @plan_id).order(extend_trial_start_at: :desc)
|
381
421
|
# if trial_extension_data.any?
|
@@ -59,15 +59,27 @@ module AppManager
|
|
59
59
|
plan_test = true
|
60
60
|
end
|
61
61
|
trial_days = plan['trial_days'] || 0
|
62
|
-
|
63
62
|
if shop && shop.shopify_domain && trial_days
|
64
63
|
trial_activated_at = shop[AppManager.configuration.field_names['trial_activated_at']] rescue nil
|
65
64
|
plan_id_field = shop[AppManager.configuration.plan_id_or_name_field] rescue nil
|
66
65
|
remaining_obj = AppManager::Client.new
|
67
66
|
remaining = remaining_obj.get_remaining_days(shop.shopify_domain,trial_activated_at,plan_id_field)
|
68
|
-
trial_days = !remaining.nil? ? remaining : trial_days
|
67
|
+
# trial_days = !remaining.nil? ? remaining : trial_days
|
68
|
+
if !remaining.nil?
|
69
|
+
if !plan_id_field.nil?
|
70
|
+
plan_obj = AppManager::Client.new
|
71
|
+
current_plan = plan_obj.get_plan(plan_id_field) rescue nil
|
72
|
+
used_days = (current_plan['trial_days'].to_i - remaining.to_i) if current_plan rescue 0
|
73
|
+
if used_days > 0
|
74
|
+
days = trial_days - used_days
|
75
|
+
trial_days = days > 0 ? days : 0
|
76
|
+
end
|
77
|
+
else
|
78
|
+
trial_days = remaining
|
79
|
+
end
|
80
|
+
end
|
69
81
|
end
|
70
|
-
|
82
|
+
|
71
83
|
discount_type = plan['discount_type'] || "percentage"
|
72
84
|
discount_val = discount_type == "percentage" ? (plan['discount'].to_f/ 100) : "#{plan['discount']}"
|
73
85
|
plan_discount = plan['discount'] ? { "discount" => { "durationLimitInIntervals" => (plan['cycle_count'].to_i || 0), "value" => {"#{discount_type}" => discount_val} } } : {}
|
data/lib/app_manager/version.rb
CHANGED
@@ -15,7 +15,8 @@ AppManager.configure do |config|
|
|
15
15
|
'plan_id' => 'plan_id', # 1. t
|
16
16
|
'created_at' => 'created_at', # 2022-04-15 10:43:05
|
17
17
|
'trial_activated_at' => 'trial_activated_at', # field name that stores trial start/activated date
|
18
|
-
'grandfathered' => 'grandfathered'
|
18
|
+
'grandfathered' => 'grandfathered',
|
19
|
+
'total_trial_days' => '' #optional, put a trial days field from your shops table otherwise leave it blank
|
19
20
|
}
|
20
21
|
config.plan_features = [
|
21
22
|
{
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hulkapps
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|