noticed 1.2.13 → 1.2.18
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/README.md +60 -9
- data/lib/generators/noticed/model_generator.rb +2 -2
- data/lib/noticed.rb +2 -0
- data/lib/noticed/base.rb +11 -6
- data/lib/noticed/delivery_methods/action_cable.rb +12 -12
- data/lib/noticed/delivery_methods/base.rb +28 -6
- data/lib/noticed/delivery_methods/email.rb +3 -7
- data/lib/noticed/delivery_methods/microsoft_teams.rb +32 -0
- data/lib/noticed/delivery_methods/vonage.rb +2 -0
- data/lib/noticed/model.rb +8 -4
- data/{app/channels → lib}/noticed/notification_channel.rb +0 -0
- data/lib/noticed/translation.rb +1 -1
- data/lib/noticed/version.rb +1 -1
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deee1f4f64ac8d04fafc5b9a6fb0c25811361fa650a4a337e4e134159ff82a23
|
4
|
+
data.tar.gz: dae9d38da48b00c508460b7ccf3a797df8a69cea372f2738a374321bb9d6a033
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a690b58c36dbf4651734192b59242f4c18cc9bbafeaed95c5570ed4991b48f49610b351f636fb2ca3d64120263b0780c8a15fd7ee9c4f8a7cc7099ab8e959c2
|
7
|
+
data.tar.gz: f6f765115f53b1e9ec03ecef10da432ce0794a11a6cc8cac444fe724db1ecdb6c4ce967edff8aa86d5f5edfef424f0b9e605939e0de8cf68b4b89bfb6ad2b207
|
data/README.md
CHANGED
@@ -12,6 +12,7 @@ Currently, we support these notification delivery methods out of the box:
|
|
12
12
|
* Email
|
13
13
|
* ActionCable channels
|
14
14
|
* Slack
|
15
|
+
* Microsoft Teams
|
15
16
|
* Twilio (SMS)
|
16
17
|
* Vonage / Nexmo (SMS)
|
17
18
|
|
@@ -86,6 +87,7 @@ class CommentNotification < Noticed::Base
|
|
86
87
|
end
|
87
88
|
|
88
89
|
# URL helpers are accessible in notifications
|
90
|
+
# Don't forget to set your default_url_options so Rails knows how to generate urls
|
89
91
|
def url
|
90
92
|
post_path(params[:post])
|
91
93
|
end
|
@@ -104,6 +106,7 @@ end
|
|
104
106
|
|
105
107
|
* `if: :method_name` - Calls `method_name`and cancels delivery method if `false` is returned
|
106
108
|
* `unless: :method_name` - Calls `method_name`and cancels delivery method if `true` is returned
|
109
|
+
* `delay: ActiveSupport::Duration` - Delays the delivery for the given duration of time
|
107
110
|
|
108
111
|
##### Helper Methods
|
109
112
|
|
@@ -113,6 +116,12 @@ You can define helper methods inside your Notification object to make it easier
|
|
113
116
|
|
114
117
|
Rails url helpers are included in notification classes by default so you have full access to them just like you would in your controllers and views.
|
115
118
|
|
119
|
+
Don't forget, you'll need to configure `default_url_options` in order for Rails to know what host and port to use when generating URLs.
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
|
123
|
+
```
|
124
|
+
|
116
125
|
**Callbacks**
|
117
126
|
|
118
127
|
Like ActiveRecord, notifications have several different types of callbacks.
|
@@ -246,6 +255,42 @@ Sends a Slack notification via webhook.
|
|
246
255
|
|
247
256
|
Defaults to `Rails.application.credentials.slack[:notification_url]`
|
248
257
|
|
258
|
+
### Microsoft Teams
|
259
|
+
|
260
|
+
Sends a Teams notification via webhook.
|
261
|
+
|
262
|
+
`deliver_by :microsoft_teams`
|
263
|
+
|
264
|
+
#### Options
|
265
|
+
|
266
|
+
* `format: :format_for_teams` - *Optional*
|
267
|
+
|
268
|
+
Use a custom method to define the payload sent to slack. Method should return a Hash.
|
269
|
+
Documentation for posting via Webhooks available at: https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook
|
270
|
+
|
271
|
+
```ruby
|
272
|
+
{
|
273
|
+
title: "This is the title for the card",
|
274
|
+
text: "This is the body text for the card",
|
275
|
+
sections: [{activityTitle: "Section Title", activityText: "Section Text"}],
|
276
|
+
"potentialAction": [{
|
277
|
+
"@type": "OpenUri",
|
278
|
+
name: "Button Text",
|
279
|
+
targets: [{
|
280
|
+
os: "default",
|
281
|
+
uri: "https://example.com/foo/action"
|
282
|
+
}]
|
283
|
+
}]
|
284
|
+
|
285
|
+
}
|
286
|
+
```
|
287
|
+
|
288
|
+
* `url: :url_for_teams_channel`: - *Optional*
|
289
|
+
|
290
|
+
Use a custom method to retrieve the MS Teams Webhook URL. Method should return a string.
|
291
|
+
|
292
|
+
Defaults to `Rails.application.credentials.microsoft_teams[:notification_url]`
|
293
|
+
|
249
294
|
### Twilio SMS
|
250
295
|
|
251
296
|
Sends an SMS notification via Twilio.
|
@@ -342,19 +387,24 @@ Delivery methods have access to the following methods and attributes:
|
|
342
387
|
|
343
388
|
#### Validating options passed to Custom Delivery methods
|
344
389
|
|
345
|
-
|
390
|
+
The presence of the delivery method options is automatically validated if using the `option(s)` method.
|
346
391
|
|
347
|
-
|
392
|
+
If you want to validate that the passed options contain valid values, or to add any custom validations, override the `self.validate!(delivery_method_options)` method from the `Noticed::DeliveryMethods::Base` class.
|
348
393
|
|
349
394
|
```ruby
|
350
395
|
class DeliveryMethods::Discord < Noticed::DeliveryMethods::Base
|
396
|
+
option :username # Requires the username option to be passed
|
397
|
+
|
351
398
|
def deliver
|
352
399
|
# Logic for sending a Discord notification
|
353
400
|
end
|
354
401
|
|
355
|
-
def self.validate!(
|
356
|
-
|
357
|
-
|
402
|
+
def self.validate!(delivery_method_options)
|
403
|
+
super # Don't forget to call super, otherwise option presence won't be validated
|
404
|
+
|
405
|
+
# Custom validations
|
406
|
+
if delivery_method_options[:username].blank?
|
407
|
+
raise Noticed::ValidationError, 'the `username` option must be present'
|
358
408
|
end
|
359
409
|
end
|
360
410
|
end
|
@@ -370,7 +420,7 @@ To fix the error, the argument has to be passed correctly. For example:
|
|
370
420
|
|
371
421
|
```ruby
|
372
422
|
class CommentNotification < Noticed::Base
|
373
|
-
deliver_by :discord, class: 'DeliveryMethods::Discord',
|
423
|
+
deliver_by :discord, class: 'DeliveryMethods::Discord', username: User.admin.username
|
374
424
|
end
|
375
425
|
```
|
376
426
|
|
@@ -394,7 +444,7 @@ Rails 6.1+ can serialize Class and Module objects as arguments to ActiveJob. The
|
|
394
444
|
deliver_by DeliveryMethods::Discord
|
395
445
|
```
|
396
446
|
|
397
|
-
For Rails 6.0
|
447
|
+
For Rails 6.0, you must pass strings of the class names in the `deliver_by` options.
|
398
448
|
|
399
449
|
```ruby
|
400
450
|
deliver_by :discord, class: "DeliveryMethods::Discord"
|
@@ -428,10 +478,11 @@ Convert back into a Noticed notification object:
|
|
428
478
|
@notification.to_notification
|
429
479
|
```
|
430
480
|
|
431
|
-
Mark notification as read:
|
481
|
+
Mark notification as read / unread:
|
432
482
|
|
433
483
|
```ruby
|
434
484
|
@notification.mark_as_read!
|
485
|
+
@notification.mark_as_unread!
|
435
486
|
```
|
436
487
|
|
437
488
|
Check if read / unread:
|
@@ -471,7 +522,7 @@ class Post < ApplicationRecord
|
|
471
522
|
end
|
472
523
|
```
|
473
524
|
|
474
|
-
##### Polymorphic
|
525
|
+
##### Polymorphic Association
|
475
526
|
|
476
527
|
If your notification is only associated with one model or you're using a `text` column for your params column , then a polymorphic association is what you'll want to use.
|
477
528
|
|
@@ -15,7 +15,7 @@ module Noticed
|
|
15
15
|
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
16
16
|
|
17
17
|
def generate_notification
|
18
|
-
generate :model, name, "recipient:references{polymorphic}", "type", params_column, "read_at:datetime", *attributes
|
18
|
+
generate :model, name, "recipient:references{polymorphic}", "type", params_column, "read_at:datetime:index", *attributes
|
19
19
|
end
|
20
20
|
|
21
21
|
def add_noticed_model
|
@@ -43,7 +43,7 @@ module Noticed
|
|
43
43
|
|
44
44
|
def params_column
|
45
45
|
case ActiveRecord::Base.configurations.configs_for(spec_name: "primary").config["adapter"]
|
46
|
-
when "
|
46
|
+
when "mysql2"
|
47
47
|
"params:json"
|
48
48
|
when "postgresql"
|
49
49
|
"params:jsonb"
|
data/lib/noticed.rb
CHANGED
@@ -8,6 +8,7 @@ module Noticed
|
|
8
8
|
autoload :Model, "noticed/model"
|
9
9
|
autoload :TextCoder, "noticed/text_coder"
|
10
10
|
autoload :Translation, "noticed/translation"
|
11
|
+
autoload :NotificationChannel, "noticed/notification_channel"
|
11
12
|
|
12
13
|
module DeliveryMethods
|
13
14
|
autoload :Base, "noticed/delivery_methods/base"
|
@@ -15,6 +16,7 @@ module Noticed
|
|
15
16
|
autoload :Database, "noticed/delivery_methods/database"
|
16
17
|
autoload :Email, "noticed/delivery_methods/email"
|
17
18
|
autoload :Slack, "noticed/delivery_methods/slack"
|
19
|
+
autoload :MicrosoftTeams, "noticed/delivery_methods/microsoft_teams"
|
18
20
|
autoload :Test, "noticed/delivery_methods/test"
|
19
21
|
autoload :Twilio, "noticed/delivery_methods/twilio"
|
20
22
|
autoload :Vonage, "noticed/delivery_methods/vonage"
|
data/lib/noticed/base.rb
CHANGED
@@ -32,7 +32,7 @@ module Noticed
|
|
32
32
|
def params(*names)
|
33
33
|
param_names.concat Array.wrap(names)
|
34
34
|
end
|
35
|
-
|
35
|
+
alias_method :param, :params
|
36
36
|
end
|
37
37
|
|
38
38
|
def initialize(params = {})
|
@@ -85,9 +85,6 @@ module Noticed
|
|
85
85
|
|
86
86
|
# Actually runs an individual delivery
|
87
87
|
def run_delivery_method(delivery_method, recipient:, enqueue:)
|
88
|
-
return if (delivery_method_name = delivery_method.dig(:options, :if)) && !send(delivery_method_name)
|
89
|
-
return if (delivery_method_name = delivery_method.dig(:options, :unless)) && send(delivery_method_name)
|
90
|
-
|
91
88
|
args = {
|
92
89
|
notification_class: self.class.name,
|
93
90
|
options: delivery_method[:options],
|
@@ -98,7 +95,15 @@ module Noticed
|
|
98
95
|
|
99
96
|
run_callbacks delivery_method[:name] do
|
100
97
|
method = delivery_method_for(delivery_method[:name], delivery_method[:options])
|
101
|
-
|
98
|
+
|
99
|
+
# Always perfrom later if a delay is present
|
100
|
+
if (delay = delivery_method.dig(:options, :delay))
|
101
|
+
method.set(wait: delay).perform_later(args)
|
102
|
+
elsif enqueue
|
103
|
+
method.perform_later(args)
|
104
|
+
else
|
105
|
+
method.perform_now(args)
|
106
|
+
end
|
102
107
|
end
|
103
108
|
end
|
104
109
|
|
@@ -106,7 +111,7 @@ module Noticed
|
|
106
111
|
if options[:class]
|
107
112
|
options[:class].constantize
|
108
113
|
else
|
109
|
-
"Noticed::DeliveryMethods::#{name.to_s.
|
114
|
+
"Noticed::DeliveryMethods::#{name.to_s.camelize}".constantize
|
110
115
|
end
|
111
116
|
end
|
112
117
|
|
@@ -17,18 +17,18 @@ module Noticed
|
|
17
17
|
|
18
18
|
def channel
|
19
19
|
@channel ||= begin
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
value = options[:channel]
|
21
|
+
case value
|
22
|
+
when String
|
23
|
+
value.constantize
|
24
|
+
when Symbol
|
25
|
+
notification.send(value)
|
26
|
+
when Class
|
27
|
+
value
|
28
|
+
else
|
29
|
+
Noticed::NotificationChannel
|
30
|
+
end
|
31
|
+
end
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -4,11 +4,35 @@ module Noticed
|
|
4
4
|
extend ActiveModel::Callbacks
|
5
5
|
define_model_callbacks :deliver
|
6
6
|
|
7
|
-
|
7
|
+
class_attribute :option_names, instance_writer: false, default: []
|
8
|
+
|
9
|
+
attr_reader :notification, :options, :params, :recipient, :record
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# Copy option names from parent
|
13
|
+
def inherited(base) #:nodoc:
|
14
|
+
base.option_names = option_names.dup
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def options(*names)
|
19
|
+
option_names.concat Array.wrap(names)
|
20
|
+
end
|
21
|
+
alias_method :option, :options
|
22
|
+
|
23
|
+
def validate!(delivery_method_options)
|
24
|
+
option_names.each do |option_name|
|
25
|
+
unless delivery_method_options.key? option_name
|
26
|
+
raise ValidationError, "option `#{option_name}` must be set for #{name}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
8
31
|
|
9
32
|
def perform(args)
|
10
33
|
@notification = args[:notification_class].constantize.new(args[:params])
|
11
34
|
@options = args[:options]
|
35
|
+
@params = args[:params]
|
12
36
|
@recipient = args[:recipient]
|
13
37
|
@record = args[:record]
|
14
38
|
|
@@ -16,6 +40,9 @@ module Noticed
|
|
16
40
|
@notification.record = args[:record]
|
17
41
|
@notification.recipient = args[:recipient]
|
18
42
|
|
43
|
+
return if (condition = @options[:if]) && !@notification.send(condition)
|
44
|
+
return if (condition = @options[:unless]) && @notification.send(condition)
|
45
|
+
|
19
46
|
run_callbacks :deliver do
|
20
47
|
deliver
|
21
48
|
end
|
@@ -25,11 +52,6 @@ module Noticed
|
|
25
52
|
raise NotImplementedError, "Delivery methods must implement a deliver method"
|
26
53
|
end
|
27
54
|
|
28
|
-
def self.validate!(options)
|
29
|
-
# Override this method in your custom DeliveryMethod class to validate the options
|
30
|
-
# and raise error, if invalid.
|
31
|
-
end
|
32
|
-
|
33
55
|
private
|
34
56
|
|
35
57
|
# Helper method for making POST requests from delivery methods
|
@@ -1,14 +1,10 @@
|
|
1
1
|
module Noticed
|
2
2
|
module DeliveryMethods
|
3
3
|
class Email < Base
|
4
|
-
|
5
|
-
mailer.with(format).send(method.to_sym).deliver_later
|
6
|
-
end
|
4
|
+
option :mailer
|
7
5
|
|
8
|
-
def
|
9
|
-
|
10
|
-
raise ValidationError, "email delivery method requires a 'mailer' to be specified"
|
11
|
-
end
|
6
|
+
def deliver
|
7
|
+
mailer.with(format).send(method.to_sym).deliver_now
|
12
8
|
end
|
13
9
|
|
14
10
|
private
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Noticed
|
2
|
+
module DeliveryMethods
|
3
|
+
class MicrosoftTeams < Base
|
4
|
+
def deliver
|
5
|
+
post(url, json: format)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def format
|
11
|
+
if (method = options[:format])
|
12
|
+
notification.send(method)
|
13
|
+
else
|
14
|
+
{
|
15
|
+
title: notification.params[:title],
|
16
|
+
text: notification.params[:text],
|
17
|
+
sections: notification.params[:sections],
|
18
|
+
potentialAction: notification.params[:notification_action]
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def url
|
24
|
+
if (method = options[:url])
|
25
|
+
notification.send(method)
|
26
|
+
else
|
27
|
+
Rails.application.credentials.microsoft_teams[:notification_url]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/noticed/model.rb
CHANGED
@@ -32,16 +32,20 @@ module Noticed
|
|
32
32
|
# Rehydrate the database notification into the Notification object for rendering
|
33
33
|
def to_notification
|
34
34
|
@_notification ||= begin
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
instance = type.constantize.with(params)
|
36
|
+
instance.record = self
|
37
|
+
instance
|
38
|
+
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def mark_as_read!
|
42
42
|
update(read_at: Time.current)
|
43
43
|
end
|
44
44
|
|
45
|
+
def mark_as_unread!
|
46
|
+
update(read_at: nil)
|
47
|
+
end
|
48
|
+
|
45
49
|
def unread?
|
46
50
|
!read?
|
47
51
|
end
|
File without changes
|
data/lib/noticed/translation.rb
CHANGED
data/lib/noticed/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: noticed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Oliver
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: webmock
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -91,7 +91,6 @@ files:
|
|
91
91
|
- MIT-LICENSE
|
92
92
|
- README.md
|
93
93
|
- Rakefile
|
94
|
-
- app/channels/noticed/notification_channel.rb
|
95
94
|
- lib/generators/noticed/delivery_method_generator.rb
|
96
95
|
- lib/generators/noticed/model_generator.rb
|
97
96
|
- lib/generators/noticed/notification_generator.rb
|
@@ -105,12 +104,14 @@ files:
|
|
105
104
|
- lib/noticed/delivery_methods/base.rb
|
106
105
|
- lib/noticed/delivery_methods/database.rb
|
107
106
|
- lib/noticed/delivery_methods/email.rb
|
107
|
+
- lib/noticed/delivery_methods/microsoft_teams.rb
|
108
108
|
- lib/noticed/delivery_methods/slack.rb
|
109
109
|
- lib/noticed/delivery_methods/test.rb
|
110
110
|
- lib/noticed/delivery_methods/twilio.rb
|
111
111
|
- lib/noticed/delivery_methods/vonage.rb
|
112
112
|
- lib/noticed/engine.rb
|
113
113
|
- lib/noticed/model.rb
|
114
|
+
- lib/noticed/notification_channel.rb
|
114
115
|
- lib/noticed/text_coder.rb
|
115
116
|
- lib/noticed/translation.rb
|
116
117
|
- lib/noticed/version.rb
|
@@ -119,7 +120,7 @@ homepage: https://github.com/excid3/noticed
|
|
119
120
|
licenses:
|
120
121
|
- MIT
|
121
122
|
metadata: {}
|
122
|
-
post_install_message:
|
123
|
+
post_install_message:
|
123
124
|
rdoc_options: []
|
124
125
|
require_paths:
|
125
126
|
- lib
|
@@ -134,8 +135,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
135
|
- !ruby/object:Gem::Version
|
135
136
|
version: '0'
|
136
137
|
requirements: []
|
137
|
-
rubygems_version: 3.1.
|
138
|
-
signing_key:
|
138
|
+
rubygems_version: 3.1.4
|
139
|
+
signing_key:
|
139
140
|
specification_version: 4
|
140
141
|
summary: Notifications for Ruby on Rails applications
|
141
142
|
test_files: []
|