mrpin-sdk 0.3.141 → 1.0.2

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.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +47 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +65 -0
  6. data/Rakefile +1 -0
  7. data/app/assets/stylesheets/mrpin/sign_in.css +32 -0
  8. data/app/assets/stylesheets/mrpin.css.scss +3 -0
  9. data/app/views/devise/sessions/new.html.erb +16 -0
  10. data/app/views/layouts/devise.html.erb +12 -0
  11. data/lib/mrpin/all_files.rb +48 -0
  12. data/lib/mrpin/api/base/api_object.rb +48 -0
  13. data/lib/mrpin/api/base/handler_base.rb +86 -0
  14. data/lib/mrpin/api/base/request_base.rb +15 -0
  15. data/lib/mrpin/api/base/response_base.rb +29 -0
  16. data/lib/mrpin/api/bundles/init/handler_bundles_init.rb +36 -0
  17. data/lib/mrpin/api/bundles/init/request_bundles_init.rb +7 -0
  18. data/lib/mrpin/api/bundles/init/response_bundles_init.rb +5 -0
  19. data/lib/mrpin/api/packs/requests_pack.rb +38 -0
  20. data/lib/mrpin/api/packs/responses_pack.rb +38 -0
  21. data/lib/mrpin/api/platform/base/handler_platform_base.rb +26 -0
  22. data/lib/mrpin/api/platform/base/request_platform_base.rb +54 -0
  23. data/lib/mrpin/api/platform/report/handler_report_error.rb +74 -0
  24. data/lib/mrpin/api/platform/report/request_report_error.rb +20 -0
  25. data/lib/mrpin/api/standard/response_error.rb +19 -0
  26. data/lib/mrpin/api/standard/response_ok.rb +18 -0
  27. data/lib/mrpin/api/standard/response_session_end.rb +21 -0
  28. data/lib/mrpin/api/standard/response_with_url_data.rb +7 -0
  29. data/lib/mrpin/api/system/echo/handler_system_echo.rb +25 -0
  30. data/lib/mrpin/api/system/echo/request_system_echo.rb +19 -0
  31. data/lib/mrpin/config/initializers/00_carrier_wave.rb +4 -0
  32. data/lib/mrpin/config/initializers/01_devise.rb +264 -0
  33. data/lib/mrpin/config/initializers/02_mongo.rb +2 -0
  34. data/lib/mrpin/config/initializers/03_i18n.rb +3 -0
  35. data/lib/mrpin/config/initializers.rb +7 -0
  36. data/lib/mrpin/config/locales/rails_admin.en.yml +10 -0
  37. data/lib/mrpin/controllers/application_controller_base.rb +14 -0
  38. data/lib/mrpin/controllers/system_controller_base.rb +222 -0
  39. data/lib/mrpin/core/admin/admin_user.rb +39 -0
  40. data/lib/mrpin/core/admin/e_admin_user_role.rb +4 -0
  41. data/lib/mrpin/core/app_config_base.rb +48 -0
  42. data/lib/mrpin/core/app_info/app_info_base.rb +413 -0
  43. data/lib/mrpin/core/app_info/e_app_state.rb +13 -0
  44. data/lib/mrpin/core/base/amf_serializable.rb +16 -0
  45. data/lib/mrpin/core/base/enum_base.rb +12 -0
  46. data/lib/mrpin/core/base/info_base.rb +18 -0
  47. data/lib/mrpin/core/base/manager_base.rb +74 -0
  48. data/lib/mrpin/core/base/manager_with_json_data.rb +98 -0
  49. data/lib/mrpin/core/base/model_base.rb +219 -0
  50. data/lib/mrpin/core/bundles/bundle_base.rb +197 -0
  51. data/lib/mrpin/core/bundles/bundle_info_base.rb +29 -0
  52. data/lib/mrpin/core/bundles/e_build_type.rb +7 -0
  53. data/lib/mrpin/core/bundles/manager_bundles_base.rb +56 -0
  54. data/lib/mrpin/core/constants/constants_remote.rb +14 -0
  55. data/lib/mrpin/core/currency_exchanger/base/exchanger_base.rb +21 -0
  56. data/lib/mrpin/core/currency_exchanger/currency_exchanger.rb +40 -0
  57. data/lib/mrpin/core/currency_exchanger/e_currency_type.rb +8 -0
  58. data/lib/mrpin/core/currency_exchanger/fixer/exchanger_fixer.rb +40 -0
  59. data/lib/mrpin/core/currency_exchanger/local/exchanger_local.rb +23 -0
  60. data/lib/mrpin/core/currency_exchanger/yahoo/exchanger_yahoo.rb +34 -0
  61. data/lib/mrpin/core/exceptions/assertion_error.rb +3 -0
  62. data/lib/mrpin/core/extensions/hash.rb +25 -0
  63. data/lib/mrpin/core/extensions/mongoid_id_alias.rb +7 -0
  64. data/lib/mrpin/core/extensions/object.rb +57 -0
  65. data/lib/mrpin/core/extensions/thread.rb +23 -0
  66. data/lib/mrpin/core/extensions/time.rb +5 -0
  67. data/lib/mrpin/core/logger/logger_sdk.rb +14 -0
  68. data/lib/mrpin/core/platform/e_platform_type.rb +14 -0
  69. data/lib/mrpin/core/player/e_player_role.rb +7 -0
  70. data/lib/mrpin/core/player/e_sex_type.rb +7 -0
  71. data/lib/mrpin/core/player/player_statistic_base.rb +50 -0
  72. data/lib/mrpin/core/purchase/e_sale_type.rb +7 -0
  73. data/lib/mrpin/core/remote/e_response_type.rb +4 -0
  74. data/lib/mrpin/core/remote/http/manager_remote_http.rb +107 -0
  75. data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_api.rb +43 -0
  76. data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_disconnect.rb +69 -0
  77. data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_handle.rb +155 -0
  78. data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_sessions.rb +41 -0
  79. data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_statistic.rb +41 -0
  80. data/lib/mrpin/core/remote/socket/base/extensions/network_interface_helper.rb +53 -0
  81. data/lib/mrpin/core/remote/socket/base/manager_remote_socket_base.rb +131 -0
  82. data/lib/mrpin/core/remote/socket/base/socket_client_base.rb +181 -0
  83. data/lib/mrpin/core/remote/socket/base/socket_client_crossdomain.rb +33 -0
  84. data/lib/mrpin/core/remote/socket/flash/manager_remote_socket_flash.rb +51 -0
  85. data/lib/mrpin/core/remote/socket/flash/socket_client_flash.rb +21 -0
  86. data/lib/mrpin/core/remote/socket/unity/manager_remote_socket_unity.rb +58 -0
  87. data/lib/mrpin/core/remote/socket/unity/socket_client_unity.rb +19 -0
  88. data/lib/mrpin/core/remote/socket/websocket/manager_remote_web_sockets.rb +101 -0
  89. data/lib/mrpin/core/remote/socket/websocket/socket_client_web_sockets.rb +129 -0
  90. data/lib/mrpin/core/remote/socket/with_policy/socket_client_with_policy.rb +66 -0
  91. data/lib/mrpin/core/review.rb +231 -0
  92. data/lib/mrpin/core/scheduler/manager_scheduler.rb +66 -0
  93. data/lib/mrpin/core/statistic/error_client_base.rb +136 -0
  94. data/lib/mrpin/core/statistic/error_server_base.rb +93 -0
  95. data/lib/mrpin/core/statistic/manager_statistics_base.rb +221 -0
  96. data/lib/mrpin/core/statistic/statistic_application_base.rb +88 -0
  97. data/lib/mrpin/core/statistic/statistic_config_base.rb +38 -0
  98. data/lib/mrpin/core/statistic/system_handler_profiler.rb +85 -0
  99. data/lib/mrpin/core/string/e_language_type.rb +29 -0
  100. data/lib/mrpin/core/string/e_string_type_base.rb +14 -0
  101. data/lib/mrpin/core/string/localization_base.rb +77 -0
  102. data/lib/mrpin/core/string/localization_base_map.rb +303 -0
  103. data/lib/mrpin/core/string/manager_string_base.rb +159 -0
  104. data/lib/mrpin/core/threads/thread_with_task.rb +62 -0
  105. data/lib/mrpin/core/uploaders/aws/aws_file_info.rb +16 -0
  106. data/lib/mrpin/core/uploaders/aws/aws_uploader.rb +229 -0
  107. data/lib/mrpin/core/uploaders/carrierwave/file_uploader.rb +7 -0
  108. data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_base.rb +66 -0
  109. data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_local.rb +111 -0
  110. data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_s3.rb +87 -0
  111. data/lib/mrpin/core/uploaders/carrierwave/zip_uploader.rb +10 -0
  112. data/lib/mrpin/core/utils/mongo.rb +41 -0
  113. data/lib/mrpin/core/utils/sorter_base.rb +344 -0
  114. data/lib/mrpin/core/utils/utils_io.rb +27 -0
  115. data/lib/mrpin/core/utils/utils_string.rb +17 -0
  116. data/lib/mrpin/core/utils/utils_zip.rb +58 -0
  117. data/lib/mrpin/libs/rails_admin/localization.rb +70 -0
  118. data/lib/mrpin/libs.rb +11 -0
  119. data/lib/mrpin/rails/engine.rb +11 -0
  120. data/lib/mrpin/vendors.rb +19 -0
  121. data/lib/mrpin/version.rb +3 -0
  122. data/lib/mrpin-sdk.rb +6 -0
  123. data/mrpin-sdk.gemspec +54 -0
  124. metadata +163 -96
