unotifier 0.2.10 → 0.3.0
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/.rubocop.yml +151 -0
- data/Gemfile.lock +2 -2
- data/lib/configuration.rb +2 -0
- data/lib/exceptions.rb +21 -10
- data/lib/hash.rb +15 -2
- data/lib/provider/provider_base.rb +3 -2
- data/lib/provider/system/action_cable.rb +22 -0
- data/lib/provider/user/action_cable.rb +35 -0
- data/lib/provider/user/action_mailer.rb +26 -0
- data/lib/provider.rb +3 -2
- data/lib/settings.rb +21 -15
- data/lib/unotifier/system_notifier.rb +28 -0
- data/lib/unotifier/user_notifier.rb +59 -0
- data/lib/unotifier/version.rb +1 -1
- data/lib/unotifier.rb +38 -49
- metadata +9 -5
- data/lib/provider/action_cable.rb +0 -36
- data/lib/provider/action_mailer.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaa686f0cd41483a94d0746b9538177adae345674774b7e7798cb507c9c2b61c
|
4
|
+
data.tar.gz: 5e61daf30bfe7dbbdd62a0edb5f2cad5c2383e5ad3dc83482ad1cec0b61781c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21fc2a10954d1a2c5e0fa1d6ae7eafc9ad199d02ec634b850c90393604669b5ee63e0d617985859507ed1eaf8787cbc1db227b7791e698308d8142d7b02d476a
|
7
|
+
data.tar.gz: e96f359477dde1299d359a646b0efda3c40fba6a42c546e4dc1758e7df8bd39f663b4a89f5b61778678130ba9ba0d349ea1ccd430de22fceda4f317729b6a167
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
require: rubocop-rails
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
Exclude:
|
5
|
+
- "bin/**/*"
|
6
|
+
- "spec/**/*"
|
7
|
+
- "*.gemspec"
|
8
|
+
- "Gemfile"
|
9
|
+
- "Rakefile"
|
10
|
+
|
11
|
+
Rails:
|
12
|
+
Enabled: true
|
13
|
+
|
14
|
+
Layout/BlockAlignment:
|
15
|
+
EnforcedStyleAlignWith: start_of_block
|
16
|
+
|
17
|
+
Layout/FirstArrayElementIndentation:
|
18
|
+
EnforcedStyle: consistent
|
19
|
+
|
20
|
+
Layout/FirstHashElementIndentation:
|
21
|
+
EnforcedStyle: consistent
|
22
|
+
|
23
|
+
Layout/LineLength:
|
24
|
+
AutoCorrect: false
|
25
|
+
Max: 110
|
26
|
+
|
27
|
+
Layout/MultilineOperationIndentation:
|
28
|
+
EnforcedStyle: aligned
|
29
|
+
|
30
|
+
Layout/SpaceInLambdaLiteral:
|
31
|
+
EnforcedStyle: require_space
|
32
|
+
|
33
|
+
Lint/InheritException:
|
34
|
+
EnforcedStyle: standard_error
|
35
|
+
|
36
|
+
Lint/SuppressedException:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Metrics/AbcSize:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Metrics/BlockLength:
|
43
|
+
Enabled: false
|
44
|
+
|
45
|
+
Metrics/BlockNesting:
|
46
|
+
Max: 6
|
47
|
+
|
48
|
+
Metrics/ClassLength:
|
49
|
+
Enabled: false
|
50
|
+
|
51
|
+
Metrics/CyclomaticComplexity:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Metrics/MethodLength:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Naming/MethodParameterName:
|
58
|
+
AllowedNames: ["by", "e", "id", "to", "tx", "fn", "tz"]
|
59
|
+
|
60
|
+
Metrics/ModuleLength:
|
61
|
+
Enabled: false
|
62
|
+
|
63
|
+
Metrics/PerceivedComplexity:
|
64
|
+
Enabled: false
|
65
|
+
|
66
|
+
Naming/PredicateName:
|
67
|
+
Enabled: false
|
68
|
+
|
69
|
+
Rails/DynamicFindBy:
|
70
|
+
Enabled: false
|
71
|
+
|
72
|
+
Rails/EnumHash:
|
73
|
+
Enabled: false
|
74
|
+
|
75
|
+
Rails/HttpStatus:
|
76
|
+
EnforcedStyle: numeric
|
77
|
+
|
78
|
+
Rails/LexicallyScopedActionFilter:
|
79
|
+
Enabled: false
|
80
|
+
|
81
|
+
Rails/ReversibleMigration:
|
82
|
+
Enabled: false
|
83
|
+
|
84
|
+
Rails/SafeNavigation:
|
85
|
+
ConvertTry: true
|
86
|
+
|
87
|
+
Rails/SkipsModelValidations:
|
88
|
+
Enabled: false
|
89
|
+
|
90
|
+
Rails/TimeZone:
|
91
|
+
Enabled: false
|
92
|
+
|
93
|
+
Rails/UnknownEnv:
|
94
|
+
Environments: ["development", "test", "staging", "staging_unmerged", "testnet", "production"]
|
95
|
+
|
96
|
+
Security/YAMLLoad:
|
97
|
+
Enabled: false
|
98
|
+
|
99
|
+
Style/CollectionMethods:
|
100
|
+
Enabled: true
|
101
|
+
|
102
|
+
Style/Documentation:
|
103
|
+
Enabled: false
|
104
|
+
|
105
|
+
Style/DoubleNegation:
|
106
|
+
Enabled: false
|
107
|
+
|
108
|
+
Style/FormatStringToken:
|
109
|
+
Enabled: false
|
110
|
+
|
111
|
+
Style/FrozenStringLiteralComment:
|
112
|
+
Enabled: false
|
113
|
+
|
114
|
+
Style/GlobalVars:
|
115
|
+
Enabled: false
|
116
|
+
|
117
|
+
Style/MultilineIfModifier:
|
118
|
+
Enabled: false
|
119
|
+
|
120
|
+
Style/NumericPredicate:
|
121
|
+
EnforcedStyle: comparison
|
122
|
+
|
123
|
+
Style/PercentLiteralDelimiters:
|
124
|
+
PreferredDelimiters:
|
125
|
+
default: "()"
|
126
|
+
"%i": "()"
|
127
|
+
"%I": "()"
|
128
|
+
"%r": "{}"
|
129
|
+
"%w": "()"
|
130
|
+
"%W": "()"
|
131
|
+
|
132
|
+
Style/PreferredHashMethods:
|
133
|
+
Enabled: false
|
134
|
+
|
135
|
+
Style/RedundantSelf:
|
136
|
+
Enabled: false
|
137
|
+
|
138
|
+
Style/RegexpLiteral:
|
139
|
+
EnforcedStyle: slashes
|
140
|
+
|
141
|
+
Style/StringLiterals:
|
142
|
+
EnforcedStyle: double_quotes
|
143
|
+
|
144
|
+
Style/StringLiteralsInInterpolation:
|
145
|
+
EnforcedStyle: double_quotes
|
146
|
+
|
147
|
+
Style/TrailingCommaInArrayLiteral:
|
148
|
+
EnforcedStyleForMultiline: comma
|
149
|
+
|
150
|
+
Style/TrailingCommaInHashLiteral:
|
151
|
+
EnforcedStyleForMultiline: comma
|
data/Gemfile.lock
CHANGED
data/lib/configuration.rb
CHANGED
@@ -2,6 +2,7 @@ module UNotifier
|
|
2
2
|
class Configuration
|
3
3
|
attr_accessor :site_providers
|
4
4
|
attr_accessor :external_providers
|
5
|
+
attr_accessor :system_providers
|
5
6
|
attr_accessor :resource_class
|
6
7
|
attr_accessor :notifications_path
|
7
8
|
attr_accessor :localization_provider
|
@@ -9,6 +10,7 @@ module UNotifier
|
|
9
10
|
def initialize
|
10
11
|
@site_providers = []
|
11
12
|
@external_providers = []
|
13
|
+
@system_providers = []
|
12
14
|
@resource_class = nil
|
13
15
|
@notifications_path = nil
|
14
16
|
@localization_provider = nil
|
data/lib/exceptions.rb
CHANGED
@@ -1,6 +1,27 @@
|
|
1
1
|
module UNotifier
|
2
2
|
class UNotifierError < StandardError; end
|
3
3
|
|
4
|
+
class EmptyLocaleKeyError < UNotifierError
|
5
|
+
attr_reader :key
|
6
|
+
|
7
|
+
def initialize(key)
|
8
|
+
@key = key
|
9
|
+
message = ":locale_key parameter is required for fetching '#{key}' locale"
|
10
|
+
super(message)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class AttributeMissingError < UNotifierError
|
15
|
+
attr_reader :key, :attribute
|
16
|
+
|
17
|
+
def initialize(key, attribute)
|
18
|
+
@key = key
|
19
|
+
@attribute = attribute
|
20
|
+
message = "Missing '#{attribute}' attribute for notification '#{key}'"
|
21
|
+
super(message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
4
25
|
class NotificationsConfigNotFoundError < UNotifierError
|
5
26
|
attr_reader :path, :absolute_path
|
6
27
|
|
@@ -33,16 +54,6 @@ module UNotifier
|
|
33
54
|
end
|
34
55
|
end
|
35
56
|
|
36
|
-
class EmptyLocaleKeyError < UNotifierError
|
37
|
-
attr_reader :key
|
38
|
-
|
39
|
-
def initialize(key)
|
40
|
-
@key = key
|
41
|
-
message = ":locale_key parameter is required for fetching '#{key}' locale"
|
42
|
-
super(message)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
57
|
class UnknownLocaleKeyError < UNotifierError
|
47
58
|
attr_reader :key, :locale_key, :options
|
48
59
|
|
data/lib/hash.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
1
2
|
class ::Hash
|
2
3
|
def deep_merge!(second)
|
3
|
-
|
4
|
-
|
4
|
+
merger = proc do |_, v1, v2|
|
5
|
+
if v1.is_a?(Hash) && v2.is_a?(Hash)
|
6
|
+
v1.merge(v2, &merger)
|
7
|
+
elsif v1.is_a?(Array) && v2.is_a?(Array)
|
8
|
+
v1 | v2
|
9
|
+
elsif [:undefined, nil, :nil].include?(v2)
|
10
|
+
v1
|
11
|
+
else
|
12
|
+
v2
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
self.merge!(second.to_h, &merger)
|
5
17
|
end
|
6
18
|
end
|
19
|
+
# rubocop:enable Style/ClassAndModuleChildren
|
@@ -5,9 +5,10 @@ module UNotifier
|
|
5
5
|
@notification_conditions = notification_conditions
|
6
6
|
end
|
7
7
|
|
8
|
-
def can_notify?(
|
8
|
+
def can_notify?(notification)
|
9
9
|
return true if @notification_conditions.empty?
|
10
|
-
|
10
|
+
|
11
|
+
@notification_conditions.all? { |c| c.call(notification) }
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module UNotifier
|
2
|
+
module Provider
|
3
|
+
module System
|
4
|
+
class ActionCable < ProviderBase
|
5
|
+
attr_reader :server
|
6
|
+
attr_accessor :channel_name
|
7
|
+
|
8
|
+
def initialize(server, channel_name: nil, notification_conditions: [])
|
9
|
+
super(notification_conditions: notification_conditions)
|
10
|
+
@server = server
|
11
|
+
@channel_name = channel_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def notify(notification, data)
|
15
|
+
return unless can_notify?(notification)
|
16
|
+
|
17
|
+
server.broadcast channel_name.call(notification), data
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module UNotifier
|
2
|
+
module Provider
|
3
|
+
module User
|
4
|
+
class ActionCable < ProviderBase
|
5
|
+
attr_reader :server
|
6
|
+
attr_accessor :autohide_delay, :channel_name
|
7
|
+
|
8
|
+
def initialize(server, channel_name: nil, autohide_delay: 30, notification_conditions: [])
|
9
|
+
super(notification_conditions: notification_conditions)
|
10
|
+
@server = server
|
11
|
+
@channel_name = channel_name
|
12
|
+
@autohide_delay = autohide_delay
|
13
|
+
end
|
14
|
+
|
15
|
+
def notify(notification)
|
16
|
+
return unless can_notify?(notification)
|
17
|
+
|
18
|
+
server.broadcast channel_name.call(notification), serialize_notification(notification)
|
19
|
+
end
|
20
|
+
|
21
|
+
def serialize_notification(notification)
|
22
|
+
{
|
23
|
+
id: notification.id,
|
24
|
+
title: notification.title,
|
25
|
+
body: notification.body,
|
26
|
+
autohide_delay: notification.autohide_delay || @autohide_delay,
|
27
|
+
user_login: notification.target.login,
|
28
|
+
link: notification.link,
|
29
|
+
urgency: notification.urgency,
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module UNotifier
|
2
|
+
module Provider
|
3
|
+
module User
|
4
|
+
class ActionMailer < ProviderBase
|
5
|
+
def initialize(mailer, sending_method: :new_notification, notification_conditions: [])
|
6
|
+
super(notification_conditions: notification_conditions)
|
7
|
+
@mailer = mailer
|
8
|
+
@sending_method = sending_method
|
9
|
+
end
|
10
|
+
|
11
|
+
def notify(notification)
|
12
|
+
return unless can_notify?(notification)
|
13
|
+
|
14
|
+
sending_method =
|
15
|
+
if @sending_method.is_a?(Array)
|
16
|
+
@sending_method.map { |m| m.call(notification) }&.first
|
17
|
+
else
|
18
|
+
@sending_method
|
19
|
+
end
|
20
|
+
|
21
|
+
@mailer.public_send(sending_method, notification).deliver
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/provider.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative "provider/provider_base"
|
2
|
-
require_relative "provider/action_cable"
|
3
|
-
require_relative "provider/
|
2
|
+
require_relative "provider/system/action_cable"
|
3
|
+
require_relative "provider/user/action_cable"
|
4
|
+
require_relative "provider/user/action_mailer"
|
4
5
|
|
5
6
|
module UNotifier
|
6
7
|
module Provider
|
data/lib/settings.rb
CHANGED
@@ -1,28 +1,36 @@
|
|
1
1
|
module UNotifier
|
2
2
|
class Settings
|
3
|
-
DEFAULT_URGENCY = "external"
|
3
|
+
DEFAULT_URGENCY = "external".freeze
|
4
4
|
|
5
5
|
def self.customizable?(config)
|
6
|
-
|
6
|
+
(
|
7
|
+
config.key?("urgency") &&
|
8
|
+
%w(regular optional).include?(config["urgency"])
|
9
|
+
) || (
|
10
|
+
config.key?("target") &&
|
11
|
+
config["target"].values.any? { |c| customizable?(c) }
|
12
|
+
)
|
7
13
|
end
|
8
14
|
|
9
15
|
def self.filter_customizable(config)
|
10
|
-
config.map do |key, subkeys|
|
11
|
-
filtered =
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
customizable = config.map do |key, subkeys|
|
17
|
+
filtered =
|
18
|
+
subkeys
|
19
|
+
.select { |_, value| value.key?("user") }
|
20
|
+
.map { |subkey, value| [subkey, value["user"]] }
|
21
|
+
.select { |_, value| customizable?(value) }
|
22
|
+
.each_with_object({}) do |(subkey, value), out|
|
23
|
+
out[subkey] = value["urgency"] ||
|
24
|
+
value["target"]
|
19
25
|
.select { |_, subvalue| customizable?(subvalue) }
|
20
26
|
.map { |_, subvalue| subvalue["urgency"] }
|
21
27
|
.first
|
22
|
-
|
28
|
+
end
|
23
29
|
|
24
30
|
[key, filtered]
|
25
|
-
end
|
31
|
+
end
|
32
|
+
|
33
|
+
customizable.to_h.reject { |_, subkeys| subkeys.empty? }
|
26
34
|
end
|
27
35
|
|
28
36
|
def self.keys_from(config)
|
@@ -36,8 +44,6 @@ module UNotifier
|
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|
39
|
-
private
|
40
|
-
|
41
47
|
def self.flatten_keys(keys)
|
42
48
|
keys.map do |key, subkeys|
|
43
49
|
subkeys.map do |subkey, urgency|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module UNotifier
|
2
|
+
module SystemNotifier
|
3
|
+
def self.notify_system(notification, params = {})
|
4
|
+
key = notification.key
|
5
|
+
config = UNotifier.load_notification!(key)
|
6
|
+
return if config["system"].nil?
|
7
|
+
|
8
|
+
# Raise only when we're sure that config has "system" block
|
9
|
+
raise AttributeMissingError.new(key, "system") unless params
|
10
|
+
|
11
|
+
data = config["system"]["keys"].each_with_object({}) do |(head, attributes), obj|
|
12
|
+
head = head.to_sym
|
13
|
+
attributes = attributes.map(&:to_sym)
|
14
|
+
raise AttributeMissingError.new(key, head) unless params.key?(head)
|
15
|
+
|
16
|
+
attributes.each { |a| raise AttributeMissingError.new(key, a) unless params[head].keys.include?(a) }
|
17
|
+
|
18
|
+
obj[head] = params[head].slice(*attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
data.merge!(key: notification.key)
|
22
|
+
|
23
|
+
UNotifier.configuration.system_providers.each do |provider|
|
24
|
+
provider.notify notification, data
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module UNotifier
|
2
|
+
module UserNotifier
|
3
|
+
def self.notify_user(notification, params = {})
|
4
|
+
locale_key = UNotifier.locale_key_for(notification.key, params)
|
5
|
+
user_settings = notification.target.notification_settings[notification.key]
|
6
|
+
user_settings ||= Settings::DEFAULT_URGENCY
|
7
|
+
|
8
|
+
notify_with = []
|
9
|
+
|
10
|
+
if !params[:external_only] && notify_onsite?(notification, user_settings)
|
11
|
+
notify_with += UNotifier.configuration.site_providers
|
12
|
+
end
|
13
|
+
|
14
|
+
if !params[:onsite_only] && notify_external?(notification, user_settings)
|
15
|
+
notify_with += UNotifier.configuration.external_providers
|
16
|
+
end
|
17
|
+
|
18
|
+
notify_with.each do |provider|
|
19
|
+
title_provider_key = "#{locale_key}.#{provider.class.to_s.split("::").last}.title"
|
20
|
+
body_provider_key = "#{locale_key}.#{provider.class.to_s.split("::").last}.body"
|
21
|
+
|
22
|
+
if UNotifier.configuration.localization_provider.exists?(title_provider_key)
|
23
|
+
notification.title =
|
24
|
+
UNotifier.configuration.localization_provider.t(
|
25
|
+
title_provider_key, params.merge(locale: notification.target.locale)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
if UNotifier.configuration.localization_provider.exists?(body_provider_key)
|
30
|
+
notification.body =
|
31
|
+
UNotifier.configuration.localization_provider.t(
|
32
|
+
body_provider_key, params.merge(locale: notification.target.locale, default: "")
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
provider.notify(notification)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.notify_onsite?(notification, user_settings)
|
41
|
+
return false if notification.urgency == "optional" && user_settings == "off"
|
42
|
+
|
43
|
+
notification.target.online?
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.notify_external?(notification, user_settings)
|
47
|
+
case notification.urgency
|
48
|
+
when "immediate"
|
49
|
+
true
|
50
|
+
when "regular", "optional"
|
51
|
+
user_settings == "external" && !notification.target.online?
|
52
|
+
when "onsite"
|
53
|
+
false
|
54
|
+
else
|
55
|
+
false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/unotifier/version.rb
CHANGED
data/lib/unotifier.rb
CHANGED
@@ -2,6 +2,8 @@ require "yaml"
|
|
2
2
|
|
3
3
|
require_relative "hash"
|
4
4
|
require_relative "unotifier/version"
|
5
|
+
require_relative "unotifier/system_notifier"
|
6
|
+
require_relative "unotifier/user_notifier"
|
5
7
|
require_relative "exceptions"
|
6
8
|
require_relative "provider"
|
7
9
|
require_relative "configuration"
|
@@ -21,7 +23,7 @@ module UNotifier
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def self.notifications_config
|
24
|
-
@notifications_config ||= if configuration.notifications_path.
|
26
|
+
@notifications_config ||= if configuration.notifications_path.is_a?(Array)
|
25
27
|
configuration.notifications_path.each_with_object({}) do |path, config|
|
26
28
|
config.deep_merge!(YAML.load_file(path))
|
27
29
|
end
|
@@ -29,7 +31,7 @@ module UNotifier
|
|
29
31
|
YAML.load_file(configuration.notifications_path)
|
30
32
|
end
|
31
33
|
rescue Errno::ENOENT
|
32
|
-
raise NotificationsConfigNotFoundError
|
34
|
+
raise NotificationsConfigNotFoundError, configuration.notifications_path
|
33
35
|
end
|
34
36
|
|
35
37
|
def self.reload!
|
@@ -38,68 +40,62 @@ module UNotifier
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def self.load_notification(key)
|
41
|
-
notifications_config.dig(*key.split(
|
43
|
+
notifications_config.dig(*key.split("."))
|
42
44
|
end
|
43
45
|
|
44
46
|
def self.load_notification!(key)
|
45
47
|
notification = load_notification(key)
|
46
|
-
raise NotificationNotFoundError
|
47
|
-
notification
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.urgency_for(key, params = {})
|
51
|
-
config = load_notification!(key)
|
48
|
+
raise NotificationNotFoundError, key unless notification
|
52
49
|
|
53
|
-
|
54
|
-
urgency = config.dig("target", params[:target], "urgency")
|
55
|
-
raise UnknownTargetError.new(key, params[:target]) unless urgency
|
56
|
-
urgency
|
57
|
-
else
|
58
|
-
config["urgency"]
|
59
|
-
end
|
50
|
+
notification
|
60
51
|
end
|
61
52
|
|
62
53
|
def self.locale_key_for(key, params = {})
|
63
|
-
config = load_notification!(key)
|
54
|
+
config = load_notification!(key)["user"]
|
55
|
+
|
56
|
+
if config["locale_options"].is_a?(Array)
|
57
|
+
raise EmptyLocaleKeyError, key unless params[:locale_key]
|
64
58
|
|
65
|
-
if config["locale_options"].kind_of?(Array)
|
66
|
-
raise EmptyLocaleKeyError.new(key) unless params[:locale_key]
|
67
59
|
raise UnknownLocaleKeyError.new(
|
68
60
|
key, params[:locale_key], config["locale_options"]
|
69
61
|
) unless config["locale_options"].include?(params[:locale_key])
|
62
|
+
|
70
63
|
"notifications.#{key}.#{params[:locale_key]}"
|
71
64
|
else
|
72
65
|
"notifications.#{key}"
|
73
66
|
end
|
74
67
|
end
|
75
68
|
|
76
|
-
def self.notify(key,
|
77
|
-
|
78
|
-
|
69
|
+
def self.notify(key, recepients, params = {})
|
70
|
+
targets = recepients.is_a?(Enumerable) ? recepients : [recepients]
|
71
|
+
|
72
|
+
targets.each do |target|
|
73
|
+
notify_target(key, target, params)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.notify_target(key, target, params = {})
|
79
78
|
locale_key = locale_key_for(key, params)
|
80
79
|
urgency = urgency_for(key, params)
|
81
80
|
|
82
81
|
notification = configuration.resource_class.new(
|
83
82
|
key: key,
|
84
83
|
target: target,
|
85
|
-
title: configuration.localization_provider.t("#{locale_key}.title", params.merge(locale: target.locale)),
|
86
|
-
body: configuration.localization_provider.t("#{locale_key}.body", params.merge(locale: target.locale, default: "")),
|
87
84
|
link: params[:link],
|
88
85
|
autohide_delay: params[:autohide_delay],
|
89
|
-
urgency: urgency
|
86
|
+
urgency: urgency,
|
87
|
+
title: configuration.localization_provider.t(
|
88
|
+
"#{locale_key}.title", params.merge(locale: target.locale)
|
89
|
+
),
|
90
|
+
body: configuration.localization_provider.t(
|
91
|
+
"#{locale_key}.body", params.merge(locale: target.locale, default: "")
|
92
|
+
)
|
90
93
|
)
|
94
|
+
|
91
95
|
notification.save!
|
92
96
|
|
93
|
-
|
94
|
-
|
95
|
-
notify_with += configuration.external_providers if !params[:onsite_only] && notify_external?(notification, user_settings)
|
96
|
-
notify_with.each do |provider|
|
97
|
-
title_provider_key = "#{locale_key}.#{provider.class.to_s.split("::").last}.title"
|
98
|
-
body_provider_key = "#{locale_key}.#{provider.class.to_s.split("::").last}.body"
|
99
|
-
notification.title = configuration.localization_provider.t(title_provider_key, params.merge(locale: target.locale)) if configuration.localization_provider.exists?(title_provider_key)
|
100
|
-
notification.body = configuration.localization_provider.t(body_provider_key, params.merge(locale: target.locale, default: "")) if configuration.localization_provider.exists?(body_provider_key)
|
101
|
-
provider.notify(notification)
|
102
|
-
end
|
97
|
+
UserNotifier.notify_user(notification, params)
|
98
|
+
SystemNotifier.notify_system(notification, params[:system])
|
103
99
|
end
|
104
100
|
|
105
101
|
def self.notify_onsite(key, target, params)
|
@@ -121,23 +117,16 @@ module UNotifier
|
|
121
117
|
end
|
122
118
|
end
|
123
119
|
|
124
|
-
|
120
|
+
def self.urgency_for(key, params = {})
|
121
|
+
config = load_notification!(key)["user"]
|
125
122
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
end
|
123
|
+
if config["target"].is_a?(Hash)
|
124
|
+
urgency = config.dig("target", params[:target], "urgency")
|
125
|
+
raise UnknownTargetError.new(key, params[:target]) unless urgency
|
130
126
|
|
131
|
-
|
132
|
-
case notification.urgency
|
133
|
-
when "immediate"
|
134
|
-
true
|
135
|
-
when "regular", "optional"
|
136
|
-
user_settings == "external" && !notification.target.online?
|
137
|
-
when "onsite"
|
138
|
-
false
|
127
|
+
urgency
|
139
128
|
else
|
140
|
-
|
129
|
+
config["urgency"]
|
141
130
|
end
|
142
131
|
end
|
143
132
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unotifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mgpnd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,6 +106,7 @@ extensions: []
|
|
106
106
|
extra_rdoc_files: []
|
107
107
|
files:
|
108
108
|
- ".gitignore"
|
109
|
+
- ".rubocop.yml"
|
109
110
|
- Gemfile
|
110
111
|
- Gemfile.lock
|
111
112
|
- LICENSE.txt
|
@@ -119,11 +120,14 @@ files:
|
|
119
120
|
- lib/exceptions.rb
|
120
121
|
- lib/hash.rb
|
121
122
|
- lib/provider.rb
|
122
|
-
- lib/provider/action_cable.rb
|
123
|
-
- lib/provider/action_mailer.rb
|
124
123
|
- lib/provider/provider_base.rb
|
124
|
+
- lib/provider/system/action_cable.rb
|
125
|
+
- lib/provider/user/action_cable.rb
|
126
|
+
- lib/provider/user/action_mailer.rb
|
125
127
|
- lib/settings.rb
|
126
128
|
- lib/unotifier.rb
|
129
|
+
- lib/unotifier/system_notifier.rb
|
130
|
+
- lib/unotifier/user_notifier.rb
|
127
131
|
- lib/unotifier/version.rb
|
128
132
|
- unotifier.gemspec
|
129
133
|
homepage: https://gitlab.com/hodlhodl-public/unotifier
|
@@ -148,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
152
|
- !ruby/object:Gem::Version
|
149
153
|
version: '0'
|
150
154
|
requirements: []
|
151
|
-
rubygems_version: 3.0.
|
155
|
+
rubygems_version: 3.0.6
|
152
156
|
signing_key:
|
153
157
|
specification_version: 4
|
154
158
|
summary: Ultimate user notification tool for web apps
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module UNotifier
|
2
|
-
module Provider
|
3
|
-
class ActionCable < ProviderBase
|
4
|
-
attr_reader :server
|
5
|
-
attr_accessor :autohide_delay, :channel_name
|
6
|
-
|
7
|
-
def initialize(server, channel_name: nil, autohide_delay: 30, notification_conditions: [])
|
8
|
-
super(notification_conditions: notification_conditions)
|
9
|
-
@server = server
|
10
|
-
@autohide_delay = autohide_delay
|
11
|
-
@channel_name =
|
12
|
-
channel_name ||
|
13
|
-
-> (notification) { "notifications_for_user_#{notification.target.login}" }
|
14
|
-
end
|
15
|
-
|
16
|
-
def notify(notification)
|
17
|
-
return unless can_notify?(notification)
|
18
|
-
if notification.target.online?
|
19
|
-
@server.broadcast @channel_name.call(notification), serialize_notification(notification)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def serialize_notification(notification)
|
24
|
-
{
|
25
|
-
id: notification.id,
|
26
|
-
title: notification.title,
|
27
|
-
body: notification.body,
|
28
|
-
autohide_delay: notification.autohide_delay || @autohide_delay,
|
29
|
-
user_login: notification.target.login,
|
30
|
-
link: notification.link,
|
31
|
-
urgency: notification.urgency,
|
32
|
-
}
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module UNotifier
|
2
|
-
module Provider
|
3
|
-
class ActionMailer < ProviderBase
|
4
|
-
def initialize(mailer, sending_method: :new_notification, notification_conditions: [])
|
5
|
-
super(notification_conditions: notification_conditions)
|
6
|
-
@mailer = mailer
|
7
|
-
@sending_method = sending_method
|
8
|
-
end
|
9
|
-
|
10
|
-
def notify(notification)
|
11
|
-
return unless can_notify?(notification)
|
12
|
-
sending_method = if @sending_method.kind_of?(Array)
|
13
|
-
@sending_method.map { |m| m.call(notification) }&.first
|
14
|
-
else
|
15
|
-
@sending_method
|
16
|
-
end
|
17
|
-
@mailer.public_send(sending_method, notification).deliver
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|