web47core 0.0.8 → 0.0.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 +0 -14
- data/Gemfile.lock +30 -9
- data/README.md +27 -4
- data/lib/app/models/concerns/app47_logger.rb +175 -0
- data/lib/app/models/concerns/core_account.rb +51 -0
- data/lib/app/models/concerns/standard_model.rb +104 -6
- data/lib/app/models/email_notification.rb +253 -0
- data/lib/app/models/email_template.rb +6 -0
- data/lib/app/models/notification.rb +276 -0
- data/lib/app/models/notification_template.rb +20 -0
- data/lib/app/models/slack_notification.rb +89 -0
- data/lib/app/models/sms_notification.rb +56 -0
- data/lib/app/models/smtp_configuration.rb +148 -0
- data/lib/app/models/template.rb +21 -0
- data/lib/templates/email/notification_failure.liquid +10 -0
- data/lib/templates/email/notification_failure.subject.liquid +1 -0
- data/lib/templates/slack/error_message.liquid +1 -0
- data/lib/web47core.rb +10 -2
- data/test/factories/account_factories.rb +9 -0
- data/test/factories/notification_factories.rb +14 -0
- data/test/models/app47_logger_test.rb +88 -0
- data/test/models/concerns/{formable_test.rb → standard_model_test.rb} +24 -5
- data/test/models/email_notification_test.rb +297 -0
- data/test/models/notification_test.rb +127 -0
- data/test/models/slack_notification_test.rb +50 -0
- data/test/notification_test_helper.rb +146 -0
- data/test/rails_setup.rb +4 -0
- data/test/test_helper.rb +10 -4
- data/test/test_models_helper.rb +14 -0
- data/web47core.gemspec +5 -2
- metadata +87 -14
- data/lib/app/models/concerns/auto_clear_cache.rb +0 -34
- data/lib/app/models/concerns/formable.rb +0 -111
- data/test/models/concerns/auto_clear_cache_test.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 623ae80309063bdc6c27dee1668a86ae4473da7db27a6ffedb9bd75df3b83d40
|
4
|
+
data.tar.gz: e39e28438fb5247ddb2cc65c9dd3b5c8edb8a98d9079921b3dc07d511b587ecb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db0cd4d93d34398cf6e3a4739016db9fd63337e048917403ea9ec624ee5f516ecdb8a9ac278925f8f329dde34c3a42af16b856530ae976c5cc9534eca0999143
|
7
|
+
data.tar.gz: b5304422a552e6ec81a9e188000533a8a4652e66d3e6e8096b81abaf45d5e4646cc5ed5b7591265c5639f56225e977ba26cb68351eda9e1c20743d70b81b3580
|
data/Gemfile
CHANGED
@@ -1,19 +1,5 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
ruby '2.4.1'
|
3
3
|
|
4
|
-
git_source(:github) do |repo_name|
|
5
|
-
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
|
6
|
-
"https://github.com/#{repo_name}.git"
|
7
|
-
end
|
8
|
-
|
9
4
|
# Specify your gem's dependencies
|
10
5
|
gemspec
|
11
|
-
|
12
|
-
gem 'aws-sdk-ec2'
|
13
|
-
gem 'jwt'
|
14
|
-
gem 'mongoid', '~> 6.4'
|
15
|
-
|
16
|
-
group :test do
|
17
|
-
gem 'simplecov'
|
18
|
-
gem 'simplecov-lcov'
|
19
|
-
end
|
data/Gemfile.lock
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
web47core (0.0.
|
4
|
+
web47core (0.0.9)
|
5
5
|
activesupport (~> 5.0)
|
6
|
-
aws-sdk-ec2 (
|
6
|
+
aws-sdk-ec2 (> 1.140, <= 1.160)
|
7
7
|
delayed_job_mongoid (~> 2.3)
|
8
|
+
haml
|
8
9
|
jwt
|
10
|
+
liquid
|
9
11
|
mongoid (> 6, < 7)
|
10
12
|
rails (>= 4.2, < 5.3)
|
11
13
|
redis (~> 4.1)
|
12
14
|
redis-rails (> 5, < 6)
|
15
|
+
rest-client (>= 0, <= 2.1.0)
|
13
16
|
|
14
17
|
GEM
|
15
18
|
remote: https://rubygems.org/
|
@@ -60,7 +63,7 @@ GEM
|
|
60
63
|
ansi (1.5.0)
|
61
64
|
arel (9.0.0)
|
62
65
|
aws-eventstream (1.0.3)
|
63
|
-
aws-partitions (1.
|
66
|
+
aws-partitions (1.288.0)
|
64
67
|
aws-sdk-core (3.92.0)
|
65
68
|
aws-eventstream (~> 1.0, >= 1.0.2)
|
66
69
|
aws-partitions (~> 1, >= 1.239.0)
|
@@ -94,6 +97,8 @@ GEM
|
|
94
97
|
mongoid (>= 3.0, < 8)
|
95
98
|
mongoid-compatibility (>= 0.4.0)
|
96
99
|
docile (1.3.2)
|
100
|
+
domain_name (0.5.20190701)
|
101
|
+
unf (>= 0.0.5, < 1.0.0)
|
97
102
|
erubi (1.9.0)
|
98
103
|
factory_bot (5.1.1)
|
99
104
|
activesupport (>= 4.2.0)
|
@@ -103,12 +108,19 @@ GEM
|
|
103
108
|
ffi (1.12.2)
|
104
109
|
globalid (0.4.2)
|
105
110
|
activesupport (>= 4.2.0)
|
111
|
+
haml (5.1.2)
|
112
|
+
temple (>= 0.8.0)
|
113
|
+
tilt
|
106
114
|
hashdiff (1.0.1)
|
115
|
+
http-accept (1.7.0)
|
116
|
+
http-cookie (1.0.3)
|
117
|
+
domain_name (~> 0.5)
|
107
118
|
i18n (1.8.2)
|
108
119
|
concurrent-ruby (~> 1.0)
|
109
120
|
jmespath (1.4.0)
|
110
121
|
json (2.3.0)
|
111
122
|
jwt (2.2.1)
|
123
|
+
liquid (4.0.3)
|
112
124
|
listen (3.2.1)
|
113
125
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
114
126
|
rb-inotify (~> 0.9, >= 0.9.10)
|
@@ -120,6 +132,9 @@ GEM
|
|
120
132
|
marcel (0.3.3)
|
121
133
|
mimemagic (~> 0.3.2)
|
122
134
|
method_source (1.0.0)
|
135
|
+
mime-types (3.3.1)
|
136
|
+
mime-types-data (~> 3.2015)
|
137
|
+
mime-types-data (3.2019.1009)
|
123
138
|
mimemagic (0.3.4)
|
124
139
|
mini_mime (1.0.2)
|
125
140
|
mini_portile2 (2.4.0)
|
@@ -152,6 +167,7 @@ GEM
|
|
152
167
|
mongoid-compatibility (0.5.1)
|
153
168
|
activesupport
|
154
169
|
mongoid (>= 2.0)
|
170
|
+
netrc (0.11.0)
|
155
171
|
nio4r (2.5.2)
|
156
172
|
nokogiri (1.10.9)
|
157
173
|
mini_portile2 (~> 2.4.0)
|
@@ -205,6 +221,11 @@ GEM
|
|
205
221
|
redis-store (>= 1.2, < 2)
|
206
222
|
redis-store (1.8.2)
|
207
223
|
redis (>= 4, < 5)
|
224
|
+
rest-client (2.1.0)
|
225
|
+
http-accept (>= 1.7.0, < 2.0)
|
226
|
+
http-cookie (>= 1.0.2, < 2.0)
|
227
|
+
mime-types (>= 1.16, < 4.0)
|
228
|
+
netrc (~> 0.8)
|
208
229
|
ruby-progressbar (1.10.1)
|
209
230
|
safe_yaml (1.0.5)
|
210
231
|
shoulda (3.6.0)
|
@@ -218,7 +239,6 @@ GEM
|
|
218
239
|
json (>= 1.8, < 3)
|
219
240
|
simplecov-html (~> 0.10.0)
|
220
241
|
simplecov-html (0.10.2)
|
221
|
-
simplecov-lcov (0.8.0)
|
222
242
|
sprockets (3.7.2)
|
223
243
|
concurrent-ruby (~> 1.0)
|
224
244
|
rack (> 1, < 3)
|
@@ -226,12 +246,17 @@ GEM
|
|
226
246
|
actionpack (>= 4.0)
|
227
247
|
activesupport (>= 4.0)
|
228
248
|
sprockets (>= 3.0.0)
|
249
|
+
temple (0.8.2)
|
229
250
|
test-unit (3.3.5)
|
230
251
|
power_assert
|
231
252
|
thor (1.0.1)
|
232
253
|
thread_safe (0.3.6)
|
254
|
+
tilt (2.0.10)
|
233
255
|
tzinfo (1.2.6)
|
234
256
|
thread_safe (~> 0.1)
|
257
|
+
unf (0.1.4)
|
258
|
+
unf_ext
|
259
|
+
unf_ext (0.0.7.6)
|
235
260
|
vcr (5.1.0)
|
236
261
|
webmock (3.8.3)
|
237
262
|
addressable (>= 2.3.6)
|
@@ -247,24 +272,20 @@ PLATFORMS
|
|
247
272
|
ruby
|
248
273
|
|
249
274
|
DEPENDENCIES
|
250
|
-
aws-sdk-ec2
|
251
275
|
bundler
|
252
276
|
codacy-coverage (~> 2.1.0)
|
253
277
|
database_cleaner
|
254
278
|
factory_bot
|
255
279
|
factory_bot_rails
|
256
|
-
jwt
|
257
280
|
listen
|
258
281
|
minitest (= 5.10.3)
|
259
282
|
minitest-rails (= 3.0.0)
|
260
283
|
minitest-rails-capybara (= 3.0.1)
|
261
284
|
minitest-reporters
|
262
285
|
mocha
|
263
|
-
mongoid (~> 6.4)
|
264
286
|
shoulda (= 3.6.0)
|
265
287
|
shoulda-matchers (= 3.1.2)
|
266
|
-
simplecov
|
267
|
-
simplecov-lcov
|
288
|
+
simplecov (= 0.16.1)
|
268
289
|
test-unit
|
269
290
|
vcr
|
270
291
|
web47core!
|
data/README.md
CHANGED
@@ -61,13 +61,24 @@ gem 'web47core', git: 'git@github.com:App47/web47core.git', branch: :develop
|
|
61
61
|
|
62
62
|
_Please do not ship to production code using the git repo, as the production servers will not have keys to pull from the web47core repo_
|
63
63
|
|
64
|
-
##
|
65
|
-
|
66
|
-
### Models
|
67
|
-
#### Concerns
|
64
|
+
## Remove the following files
|
68
65
|
1. `StandardModel` - Includes the common set of includes, Mongoid, Auditable, AutoClearCache, etc.
|
69
66
|
1. `CdnUrl` - Provide CDN URLs of your classes URLs when cdn_url is configured in system configuration
|
70
67
|
1. `AutoClearCache` - Clears your objects cache out of Rails.cache using the object's id
|
68
|
+
1. `Formable` - Consolidated into StandardModel, was used to provide common form operations for mongoid documents
|
69
|
+
1. `EmailNotification`
|
70
|
+
1. `EmailTemplate`
|
71
|
+
1. `Notification`
|
72
|
+
1. `NotificationTemplate`
|
73
|
+
1. `SlackNotification`
|
74
|
+
1. `SmsNotification`
|
75
|
+
1. `Template`
|
76
|
+
|
77
|
+
### Models
|
78
|
+
#### Concerns
|
79
|
+
1. `StandardModel` - Includes the common set of includes, Mongoid, etc.
|
80
|
+
1. `CoreSystemConfiguration` - Base system configuration to be included in the app's SystemConfiguration Object
|
81
|
+
1. `CoreAccount` - Base account object that is related to notifications and the ilk.
|
71
82
|
#### System Configuration
|
72
83
|
Define a `SystemConfiguration` class in your project and import the core concern.
|
73
84
|
|
@@ -80,4 +91,16 @@ class SystemConfiguration
|
|
80
91
|
field :google_sso_client_id, type: String
|
81
92
|
end
|
82
93
|
```
|
94
|
+
#### Account
|
95
|
+
Define a `Account` class in your project and import the core concern.
|
96
|
+
|
97
|
+
```
|
98
|
+
class Account
|
99
|
+
include StandardModel
|
100
|
+
include CoreAccount
|
101
|
+
|
102
|
+
# Include your additional system configuration fields and methods
|
103
|
+
has_many :users
|
104
|
+
end
|
105
|
+
```
|
83
106
|
|
@@ -0,0 +1,175 @@
|
|
1
|
+
#
|
2
|
+
# Mixin for App47 objects to handle logging in both the rails environment as well
|
3
|
+
# as the delayed jobs environment that doesn't know about Rails.logger
|
4
|
+
#
|
5
|
+
# Provides ways to log at the class level as well as instance level.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# Usage:
|
9
|
+
# App47Logger.log_debug('message')
|
10
|
+
#
|
11
|
+
# or
|
12
|
+
#
|
13
|
+
# class ClassName
|
14
|
+
# include App47Logger
|
15
|
+
#
|
16
|
+
# def method_name
|
17
|
+
# log_debug('message')
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
module App47Logger
|
21
|
+
#
|
22
|
+
# Log a debug messages
|
23
|
+
#
|
24
|
+
def self.log_debug(message)
|
25
|
+
log_message :debug, message
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Log a warning messages
|
30
|
+
#
|
31
|
+
# 1. Prints the messages
|
32
|
+
# 2. If an exception is passed n
|
33
|
+
# 2a prints the exception message
|
34
|
+
# 2b prints the stack trace
|
35
|
+
#
|
36
|
+
def self.log_warn(message, exception = nil)
|
37
|
+
log_message :warn, message
|
38
|
+
log_exception :warn, exception
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# Log an error messages
|
43
|
+
#
|
44
|
+
# 1. Prints the messages
|
45
|
+
# 2. If an exception is passed n
|
46
|
+
# 2a prints the exception message
|
47
|
+
# 2b prints the stack trace
|
48
|
+
#
|
49
|
+
def self.log_error(message, exception = nil)
|
50
|
+
log_message :error, message
|
51
|
+
log_exception(:error, exception)
|
52
|
+
message = { message: message, exception: exception&.message }
|
53
|
+
SlackNotification.say message, template: :error_message
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Log a given exception, but only the first 10 lines in anything but test.
|
58
|
+
#
|
59
|
+
# In testing, we want the full stack to know the test case that failed.
|
60
|
+
#
|
61
|
+
def self.log_exception(level, exception = nil, max_frame = 9)
|
62
|
+
return if exception.blank?
|
63
|
+
|
64
|
+
max_frame = -1 if ENV['RACK_ENV'].eql?('test')
|
65
|
+
log_message(level, exception.message)
|
66
|
+
exception.backtrace[0..max_frame].each { |frame| log_message(level, frame) } unless exception.backtrace.blank?
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# Log a given message at the given level
|
71
|
+
#
|
72
|
+
def self.log_message(level, message)
|
73
|
+
if Rails.env.test?
|
74
|
+
puts "#{level}: #{message}"
|
75
|
+
elsif Delayed::Worker.logger.nil?
|
76
|
+
Rails.logger.send level, message
|
77
|
+
else
|
78
|
+
Delayed::Worker.logger.send level, message
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Log a debug message as part of the mixin
|
84
|
+
#
|
85
|
+
def log_message(level, message)
|
86
|
+
App47Logger.log_message level, message
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Log a debug message as part of the mixin
|
91
|
+
#
|
92
|
+
def log_debug(message)
|
93
|
+
App47Logger.log_debug message
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# Log a warning message as part of the mixin
|
98
|
+
#
|
99
|
+
def log_warn(message, exception = nil)
|
100
|
+
App47Logger.log_warn message, exception
|
101
|
+
end
|
102
|
+
|
103
|
+
#
|
104
|
+
# Log an error message as part of the mixin
|
105
|
+
#
|
106
|
+
def log_error(message, exception = nil)
|
107
|
+
App47Logger.log_error message, exception
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Log a controller error message
|
112
|
+
#
|
113
|
+
def log_controller_error(exception, redirecting = false)
|
114
|
+
if exception.is_a? ActionController::RoutingError
|
115
|
+
App47Logger.log_warn "#{controller_name}##{action_name} #{clean_params(params)}", exception
|
116
|
+
else
|
117
|
+
App47Logger.log_error "#{controller_name}##{action_name} #{clean_params(params)}", exception
|
118
|
+
end
|
119
|
+
update_flash_messages(exception, redirecting) if defined?(request) && request.present?
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Update the flash message based on the type of exception we get
|
124
|
+
# Currently we only handle mongoid errors, but there may be other
|
125
|
+
# common errors we can handle formatting for...
|
126
|
+
#
|
127
|
+
def update_flash_messages(exception, redirecting = false)
|
128
|
+
case exception
|
129
|
+
when Mongoid::Errors::Validations
|
130
|
+
if redirecting
|
131
|
+
flash[:error] = exception.problem
|
132
|
+
flash[:warning] = exception.summary
|
133
|
+
else
|
134
|
+
flash.now[:error] = exception.problem
|
135
|
+
flash.now[:warning] = exception.summary
|
136
|
+
end
|
137
|
+
else
|
138
|
+
if redirecting
|
139
|
+
flash[:error] = exception.message
|
140
|
+
else
|
141
|
+
flash.now[:error] = exception.message
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
#
|
147
|
+
# Recursively hide any fields in the rails config filter_parameters
|
148
|
+
#
|
149
|
+
def clean_params(pars)
|
150
|
+
pars.each do |key, value|
|
151
|
+
if mask_parameter_keys.include?(key)
|
152
|
+
pars[key] = '[FILTERED]'
|
153
|
+
elsif delete_parameter_keys.include?(key)
|
154
|
+
pars.delete(key)
|
155
|
+
elsif value.is_a?(Hash) || value.is_a?(ActionController::Parameters)
|
156
|
+
pars[key] = clean_params(value)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
pars
|
160
|
+
end
|
161
|
+
|
162
|
+
#
|
163
|
+
# which parameters to filter out
|
164
|
+
#
|
165
|
+
def mask_parameter_keys
|
166
|
+
@mask_parameter_keys ||= Rails.application.config.filter_parameters
|
167
|
+
end
|
168
|
+
|
169
|
+
#
|
170
|
+
# which parameters to filter out
|
171
|
+
#
|
172
|
+
def delete_parameter_keys
|
173
|
+
@delete_parameter_keys ||= %w[file authenticity_token commit upload]
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# The System configuration. Various configuration items that can be updated/defined at run time
|
5
|
+
#
|
6
|
+
# Use of this class allows you to simply ask for the configuration parameter directly without
|
7
|
+
# first having to get an instance of it.
|
8
|
+
#
|
9
|
+
# SystemConfiguration.queue_impl #=> 'RedisQueue'
|
10
|
+
#
|
11
|
+
# This method only is allowed for accessors, you should NEVER set values on the SystemConfiguration
|
12
|
+
# unless you are updating via the Admin or Stack UI, or during testing to setup a specific configuration
|
13
|
+
# for that.
|
14
|
+
#
|
15
|
+
module CoreAccount
|
16
|
+
extend ActiveSupport::Concern
|
17
|
+
|
18
|
+
def self.included(base)
|
19
|
+
base.class_eval do
|
20
|
+
#
|
21
|
+
# Fields
|
22
|
+
#
|
23
|
+
field :name, type: String
|
24
|
+
#
|
25
|
+
# Relationships
|
26
|
+
#
|
27
|
+
has_many :notifications, dependent: :delete do
|
28
|
+
def emails
|
29
|
+
where(_type: 'EmailNotification')
|
30
|
+
end
|
31
|
+
|
32
|
+
def slacks
|
33
|
+
where(_type: 'SlackNotification')
|
34
|
+
end
|
35
|
+
|
36
|
+
def sms
|
37
|
+
where(_type: 'SmsNotification')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
has_many :templates, dependent: :delete
|
41
|
+
embeds_one :smtp_configuration
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Return or build the smtp configuration for the account
|
47
|
+
#
|
48
|
+
def fetch_smtp_configuration
|
49
|
+
smtp_configuration || build_smtp_configuration
|
50
|
+
end
|
51
|
+
end
|
@@ -6,15 +6,18 @@
|
|
6
6
|
#
|
7
7
|
module StandardModel
|
8
8
|
extend ActiveSupport::Concern
|
9
|
+
include Mongoid::Document
|
10
|
+
include Mongoid::Timestamps
|
11
|
+
include App47Logger
|
12
|
+
# include Auditable
|
9
13
|
|
10
14
|
def self.included(base)
|
11
15
|
base.class_eval do
|
12
|
-
|
13
|
-
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
include AutoClearCache
|
16
|
+
#
|
17
|
+
# Callbacks
|
18
|
+
#
|
19
|
+
after_save :clear_cache
|
20
|
+
before_destroy :clear_cache
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
@@ -37,5 +40,100 @@ module StandardModel
|
|
37
40
|
def make_options(options)
|
38
41
|
options.collect { |t| [t, t.humanize] }
|
39
42
|
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Return the complete list of key names that would appear in the form.
|
46
|
+
#
|
47
|
+
def allowed_param_names(filter_names = [])
|
48
|
+
# Always filter out the mongoid reserved items
|
49
|
+
filter_names += %w[created_at updated_at _type _id]
|
50
|
+
associations = all_associations
|
51
|
+
# filter out the relationship names so we don't have dups
|
52
|
+
associations.each { |association| filter_names << association.keys.first }
|
53
|
+
(field_names + associations).delete_if { |name| filter_names.include?(name) }
|
54
|
+
rescue StandardError
|
55
|
+
attribute_names.delete_if { |name| filter_names.include?(name) }
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# allow the model to filter out a name if they want to, meaning the model
|
60
|
+
# can return a subset of attribute names
|
61
|
+
#
|
62
|
+
def field_names
|
63
|
+
attribute_names
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# gather up the collections we care about and return them. For now, the
|
68
|
+
# many to many associations are the ones that need some extra help.
|
69
|
+
#
|
70
|
+
def all_associations
|
71
|
+
many_to_many_associations
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Return a collection of many to many assocations. We basically
|
76
|
+
# need to turn the current value returned by attribute names
|
77
|
+
#
|
78
|
+
# relationship_ids
|
79
|
+
#
|
80
|
+
# to
|
81
|
+
#
|
82
|
+
# { relationship_ids => [] }
|
83
|
+
#
|
84
|
+
# Telling the permit command to accept the value as an array of items.
|
85
|
+
#
|
86
|
+
def many_to_many_associations
|
87
|
+
associations = []
|
88
|
+
reflect_on_all_associations.each do |association|
|
89
|
+
next unless association.macro == :has_and_belongs_to_many
|
90
|
+
|
91
|
+
associations << { association.key => [] }
|
92
|
+
end
|
93
|
+
associations
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# Remove updates for secure fields that come across as blank to start with and get removed on update
|
99
|
+
#
|
100
|
+
def update(params)
|
101
|
+
super(remove_blank_secure_fields(params))
|
102
|
+
end
|
103
|
+
|
104
|
+
alias :update_attributes :update
|
105
|
+
|
106
|
+
#
|
107
|
+
# Remove updates for secure fields that come across as blank to start with and get removed on update
|
108
|
+
#
|
109
|
+
def update!(params)
|
110
|
+
super(remove_blank_secure_fields(params))
|
111
|
+
end
|
112
|
+
|
113
|
+
alias :update_attributes! :update!
|
114
|
+
|
115
|
+
#
|
116
|
+
# List of secure fields, to add fields in concrete class, simply override this method
|
117
|
+
#
|
118
|
+
def secure_fields
|
119
|
+
[]
|
120
|
+
end
|
121
|
+
|
122
|
+
def remove_blank_secure_fields(params)
|
123
|
+
secure_fields.each { |field| params.delete(field) if params[field].blank? }
|
124
|
+
params
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# Clear the cache
|
129
|
+
#
|
130
|
+
def clear_cache
|
131
|
+
Rails.cache.delete_matched "*#{id}*"
|
132
|
+
return unless respond_to?(:account) && account.present? && account.is_a?(Account)
|
133
|
+
|
134
|
+
Rails.cache.delete_matched "*#{account.id}*"
|
135
|
+
true # Force a return of true so that we don't break the callback chain.
|
136
|
+
rescue StandardError
|
137
|
+
false
|
40
138
|
end
|
41
139
|
end
|