@@ -0,0 +1,222 @@
1
+ class SystemControllerBase < ApplicationControllerBase
2
+
3
+ include ActionView::Helpers::DateHelper
4
+
5
+ before_action :authenticate_admin_user!
6
+
7
+
8
+ #
9
+ # properties
10
+ #
11
+
12
+ protected
13
+ def get_system_info
14
+ cpu_load = Vmstat.load_average.to_h
15
+ cpu_load.each do |key, value|
16
+ cpu_load[key] = value.round(2)
17
+ end
18
+
19
+ result =
20
+ {
21
+ environment: Rails.env,
22
+ system:
23
+ {
24
+ 'memory, MB'.to_sym =>
25
+ {
26
+ task: self.memory_task,
27
+ free: Vmstat.memory.free_bytes/1024/1024,
28
+ total: Vmstat.memory.total_bytes/1024/1024,
29
+ },
30
+ cpu_load: cpu_load,
31
+ server_up_time: get_time(Vmstat.boot_time),
32
+ application_up_time: get_time(AppInfo.instance.boot_time)
33
+ },
34
+ sdk_version: Gem.loaded_specs['mrpin-sdk'].version.to_s,
35
+ available_disk_space: self.available_disk_space,
36
+ ruby_version: "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
37
+ }
38
+
39
+ manager_remote = AppInfo.instance.managers_list.detect { |manager| manager.is_a?(ManagerRemoteSocketBase) }
40
+
41
+ unless manager_remote.nil?
42
+ result[:open_sessions] = manager_remote.sessions.size
43
+ result[:requests_pending] = manager_remote.requests_pending
44
+ end
45
+
46
+ result
47
+ end
48
+
49
+ protected
50
+ def available_disk_space
51
+ begin
52
+ %x{df -h /}.lines.to_a
53
+ rescue
54
+ #do nothing
55
+ end
56
+ end
57
+
58
+ protected
59
+ def memory_task
60
+ begin
61
+ `ps -o rss -p #{Process::pid}`.chomp.split("\n").last.strip.to_i/1024
62
+ rescue
63
+ #do nothing
64
+ end
65
+ end
66
+
67
+ public
68
+ def gc_stat
69
+ result = nil
70
+
71
+ begin
72
+ result = get_response_ok(GC.stat)
73
+ rescue Exception => e
74
+ result = get_response_error(e.to_s)
75
+ end
76
+
77
+ render json: result
78
+ end
79
+
80
+ #
81
+ # methods
82
+ #
83
+
84
+ public
85
+ def initialize
86
+ super
87
+ end
88
+
89
+ public
90
+ def info
91
+ result = nil
92
+
93
+ begin
94
+ response = get_system_info
95
+
96
+ result = get_response_ok(response)
97
+
98
+ rescue Exception => e
99
+ result = get_response_error(e.to_s)
100
+ end
101
+
102
+ render json: result
103
+ end
104
+
105
+ private
106
+ def get_time(timestamp)
107
+ result = nil
108
+
109
+ unless timestamp.nil?
110
+ time_ago_in_words(timestamp.utc) + ', ' + timestamp.utc.to_s
111
+ end
112
+
113
+ result
114
+ end
115
+
116
+
117
+ public
118
+ def invalidate_cache
119
+ result = nil
120
+
121
+ begin
122
+ result = AppInfo.instance.invalidate_cache
123
+ rescue Exception => e
124
+ result = get_response_error(e.to_s)
125
+ end
126
+
127
+ render json: result
128
+ end
129
+
130
+ public
131
+ def send_notifications
132
+ result = nil
133
+
134
+ begin
135
+ manager_notifications = AppInfo.instance.manager_notifications
136
+
137
+ unless manager_notifications.nil?
138
+ manager_notifications.send_notifications
139
+ end
140
+
141
+ result = get_response_ok
142
+ rescue Exception => e
143
+ result = get_response_error(e.to_s)
144
+ end
145
+
146
+ render json: result
147
+ end
148
+
149
+ public
150
+ def cleanup_data
151
+ result = nil
152
+
153
+ begin
154
+ result = get_response_ok(AppInfo.instance.cleanup_data)
155
+ rescue Exception => e
156
+ result = get_response_error(e.to_s)
157
+ end
158
+
159
+ render json: result
160
+ end
161
+
162
+ public
163
+ def download
164
+ begin
165
+ url = get_url_for_download(params['type'])
166
+
167
+ assert(!url.nil?, "url is not specified for param #{params['type']}")
168
+
169
+ redirect_to(url)
170
+
171
+ rescue Exception => e
172
+ result = get_response_error(e.to_s)
173
+
174
+ render json: result
175
+ end
176
+
177
+ end
178
+
179
+ private
180
+ def get_url_for_download(type)
181
+ result = nil
182
+
183
+ case type
184
+ when 'csv'
185
+ server_name = AppInfo.instance.server_name
186
+ result = authenticated_url(File.join('csv', server_name, "#{server_name}.zip"), 'mrpin-downloads')
187
+ else
188
+ result = nil
189
+ end
190
+
191
+ result
192
+ end
193
+
194
+ private
195
+ def authenticated_url(key, bucket_name, expires_in = 1.hour)
196
+ s3 = AppInfo.instance.aws_uploader.s3
197
+ object = s3.buckets[bucket_name].objects[key]
198
+ object.url_for(:read, expires_in: expires_in).to_s
199
+ end
200
+
201
+ public
202
+ def generate_client_json
203
+ begin
204
+ errors = AppInfo.instance.call_in_all_managers('generate_client_json')
205
+
206
+ errors.map!(&:to_s)
207
+
208
+ if errors.empty?
209
+ result = get_response_ok
210
+ else
211
+ result = get_response_error(errors)
212
+ end
213
+
214
+ rescue Exception => e
215
+ result = get_response_error(e.to_s)
216
+ end
217
+
218
+ render json: result
219
+ end
220
+
221
+
222
+ end
@@ -0,0 +1,39 @@
1
+ class AdminUser
2
+ include Mongoid::Document
3
+ # Include default devise modules. Others available are:
4
+ # :confirmable, :lockable, :timeoutable and :omniauthable, :registerable, :recoverable,
5
+ devise :database_authenticatable,
6
+ :rememberable,
7
+ :trackable,
8
+ :validatable
9
+
10
+ ## Database authenticatable
11
+ field :email, type: String, default: ''
12
+ field :encrypted_password, type: String, default: ''
13
+
14
+ ## Recoverable
15
+ field :reset_password_token, type: String
16
+ field :reset_password_sent_at, type: Time
17
+
18
+ ## Rememberable
19
+ field :remember_created_at, type: Time
20
+
21
+ ## Trackable
22
+ field :sign_in_count, type: Integer, default: 0
23
+ field :current_sign_in_at, type: Time
24
+ field :last_sign_in_at, type: Time
25
+ field :current_sign_in_ip, type: String
26
+ field :last_sign_in_ip, type: String
27
+ field :role, type: String, default: EAdminUserRole::EAUR_ADMIN
28
+
29
+ ## Confirmable
30
+ # field :confirmation_token, type: String
31
+ # field :confirmed_at, type: Time
32
+ # field :confirmation_sent_at, type: Time
33
+ # field :unconfirmed_email, type: String # Only if using reconfirmable
34
+
35
+ ## Lockable
36
+ # field :failed_attempts, type: Integer, default: 0 # Only if lock strategy is :failed_attempts
37
+ # field :unlock_token, type: String # Only if unlock strategy is :email or :both
38
+ # field :locked_at, type: Time
39
+ end
@@ -0,0 +1,4 @@
1
+ class EAdminUserRole
2
+ EAUR_ADMIN = 'admin'
3
+ EAUR_MODERATOR = 'moderator'
4
+ end
@@ -0,0 +1,48 @@
1
+ class AppConfigBase < ModelBase
2
+
3
+ include Mongoid::Document
4
+
5
+ #
6
+ # callbacks
7
+ #
8
+
9
+ after_save :update_config
10
+
11
+ #
12
+ # db
13
+ #
14
+
15
+ store_in collection: 'app_config'
16
+
17
+ #
18
+ # fields
19
+ #
20
+
21
+ field :server_name, type: String
22
+ field :host, type: String
23
+
24
+ field :server_on_maintenance, type: Boolean, default: false
25
+
26
+ #
27
+ # Properties
28
+ #
29
+
30
+ #
31
+ # Methods
32
+ #
33
+
34
+ # default constructor
35
+ def initialize(options = nil)
36
+ super(options)
37
+ end
38
+
39
+ private
40
+ def update_config
41
+ AppInfo.instance.on_config_updated
42
+ end
43
+
44
+ #
45
+ # validates
46
+ #
47
+
48
+ end
@@ -0,0 +1,413 @@
1
+ class AppInfoBase
2
+
3
+ include Benchmark
4
+ include Singleton
5
+
6
+ #
7
+ # Properties
8
+ #
9
+
10
+ attr_reader :logger
11
+
12
+ attr_reader :managers_list
13
+ attr_reader :managers_with_json_list
14
+
15
+ attr_reader :managers_bundles_map
16
+
17
+ attr_reader :aws_uploader
18
+
19
+ attr_reader :boot_time
20
+
21
+ attr_reader :config
22
+
23
+ attr_reader :state
24
+
25
+ protected
26
+ def state=(value)
27
+ return if @state == value
28
+
29
+ @state = value
30
+
31
+ unless @logger.nil?
32
+ @logger.info("app state is #{@state}")
33
+ end
34
+
35
+ case @state
36
+ when EAppState::EAS_POST_INIT
37
+ call_in_all_managers_with_benchmark('[POST_INIT]', 'post_init')
38
+ when EAppState::EAS_LOAD_INIT_DATA
39
+ call_in_all_managers_with_benchmark('[LOAD_DATA]', 'load_init_data')
40
+
41
+ call_in_all_managers('on_data_loaded')
42
+ when EAppState::EAS_INIT_PERIODICAL_TASKS
43
+ init_periodical_tasks
44
+ when EAppState::EAS_START_MANAGER_TASKS
45
+ call_in_all_managers('start_tasks', 0.1)
46
+ when EAppState::EAS_START_REMOTE_SERVERS
47
+ start_remote_servers
48
+ when EAppState::EAS_LAUNCH_COMPLETE
49
+ call_in_all_managers('on_server_started')
50
+
51
+ @boot_time = Time.now
52
+ when EAppState::EAS_MAINTENANCE
53
+ on_server_maintenance_on
54
+ when EAppState::EAS_SHUTDOWN_STARTED
55
+ call_in_all_managers('on_server_shutdown')
56
+ else
57
+ #do nothing
58
+ end
59
+
60
+ nil
61
+ end
62
+
63
+ public
64
+ def host
65
+ result = nil
66
+
67
+ if !@config.nil? && !@config.host.nil?
68
+ result = @config.host
69
+ end
70
+
71
+ if result.blank?
72
+ @logger.warn('your forgot setup domain name in AppConfig')
73
+ end
74
+
75
+ if Rails.env.development?
76
+ result = 'localhost:3000'
77
+ end
78
+
79
+ result
80
+ end
81
+
82
+ public
83
+ def server_name
84
+ result = 'unknown'
85
+
86
+ unless @config.nil?
87
+ result = @config.server_name
88
+ end
89
+
90
+ result
91
+ end
92
+
93
+ public
94
+ def is_server_on_maintenance?
95
+ @state == EAppState::EAS_MAINTENANCE
96
+ end
97
+
98
+ #
99
+ # Events
100
+ #
101
+
102
+ public
103
+ def on_server_shutdown
104
+ self.state = EAppState::EAS_SHUTDOWN_STARTED
105
+
106
+ nil
107
+ end
108
+
109
+ protected
110
+ def on_server_maintenance_on
111
+ call_in_all_managers('on_server_maintenance_on')
112
+
113
+ nil
114
+ end
115
+
116
+ public
117
+ def on_config_updated
118
+ init_config
119
+ end
120
+
121
+
122
+ public
123
+ def on_server_error(message, exception = nil, request = nil, player_id = nil)
124
+ request_class = request.class.to_s
125
+ player_id ||= 'unknown'
126
+
127
+ exception ||= Exception.new(message)
128
+
129
+ stacktrace = exception.backtrace
130
+
131
+ stacktrace = caller if stacktrace.nil?
132
+
133
+ logger_message = ''
134
+
135
+ logger_message += "\nerror message: #{message}"
136
+
137
+ unless request.nil?
138
+ logger_message += "\nerror request: #{request}"
139
+ logger_message += "\nerror request class: #{request.class}"
140
+ end
141
+
142
+ if Rails.env.development?
143
+ logger_message += "\nerror player_id: #{player_id}" unless player_id.nil?
144
+ logger_message += "\nerror stack trace: #{stacktrace}"
145
+ end
146
+
147
+ @logger.error(logger_message)
148
+
149
+ if Rails.env.production?
150
+
151
+ md5 = Digest::MD5.hexdigest(request_class.to_s + message.to_s)
152
+
153
+ error = ErrorServerBase.where(md5: md5).first
154
+
155
+ if error.nil?
156
+ #create
157
+ error = ErrorServerBase.new
158
+ error.first_error_at = Time.now.to_i
159
+ error.message = UtilsString.to_utf8(message)
160
+ error.request_class = request_class
161
+ error.md5 = md5
162
+ end
163
+
164
+ player_errors_count = error.players_ids_map[player_id] || 0
165
+
166
+ error.last_error_at = Time.now.to_i
167
+ error.players_ids_map[player_id] = player_errors_count + 1
168
+ error.throws_count += 1
169
+ error.players_count = error.players_ids_map.size
170
+ error.stack_trace = stacktrace
171
+
172
+ error.save!
173
+ end
174
+
175
+
176
+ end
177
+
178
+ #
179
+ # Methods
180
+ #
181
+
182
+ public
183
+ def initialize(options = nil)
184
+ init_logger
185
+
186
+ @aws_uploader = AWSUploader.new
187
+
188
+ begin
189
+ init_config
190
+ init_managers
191
+ rescue Exception => e
192
+ on_server_error(e.to_s, e)
193
+
194
+ @logger.error "can't start server with error #{e}."
195
+
196
+ sleep 60
197
+
198
+ exit
199
+ end
200
+
201
+ at_exit do
202
+ on_server_shutdown
203
+ end
204
+
205
+ end
206
+
207
+ private
208
+ def init_logger
209
+ @logger = Logger.new($stdout)
210
+ @logger.formatter = LoggerSdk.new
211
+
212
+ nil
213
+ end
214
+
215
+ protected
216
+ def init_config
217
+ config = AppConfigBase.first
218
+
219
+ if config.nil?
220
+ @logger.warn('config is empty')
221
+ return
222
+ end
223
+
224
+ @config = config
225
+
226
+ if @config.server_on_maintenance
227
+ self.state = EAppState::EAS_MAINTENANCE
228
+ end
229
+
230
+ nil
231
+ end
232
+
233
+ protected
234
+ def init_managers
235
+ self.state = EAppState::EAS_INIT_MANAGERS
236
+
237
+ @managers_list = []
238
+ @managers_with_json_list = []
239
+ #key - build type, value - manager_bundle
240
+ @managers_bundles_map = {}
241
+
242
+ @manager_scheduler = nil
243
+
244
+ nil
245
+ end
246
+
247
+ public
248
+ def call_in_all_managers(method_name, delay_between_calls = 0.0)
249
+ result = []
250
+
251
+ @managers_list.each do |manager|
252
+ next unless manager.respond_to?(method_name)
253
+
254
+ begin
255
+ manager.send(method_name)
256
+
257
+ if delay_between_calls > 0
258
+ sleep(delay_between_calls)
259
+ end
260
+
261
+ rescue Exception => e
262
+ on_server_error("Error on #{__method__}: #{e.to_s}", e)
263
+
264
+ result << e
265
+ end
266
+ end
267
+
268
+ result
269
+ end
270
+
271
+ public
272
+ def call_in_all_managers_with_benchmark(benchmark_name, method_name, exit_on_error = true)
273
+ result = []
274
+
275
+ white_spaces_count = 50
276
+
277
+ spaces = ' ' * white_spaces_count
278
+
279
+ benchmark("#{benchmark_name}\n#{spaces}#{CAPTION}", white_spaces_count, FORMAT) do |benchmark|
280
+ @managers_list.each do |manager|
281
+ benchmark.report("#{manager.class.name}") do
282
+ begin
283
+ next unless manager.respond_to?(method_name)
284
+
285
+ manager.send(method_name)
286
+ rescue Exception => e
287
+ on_server_error("Error on #{__method__}: #{e.to_s}", e)
288
+
289
+ result << e
290
+ end
291
+ end
292
+ end
293
+ end
294
+
295
+ if !result.empty? && exit_on_error
296
+ result.each do |e|
297
+ on_server_error(e.to_s, e)
298
+ end
299
+
300
+ exit
301
+ end
302
+
303
+ result
304
+ end
305
+
306
+ protected
307
+ def add_manager_bundles(manager)
308
+ @managers_bundles_map[manager.build_type] = manager
309
+ @managers_list << manager
310
+
311
+ nil
312
+ end
313
+
314
+ protected
315
+ def create_manager(manager_class)
316
+ result = manager_class.new
317
+
318
+ @managers_list << result
319
+
320
+ if result.is_a?(ManagerWithJsonData)
321
+ @managers_with_json_list << result
322
+ end
323
+
324
+ result
325
+ end
326
+
327
+
328
+ public
329
+ def post_init
330
+
331
+ self.state = EAppState::EAS_POST_INIT
332
+
333
+ self.state = EAppState::EAS_LOAD_INIT_DATA
334
+
335
+ self.state = EAppState::EAS_INIT_PERIODICAL_TASKS
336
+
337
+ self.state = EAppState::EAS_START_MANAGER_TASKS
338
+
339
+ self.state = EAppState::EAS_START_REMOTE_SERVERS
340
+ end
341
+
342
+ protected
343
+ def start_remote_servers
344
+ assert(false, 'please override')
345
+
346
+ nil
347
+ end
348
+
349
+ #todo:review
350
+ protected
351
+ def init_periodical_tasks
352
+ # Tasks Every
353
+
354
+ # @manager_scheduler.scheduler.every '1h', overlap: false, first_in: '30m' do
355
+
356
+ # Tasks Cron
357
+
358
+ # Minute Hour Day of Month Month Day of Week
359
+ # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
360
+
361
+ # every day
362
+ # @manager_scheduler.scheduler.cron '00 00 * * *' do
363
+ # every tuesday 14:00
364
+ # @manager_scheduler.scheduler.cron '00 14 * * 2' do
365
+ end
366
+
367
+ public
368
+ def invalidate_cache
369
+ result = nil
370
+
371
+ errors = call_in_all_managers_with_benchmark('[INVALIDATE_CACHE]', 'invalidate_cache', false)
372
+
373
+ errors.map!(&:to_s)
374
+
375
+ if errors.empty?
376
+ result = get_response_ok
377
+ else
378
+ result = get_response_error(errors)
379
+ end
380
+
381
+ result
382
+ end
383
+
384
+ protected
385
+ def try_create_admin_user(login, password, role)
386
+ result = AdminUser.where(email: login).first
387
+
388
+ if result.nil?
389
+ result = AdminUser.create!(email: login, password: password, password_confirmation: password, role: role)
390
+ end
391
+
392
+ result
393
+ end
394
+
395
+ public
396
+ def cleanup_data
397
+ result = nil
398
+
399
+ errors = call_in_all_managers('cleanup_data')
400
+
401
+ errors.map!(&:to_s)
402
+
403
+ if errors.empty?
404
+ result = get_response_ok
405
+ else
406
+ result = get_response_error(errors)
407
+ end
408
+
409
+ result
410
+ end
411
+
412
+ end
413
+