33class CustomWizard ::Template
44 include HasErrors
55
6+ AFTER_SIGNUP_CACHE_KEY ||= "after_signup_wizard_ids"
7+ AFTER_TIME_CACHE_KEY ||= "after_time_wizard_ids"
8+
69 attr_reader :data ,
710 :opts ,
811 :steps ,
@@ -28,6 +31,8 @@ def save(opts = {})
2831 PluginStore . set ( CustomWizard ::PLUGIN_NAME , @data [ :id ] , @data )
2932 end
3033
34+ self . class . clear_cache_keys
35+
3136 @data [ :id ]
3237 end
3338
@@ -53,10 +58,10 @@ def self.remove(wizard_id)
5358
5459 ActiveRecord ::Base . transaction do
5560 PluginStore . remove ( CustomWizard ::PLUGIN_NAME , wizard . id )
56- clear_user_wizard_redirect ( wizard_id )
61+ clear_user_wizard_redirect ( wizard_id , after_time : !! wizard . after_time )
5762 end
5863
59- Jobs . cancel_scheduled_job ( :set_after_time_wizard ) if wizard . after_time
64+ clear_cache_keys
6065
6166 true
6267 end
@@ -65,9 +70,10 @@ def self.exists?(wizard_id)
6570 PluginStoreRow . exists? ( plugin_name : 'custom_wizard' , key : wizard_id )
6671 end
6772
68- def self . list ( setting : nil , order : :id )
73+ def self . list ( setting : nil , query_str : nil , order : :id )
6974 query = "plugin_name = 'custom_wizard'"
70- query += "AND (value::json ->> '#{ setting } ')::boolean IS TRUE" if setting
75+ query += " AND (value::json ->> '#{ setting } ')::boolean IS TRUE" if setting
76+ query += " #{ query_str } " if query_str
7177
7278 PluginStoreRow . where ( query ) . order ( order )
7379 . reduce ( [ ] ) do |result , record |
@@ -85,8 +91,36 @@ def self.list(setting: nil, order: :id)
8591 end
8692 end
8793
88- def self . clear_user_wizard_redirect ( wizard_id )
94+ def self . clear_user_wizard_redirect ( wizard_id , after_time : false )
8995 UserCustomField . where ( name : 'redirect_to_wizard' , value : wizard_id ) . destroy_all
96+
97+ if after_time
98+ Jobs . cancel_scheduled_job ( :set_after_time_wizard , wizard_id : wizard_id )
99+ end
100+ end
101+
102+ def self . after_signup_ids
103+ ::CustomWizard ::Cache . wrap ( AFTER_SIGNUP_CACHE_KEY ) do
104+ list ( setting : 'after_signup' ) . map { |t | t [ 'id' ] }
105+ end
106+ end
107+
108+ def self . after_time_ids
109+ ::CustomWizard ::Cache . wrap ( AFTER_TIME_CACHE_KEY ) do
110+ list (
111+ setting : 'after_time' ,
112+ query_str : "AND (value::json ->> 'after_time_scheduled')::timestamp < CURRENT_TIMESTAMP"
113+ ) . map { |t | t [ 'id' ] }
114+ end
115+ end
116+
117+ def self . can_redirect_users? ( wizard_id )
118+ after_signup_ids . include? ( wizard_id ) || after_time_ids . include? ( wizard_id )
119+ end
120+
121+ def self . clear_cache_keys
122+ CustomWizard ::Cache . new ( AFTER_SIGNUP_CACHE_KEY ) . delete
123+ CustomWizard ::Cache . new ( AFTER_TIME_CACHE_KEY ) . delete
90124 end
91125
92126 private
@@ -132,8 +166,7 @@ def schedule_save_jobs
132166 Jobs . cancel_scheduled_job ( :set_after_time_wizard , wizard_id : wizard_id )
133167 Jobs . enqueue_at ( enqueue_wizard_at , :set_after_time_wizard , wizard_id : wizard_id )
134168 elsif old_data && old_data [ :after_time ]
135- Jobs . cancel_scheduled_job ( :set_after_time_wizard , wizard_id : wizard_id )
136- self . class . clear_user_wizard_redirect ( wizard_id )
169+ clear_user_wizard_redirect ( wizard_id , after_time : true )
137170 end
138171 end
139172 end
0 commit comments