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.
- checksums.yaml +4 -4
- data/.gitignore +47 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +65 -0
- data/Rakefile +1 -0
- data/app/assets/stylesheets/mrpin/sign_in.css +32 -0
- data/app/assets/stylesheets/mrpin.css.scss +3 -0
- data/app/views/devise/sessions/new.html.erb +16 -0
- data/app/views/layouts/devise.html.erb +12 -0
- data/lib/mrpin/all_files.rb +48 -0
- data/lib/mrpin/api/base/api_object.rb +48 -0
- data/lib/mrpin/api/base/handler_base.rb +86 -0
- data/lib/mrpin/api/base/request_base.rb +15 -0
- data/lib/mrpin/api/base/response_base.rb +29 -0
- data/lib/mrpin/api/bundles/init/handler_bundles_init.rb +36 -0
- data/lib/mrpin/api/bundles/init/request_bundles_init.rb +7 -0
- data/lib/mrpin/api/bundles/init/response_bundles_init.rb +5 -0
- data/lib/mrpin/api/packs/requests_pack.rb +38 -0
- data/lib/mrpin/api/packs/responses_pack.rb +38 -0
- data/lib/mrpin/api/platform/base/handler_platform_base.rb +26 -0
- data/lib/mrpin/api/platform/base/request_platform_base.rb +54 -0
- data/lib/mrpin/api/platform/report/handler_report_error.rb +74 -0
- data/lib/mrpin/api/platform/report/request_report_error.rb +20 -0
- data/lib/mrpin/api/standard/response_error.rb +19 -0
- data/lib/mrpin/api/standard/response_ok.rb +18 -0
- data/lib/mrpin/api/standard/response_session_end.rb +21 -0
- data/lib/mrpin/api/standard/response_with_url_data.rb +7 -0
- data/lib/mrpin/api/system/echo/handler_system_echo.rb +25 -0
- data/lib/mrpin/api/system/echo/request_system_echo.rb +19 -0
- data/lib/mrpin/config/initializers/00_carrier_wave.rb +4 -0
- data/lib/mrpin/config/initializers/01_devise.rb +264 -0
- data/lib/mrpin/config/initializers/02_mongo.rb +2 -0
- data/lib/mrpin/config/initializers/03_i18n.rb +3 -0
- data/lib/mrpin/config/initializers.rb +7 -0
- data/lib/mrpin/config/locales/rails_admin.en.yml +10 -0
- data/lib/mrpin/controllers/application_controller_base.rb +14 -0
- data/lib/mrpin/controllers/system_controller_base.rb +222 -0
- data/lib/mrpin/core/admin/admin_user.rb +39 -0
- data/lib/mrpin/core/admin/e_admin_user_role.rb +4 -0
- data/lib/mrpin/core/app_config_base.rb +48 -0
- data/lib/mrpin/core/app_info/app_info_base.rb +413 -0
- data/lib/mrpin/core/app_info/e_app_state.rb +13 -0
- data/lib/mrpin/core/base/amf_serializable.rb +16 -0
- data/lib/mrpin/core/base/enum_base.rb +12 -0
- data/lib/mrpin/core/base/info_base.rb +18 -0
- data/lib/mrpin/core/base/manager_base.rb +74 -0
- data/lib/mrpin/core/base/manager_with_json_data.rb +98 -0
- data/lib/mrpin/core/base/model_base.rb +219 -0
- data/lib/mrpin/core/bundles/bundle_base.rb +197 -0
- data/lib/mrpin/core/bundles/bundle_info_base.rb +29 -0
- data/lib/mrpin/core/bundles/e_build_type.rb +7 -0
- data/lib/mrpin/core/bundles/manager_bundles_base.rb +56 -0
- data/lib/mrpin/core/constants/constants_remote.rb +14 -0
- data/lib/mrpin/core/currency_exchanger/base/exchanger_base.rb +21 -0
- data/lib/mrpin/core/currency_exchanger/currency_exchanger.rb +40 -0
- data/lib/mrpin/core/currency_exchanger/e_currency_type.rb +8 -0
- data/lib/mrpin/core/currency_exchanger/fixer/exchanger_fixer.rb +40 -0
- data/lib/mrpin/core/currency_exchanger/local/exchanger_local.rb +23 -0
- data/lib/mrpin/core/currency_exchanger/yahoo/exchanger_yahoo.rb +34 -0
- data/lib/mrpin/core/exceptions/assertion_error.rb +3 -0
- data/lib/mrpin/core/extensions/hash.rb +25 -0
- data/lib/mrpin/core/extensions/mongoid_id_alias.rb +7 -0
- data/lib/mrpin/core/extensions/object.rb +57 -0
- data/lib/mrpin/core/extensions/thread.rb +23 -0
- data/lib/mrpin/core/extensions/time.rb +5 -0
- data/lib/mrpin/core/logger/logger_sdk.rb +14 -0
- data/lib/mrpin/core/platform/e_platform_type.rb +14 -0
- data/lib/mrpin/core/player/e_player_role.rb +7 -0
- data/lib/mrpin/core/player/e_sex_type.rb +7 -0
- data/lib/mrpin/core/player/player_statistic_base.rb +50 -0
- data/lib/mrpin/core/purchase/e_sale_type.rb +7 -0
- data/lib/mrpin/core/remote/e_response_type.rb +4 -0
- data/lib/mrpin/core/remote/http/manager_remote_http.rb +107 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_api.rb +43 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_disconnect.rb +69 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_handle.rb +155 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_sessions.rb +41 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_statistic.rb +41 -0
- data/lib/mrpin/core/remote/socket/base/extensions/network_interface_helper.rb +53 -0
- data/lib/mrpin/core/remote/socket/base/manager_remote_socket_base.rb +131 -0
- data/lib/mrpin/core/remote/socket/base/socket_client_base.rb +181 -0
- data/lib/mrpin/core/remote/socket/base/socket_client_crossdomain.rb +33 -0
- data/lib/mrpin/core/remote/socket/flash/manager_remote_socket_flash.rb +51 -0
- data/lib/mrpin/core/remote/socket/flash/socket_client_flash.rb +21 -0
- data/lib/mrpin/core/remote/socket/unity/manager_remote_socket_unity.rb +58 -0
- data/lib/mrpin/core/remote/socket/unity/socket_client_unity.rb +19 -0
- data/lib/mrpin/core/remote/socket/websocket/manager_remote_web_sockets.rb +101 -0
- data/lib/mrpin/core/remote/socket/websocket/socket_client_web_sockets.rb +129 -0
- data/lib/mrpin/core/remote/socket/with_policy/socket_client_with_policy.rb +66 -0
- data/lib/mrpin/core/review.rb +231 -0
- data/lib/mrpin/core/scheduler/manager_scheduler.rb +66 -0
- data/lib/mrpin/core/statistic/error_client_base.rb +136 -0
- data/lib/mrpin/core/statistic/error_server_base.rb +93 -0
- data/lib/mrpin/core/statistic/manager_statistics_base.rb +221 -0
- data/lib/mrpin/core/statistic/statistic_application_base.rb +88 -0
- data/lib/mrpin/core/statistic/statistic_config_base.rb +38 -0
- data/lib/mrpin/core/statistic/system_handler_profiler.rb +85 -0
- data/lib/mrpin/core/string/e_language_type.rb +29 -0
- data/lib/mrpin/core/string/e_string_type_base.rb +14 -0
- data/lib/mrpin/core/string/localization_base.rb +77 -0
- data/lib/mrpin/core/string/localization_base_map.rb +303 -0
- data/lib/mrpin/core/string/manager_string_base.rb +159 -0
- data/lib/mrpin/core/threads/thread_with_task.rb +62 -0
- data/lib/mrpin/core/uploaders/aws/aws_file_info.rb +16 -0
- data/lib/mrpin/core/uploaders/aws/aws_uploader.rb +229 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader.rb +7 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_base.rb +66 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_local.rb +111 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_s3.rb +87 -0
- data/lib/mrpin/core/uploaders/carrierwave/zip_uploader.rb +10 -0
- data/lib/mrpin/core/utils/mongo.rb +41 -0
- data/lib/mrpin/core/utils/sorter_base.rb +344 -0
- data/lib/mrpin/core/utils/utils_io.rb +27 -0
- data/lib/mrpin/core/utils/utils_string.rb +17 -0
- data/lib/mrpin/core/utils/utils_zip.rb +58 -0
- data/lib/mrpin/libs/rails_admin/localization.rb +70 -0
- data/lib/mrpin/libs.rb +11 -0
- data/lib/mrpin/rails/engine.rb +11 -0
- data/lib/mrpin/vendors.rb +19 -0
- data/lib/mrpin/version.rb +3 -0
- data/lib/mrpin-sdk.rb +6 -0
- data/mrpin-sdk.gemspec +54 -0
- metadata +163 -96
@@ -0,0 +1,229 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
class AWSUploader
|
4
|
+
|
5
|
+
BUCKET_NAME_DEFAULT = 'mrpin-static'
|
6
|
+
DOMAIN_NAME_CLOUD_FRONT = 'd3crzre36asem1.cloudfront.net'
|
7
|
+
DOMAIN_NAME_S3 = 's3.amazonaws.com'
|
8
|
+
AWS_REGION = 'us-east-1'
|
9
|
+
|
10
|
+
CACHE_CONTROL_MAX_AGE_DEFAULT = 365 * 24 * 60 * 60
|
11
|
+
|
12
|
+
attr_reader :s3
|
13
|
+
attr_reader :cloud_front
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
credentials = {}
|
17
|
+
|
18
|
+
credentials[:access_key_id] = get_var_from_env('AWS_ACCESS_KEY_ID')
|
19
|
+
credentials[:secret_access_key] = get_var_from_env('AWS_SECRET_ACCESS_KEY')
|
20
|
+
credentials[:region] = AWS_REGION
|
21
|
+
|
22
|
+
@s3 = Aws::S3::Client.new(credentials)
|
23
|
+
@s3_resources = Aws::S3::Resource.new(credentials)
|
24
|
+
@cloud_front = Aws::CloudFront::Client.new(credentials)
|
25
|
+
end
|
26
|
+
|
27
|
+
# upload files to s3 and returns urls map
|
28
|
+
public
|
29
|
+
def upload_files_to_s3(files_to_upload, bucket_name, keys)
|
30
|
+
bucket_name ||= BUCKET_NAME_DEFAULT
|
31
|
+
|
32
|
+
assert(!files_to_upload.nil?, 'aws:upload_files_to_s3. Files to upload must be non nil')
|
33
|
+
assert(!bucket_name.nil?, 'aws:upload_files_to_s3. Bucket name must be non nil')
|
34
|
+
assert(!keys.nil? && keys.size == files_to_upload.size, 'aws:upload_files_to_s3. Desired names must be non nil and its count must be equal count of files to upload')
|
35
|
+
|
36
|
+
result = []
|
37
|
+
|
38
|
+
begin
|
39
|
+
|
40
|
+
[0..files_to_upload.size - 1].each do |i|
|
41
|
+
file_to_upload = files_to_upload[i]
|
42
|
+
|
43
|
+
s3_key = keys[i]
|
44
|
+
|
45
|
+
result << upload_file_to_s3(file_to_upload, bucket_name, s3_key)
|
46
|
+
end
|
47
|
+
|
48
|
+
rescue Exception => e
|
49
|
+
|
50
|
+
result.each do |file_info|
|
51
|
+
delete_file_from_s3_by_uri(bucket_name, file_info.url_s3)
|
52
|
+
end
|
53
|
+
|
54
|
+
assert(false, e.to_s)
|
55
|
+
end
|
56
|
+
|
57
|
+
result
|
58
|
+
end
|
59
|
+
|
60
|
+
public
|
61
|
+
def upload_file_to_s3(file_to_upload, bucket_name, key)
|
62
|
+
result = nil
|
63
|
+
|
64
|
+
File.open(file_to_upload) do |data_to_upload|
|
65
|
+
result = upload_to_s3_internal(data_to_upload, bucket_name, key, file_to_upload)
|
66
|
+
end
|
67
|
+
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
# upload file to s3 and returns instance of AWSFileInfo
|
72
|
+
public
|
73
|
+
def upload_data_to_s3(data_to_upload, bucket_name, path, desired_name = nil)
|
74
|
+
upload_to_s3_internal(data_to_upload, bucket_name, path, desired_name)
|
75
|
+
end
|
76
|
+
|
77
|
+
public
|
78
|
+
def upload_url_file_to_s3(url_to_upload, bucket_name, key)
|
79
|
+
result = nil
|
80
|
+
|
81
|
+
open(url_to_upload) do |data_to_upload|
|
82
|
+
result = upload_to_s3_internal(data_to_upload, bucket_name, key, url_to_upload)
|
83
|
+
end
|
84
|
+
|
85
|
+
result.source = url_to_upload
|
86
|
+
|
87
|
+
result
|
88
|
+
end
|
89
|
+
|
90
|
+
# @source_type - possible values :file, :data
|
91
|
+
private
|
92
|
+
def upload_to_s3_internal(data_to_upload, bucket_name, s3_key, source = nil)
|
93
|
+
result = AWSFileInfo.new
|
94
|
+
|
95
|
+
bucket_name ||= BUCKET_NAME_DEFAULT
|
96
|
+
|
97
|
+
s3_object_options = {}
|
98
|
+
s3_object_options[:body] = data_to_upload
|
99
|
+
s3_object_options[:acl] = 'public-read'
|
100
|
+
s3_object_options[:cache_control] = "max-age=#{CACHE_CONTROL_MAX_AGE_DEFAULT}"
|
101
|
+
|
102
|
+
s3_object = @s3_resources.bucket(bucket_name).object(s3_key)
|
103
|
+
|
104
|
+
s3_object.put(s3_object_options)
|
105
|
+
|
106
|
+
result.source = source
|
107
|
+
result.url_s3 = s3_object.public_url
|
108
|
+
result.url_cloud_front = get_cloud_front_url(result.url_s3)
|
109
|
+
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
public
|
114
|
+
def delete_file_from_s3_by_uri(bucket_name, url)
|
115
|
+
bucket_name ||= BUCKET_NAME_DEFAULT
|
116
|
+
|
117
|
+
key = get_key_from_url(url, bucket_name)
|
118
|
+
|
119
|
+
delete_file_from_s3(bucket_name, key)
|
120
|
+
end
|
121
|
+
|
122
|
+
# remove file from s3
|
123
|
+
public
|
124
|
+
def delete_file_from_s3(bucket_name, key)
|
125
|
+
bucket_name ||= BUCKET_NAME_DEFAULT
|
126
|
+
|
127
|
+
return unless check_s3_object_exists(key, bucket_name)
|
128
|
+
|
129
|
+
s3_object = @s3_resources.bucket(bucket_name).object(key)
|
130
|
+
|
131
|
+
s3_object.delete
|
132
|
+
|
133
|
+
nil
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
#
|
138
|
+
# CloudFront
|
139
|
+
#
|
140
|
+
|
141
|
+
public
|
142
|
+
def get_cloud_front_url(url, use_ssl = true)
|
143
|
+
result = url.sub URI.parse(url).host, DOMAIN_NAME_CLOUD_FRONT
|
144
|
+
|
145
|
+
if use_ssl
|
146
|
+
result.sub! 'http:/', 'https:/'
|
147
|
+
else
|
148
|
+
result.sub! 'https:/', 'http:/'
|
149
|
+
end
|
150
|
+
|
151
|
+
result
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
public
|
156
|
+
def get_distribution_id_by(bucket_name = BUCKET_NAME_DEFAULT)
|
157
|
+
result = nil
|
158
|
+
|
159
|
+
response = @cloud_front.list_distributions
|
160
|
+
|
161
|
+
list_distributions = response[:items]
|
162
|
+
|
163
|
+
list_distributions.each do |distribution|
|
164
|
+
origin_settings = distribution[:origins]
|
165
|
+
origin_item_first = origin_settings[:items].first
|
166
|
+
origin_domain_name = origin_item_first[:domain_name]
|
167
|
+
origin_name = origin_domain_name.split('.s3.').first
|
168
|
+
|
169
|
+
if origin_name == bucket_name
|
170
|
+
result = distribution[:id]
|
171
|
+
break
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
result
|
176
|
+
end
|
177
|
+
|
178
|
+
public
|
179
|
+
def invalidate_distribution(distribution_id, keys)
|
180
|
+
|
181
|
+
assert(!distribution_id.nil?, 'aws:invalidate_distribution. distribution_id must be non nil')
|
182
|
+
assert(keys.is_a?(Array), 'aws:invalidate_distribution. distribution_id must be non nil')
|
183
|
+
|
184
|
+
keys = keys.map do |k|
|
185
|
+
k.start_with?('/') ? k : '/' + k
|
186
|
+
end
|
187
|
+
|
188
|
+
paths = {}
|
189
|
+
paths[:items] = keys
|
190
|
+
paths[:quantity] = keys.size
|
191
|
+
|
192
|
+
invalidation_batch = {}
|
193
|
+
invalidation_batch[:caller_reference] = Time.now.to_i.to_s
|
194
|
+
invalidation_batch[:paths] = paths
|
195
|
+
|
196
|
+
options = {}
|
197
|
+
options[:distribution_id] = distribution_id
|
198
|
+
options[:invalidation_batch] = invalidation_batch
|
199
|
+
|
200
|
+
response = @cloud_front.create_invalidation(options)
|
201
|
+
end
|
202
|
+
|
203
|
+
public
|
204
|
+
def get_s3_url(url, bucket_name = BUCKET_NAME_DEFAULT)
|
205
|
+
result = url.sub URI.parse(url).host, "#{bucket_name}.#{DOMAIN_NAME_S3}"
|
206
|
+
|
207
|
+
result.sub! 'http:/', 'https:/'
|
208
|
+
|
209
|
+
result
|
210
|
+
end
|
211
|
+
|
212
|
+
public
|
213
|
+
def check_s3_object_exists(url, bucket_name = BUCKET_NAME_DEFAULT)
|
214
|
+
|
215
|
+
key = get_key_from_url(url, bucket_name)
|
216
|
+
|
217
|
+
s3_object = @s3_resources.bucket(bucket_name).object(key)
|
218
|
+
|
219
|
+
s3_object.exists?
|
220
|
+
end
|
221
|
+
|
222
|
+
private
|
223
|
+
def get_key_from_url(url, bucket_name = nil)
|
224
|
+
bucket_name ||= BUCKET_NAME_DEFAULT
|
225
|
+
|
226
|
+
URI(url).path.gsub(bucket_name, '').gsub(/\/+/, '/').gsub(/^\/+/, '')
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#todo: fix extension
|
2
|
+
module FileUploaderHelpersBase
|
3
|
+
|
4
|
+
#
|
5
|
+
# properties
|
6
|
+
#
|
7
|
+
|
8
|
+
# key - url field
|
9
|
+
# value - uploader field
|
10
|
+
protected
|
11
|
+
def url_uploaders_map
|
12
|
+
{}
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# methods
|
17
|
+
#
|
18
|
+
|
19
|
+
protected
|
20
|
+
def delete_uploaded_files
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def try_update_uploaded_files
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def delete_uploaded_files_if_error
|
29
|
+
if self.new_record? && !errors.empty?
|
30
|
+
|
31
|
+
delete_uploaded_files
|
32
|
+
|
33
|
+
url_uploaders_map.each_key do |url_field|
|
34
|
+
self.send("#{url_field}=", nil)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# commons methods
|
42
|
+
#
|
43
|
+
|
44
|
+
protected
|
45
|
+
def get_upload_file_name(url_field, file_path)
|
46
|
+
result = "#{self.id.to_s}_#{url_field}_#{Time.now.to_i}"
|
47
|
+
|
48
|
+
extension = File.extname file_path
|
49
|
+
|
50
|
+
unless extension.nil?
|
51
|
+
result += extension.downcase
|
52
|
+
end
|
53
|
+
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def upload_file_full_path(url_field)
|
59
|
+
game_name = AppInfo.instance.server_name
|
60
|
+
path = upload_file_path(url_field)
|
61
|
+
|
62
|
+
File.join(game_name, path)
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module FileUploaderHelpersLocal
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_destroy :delete_uploaded_files
|
7
|
+
before_validation :try_update_uploaded_files
|
8
|
+
after_validation :delete_uploaded_files_if_error
|
9
|
+
end
|
10
|
+
|
11
|
+
include FileUploaderHelpersBase
|
12
|
+
|
13
|
+
#
|
14
|
+
# properties
|
15
|
+
#
|
16
|
+
|
17
|
+
#
|
18
|
+
# methods
|
19
|
+
#
|
20
|
+
|
21
|
+
# default constructor
|
22
|
+
protected
|
23
|
+
def try_update_uploaded_files
|
24
|
+
url_uploaders_map.each do |url_field, uploader_field|
|
25
|
+
|
26
|
+
next unless self.send(uploader_field).present?
|
27
|
+
|
28
|
+
begin
|
29
|
+
file_to_upload = self.send(uploader_field).file.file.to_s
|
30
|
+
|
31
|
+
# delete old file if was uploaded
|
32
|
+
old_url = self.send(url_field)
|
33
|
+
|
34
|
+
delete_file_local(old_url)
|
35
|
+
|
36
|
+
# upload new file
|
37
|
+
path = upload_file_full_path(url_field)
|
38
|
+
name = get_upload_file_name(url_field, file_to_upload)
|
39
|
+
|
40
|
+
file_path = File.join(path, name)
|
41
|
+
|
42
|
+
file_path_local = UtilsIO.to_local_path(file_path)
|
43
|
+
|
44
|
+
upload_file(url_field, file_to_upload, file_path_local)
|
45
|
+
|
46
|
+
rescue Exception => e
|
47
|
+
errors[:base] << e.to_s
|
48
|
+
ensure
|
49
|
+
file_path = File.dirname(file_to_upload)
|
50
|
+
|
51
|
+
FileUtils.rm_rf(file_path) if File.exists?(file_path)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def upload_file(url_field, file_to_upload, file_path_local)
|
61
|
+
file_dir = File.dirname(file_path_local)
|
62
|
+
|
63
|
+
FileUtils.mkdir_p(file_dir)
|
64
|
+
|
65
|
+
FileUtils.copy(file_to_upload, file_path_local)
|
66
|
+
|
67
|
+
file_path_domain = UtilsIO.to_domain_path(file_path_local)
|
68
|
+
|
69
|
+
self.send("#{url_field}=", file_path_domain)
|
70
|
+
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
protected
|
76
|
+
def get_upload_file_name(url_field, file_path)
|
77
|
+
file_name = File.basename(file_path)
|
78
|
+
|
79
|
+
result = "#{file_name}_#{url_field}_#{Time.now.to_i}"
|
80
|
+
|
81
|
+
extension = File.extname file_path
|
82
|
+
|
83
|
+
unless extension.nil?
|
84
|
+
result += extension.downcase
|
85
|
+
end
|
86
|
+
|
87
|
+
result
|
88
|
+
end
|
89
|
+
|
90
|
+
protected
|
91
|
+
def delete_uploaded_files
|
92
|
+
url_uploaders_map.each do |url_field, uploader_field|
|
93
|
+
url = self.send(url_field)
|
94
|
+
delete_file_local(url)
|
95
|
+
end
|
96
|
+
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
def delete_file_local(url)
|
102
|
+
return if url.nil? || url.blank?
|
103
|
+
|
104
|
+
local_path = UtilsIO.to_local_path(url)
|
105
|
+
|
106
|
+
FileUtils.rm_rf(local_path) if File.exists?(local_path)
|
107
|
+
|
108
|
+
nil
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module FileUploaderHelpersS3
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_destroy :delete_uploaded_files
|
7
|
+
before_validation :try_update_uploaded_files
|
8
|
+
after_validation :delete_uploaded_files_if_error
|
9
|
+
end
|
10
|
+
|
11
|
+
include FileUploaderHelpersBase
|
12
|
+
|
13
|
+
#
|
14
|
+
# Properties
|
15
|
+
#
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
protected
|
21
|
+
def upload_file_path(url_field)
|
22
|
+
assert(false, 'Please override')
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def aws_uploader
|
27
|
+
@aws_uploader ||= AppInfo.instance.aws_uploader
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
#
|
32
|
+
# Methods
|
33
|
+
#
|
34
|
+
|
35
|
+
protected
|
36
|
+
def try_update_uploaded_files
|
37
|
+
url_uploaders_map.each do |url_field, uploader_field|
|
38
|
+
|
39
|
+
next unless self.send(uploader_field).present?
|
40
|
+
|
41
|
+
begin
|
42
|
+
file_to_upload = self.send(uploader_field).file.file.to_s
|
43
|
+
|
44
|
+
# delete old file if was uploaded
|
45
|
+
old_url = self.send(url_field)
|
46
|
+
|
47
|
+
delete_file_from_s3(old_url)
|
48
|
+
|
49
|
+
# upload new file
|
50
|
+
path = upload_file_full_path(url_field)
|
51
|
+
name = get_upload_file_name(url_field, file_to_upload)
|
52
|
+
|
53
|
+
s3_key = File.join(path, name)
|
54
|
+
|
55
|
+
s3_file_info = aws_uploader.upload_file_to_s3(file_to_upload, AWSUploader::BUCKET_NAME_DEFAULT, s3_key)
|
56
|
+
|
57
|
+
self.send("#{url_field}=", s3_file_info.url_cloud_front)
|
58
|
+
|
59
|
+
rescue Exception => e
|
60
|
+
errors[:base] << e.to_s
|
61
|
+
|
62
|
+
ensure
|
63
|
+
file_path = File.dirname(file_to_upload)
|
64
|
+
|
65
|
+
FileUtils.rm_rf(file_path) if File.exists?(file_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
def delete_uploaded_files
|
73
|
+
url_uploaders_map.each do |url_field, uploader_field|
|
74
|
+
url = self.send(url_field)
|
75
|
+
delete_file_from_s3(url)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def delete_file_from_s3(url)
|
81
|
+
unless url.nil? || url.blank?
|
82
|
+
s3_url = aws_uploader.get_s3_url(url)
|
83
|
+
aws_uploader.delete_file_from_s3_by_uri(AWSUploader::BUCKET_NAME_DEFAULT, s3_url)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Utils
|
2
|
+
module Mongo
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def create_capped_collection(collection, size, max = 10_000_000)
|
7
|
+
Mongoid::Clients.default.command(create: collection, capped: true, size: size, max: max)
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_collection_stats(collection)
|
11
|
+
Mongoid::Clients.default.command(collStats: collection) rescue nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_database_stats
|
15
|
+
Mongoid::Clients.default.command(dbStats: 1) rescue nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_collection_storage_size(collection)
|
19
|
+
get_collection_stats_property(collection, 'storageSize')
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_collection_data_size(collection)
|
23
|
+
get_collection_stats_property(collection, 'size')
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_collection_stats_property(collection, property)
|
27
|
+
result = nil
|
28
|
+
|
29
|
+
stats = get_collection_stats(collection)
|
30
|
+
|
31
|
+
if !stats.nil? && !stats.first.nil?
|
32
|
+
result = stats.first[property]
|
33
|
+
end
|
34
|
+
|
35
|
+
result
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|