noticed 1.2.9 → 1.2.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aab5129001fd96625a6a4141dfcf8aa93263b691fb663faa25e66153c5df9244
4
- data.tar.gz: 22d30af822563d150c933bc5aeb2116386db73bcb114d82cf46059ae53c9407e
3
+ metadata.gz: 49ea4996a79f9bb4b9070ebe4801c0927e8dddd357c9a4f8a7812fe6609a9eb5
4
+ data.tar.gz: aa5852613e11f73c2c263c961b49f1b54f7d77b414df59ed282703aa77757057
5
5
  SHA512:
6
- metadata.gz: 1ecf9ce4e2be01cbb171a86f1fe10feb2931e2035c8f857f2b98951c5f8e299b9eadef7b0b1086f53b971f5fa5a31f266491c57f5715cf615b7acc7cf828f518
7
- data.tar.gz: 8f896e1e98893d611697c10ebb30e6359a5cafefc9b54d6eff7a434b05eef90d055ed82e9e1d3ed61fcb76dbc2c0be4b5845ebdff799527e745507c919070585
6
+ metadata.gz: 561f2719087ff38f45ad8230e1f5a7f7bc9adb6f192f39d1217c7b5df5acde0606103a015f5c87523b438baf5be6f79a07153b5b0ef5bb6037445fa2bd94a382
7
+ data.tar.gz: 57c32c69975a7584f2e44dd41ef4c431fb8b33e629e92494a2988aabdde10feda18ce0224f08855b9118704f3ea7199a752732eb1306ef781ee51ea410b23a04
data/README.md CHANGED
@@ -256,7 +256,7 @@ Sends an SMS notification via Twilio.
256
256
 
257
257
  * `credentials: :get_twilio_credentials` - *Optional*
258
258
 
259
- Use a custom method to retrieve the credentials for Twilio. Method should return a Hash with `:account_sid`, `:auth_token` and `:phone_ number` keys.
259
+ Use a custom method to retrieve the credentials for Twilio. Method should return a Hash with `:account_sid`, `:auth_token` and `:phone_number` keys.
260
260
 
261
261
  Defaults to `Rails.application.credentials.twilio[:account_sid]` and `Rails.application.credentials.twilio[:auth_token]`
262
262
 
@@ -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:text", "read_at:datetime", *attributes
18
+ generate :model, name, "recipient:references{polymorphic}", "type", params_column, "read_at:datetime", *attributes
19
19
  end
20
20
 
21
21
  def add_noticed_model
@@ -31,6 +31,17 @@ module Noticed
31
31
  def model_path
32
32
  @model_path ||= File.join("app", "models", "#{file_path}.rb")
33
33
  end
34
+
35
+ def params_column
36
+ case ActiveRecord::Base.connection.instance_values["config"][:adapter]
37
+ when "mysql"
38
+ "params:json"
39
+ when "postgresql"
40
+ "params:jsonb"
41
+ else
42
+ "params:text"
43
+ end
44
+ end
34
45
  end
35
46
  end
36
47
  end
@@ -12,7 +12,7 @@ module Noticed
12
12
  desc "Generates a notification with the given NAME."
13
13
 
14
14
  def generate_notification
15
- template "notification.rb", "app/notifications/#{singular_name}.rb"
15
+ template "notification.rb", "app/notifications/#{file_path}.rb"
16
16
  end
17
17
  end
18
18
  end
@@ -6,6 +6,7 @@ module Noticed
6
6
  autoload :Base, "noticed/base"
7
7
  autoload :Coder, "noticed/coder"
8
8
  autoload :Model, "noticed/model"
9
+ autoload :TextCoder, "noticed/text_coder"
9
10
  autoload :Translation, "noticed/translation"
10
11
 
11
12
  module DeliveryMethods
@@ -33,4 +34,12 @@ module Noticed
33
34
 
34
35
  class ValidationError < StandardError
35
36
  end
37
+
38
+ class ResponseUnsuccessful < StandardError
39
+ attr_reader :response
40
+
41
+ def initialize(response)
42
+ @response = response
43
+ end
44
+ end
36
45
  end
@@ -2,18 +2,12 @@ module Noticed
2
2
  class Coder
3
3
  def self.load(data)
4
4
  return if data.nil?
5
-
6
- # Text columns need JSON parsing
7
- if data.is_a?(String)
8
- data = JSON.parse(data)
9
- end
10
-
11
5
  ActiveJob::Arguments.send(:deserialize_argument, data)
12
6
  end
13
7
 
14
8
  def self.dump(data)
15
9
  return if data.nil?
16
- ActiveJob::Arguments.send(:serialize_argument, data).to_json
10
+ ActiveJob::Arguments.send(:serialize_argument, data)
17
11
  end
18
12
  end
19
13
  end
@@ -6,15 +6,15 @@ module Noticed
6
6
 
7
7
  attr_reader :notification, :options, :recipient, :record
8
8
 
9
- def perform(notification_class:, options:, params:, recipient:, record:)
10
- @notification = notification_class.constantize.new(params)
11
- @options = options
12
- @recipient = recipient
13
- @record = record
9
+ def perform(args)
10
+ @notification = args[:notification_class].constantize.new(args[:params])
11
+ @options = args[:options]
12
+ @recipient = args[:recipient]
13
+ @record = args[:record]
14
14
 
15
15
  # Make notification aware of database record and recipient during delivery
16
- @notification.record = record
17
- @notification.recipient = recipient
16
+ @notification.record = args[:record]
17
+ @notification.recipient = args[:recipient]
18
18
 
19
19
  run_callbacks :deliver do
20
20
  deliver
@@ -24,6 +24,36 @@ module Noticed
24
24
  def deliver
25
25
  raise NotImplementedError, "Delivery methods must implement a deliver method"
26
26
  end
27
+
28
+ private
29
+
30
+ # Helper method for making POST requests from delivery methods
31
+ #
32
+ # Usage:
33
+ # post("http://example.com", basic_auth: {user:, pass:}, json: {}, form: {})
34
+ #
35
+ def post(url, args = {})
36
+ basic_auth = args.delete(:basic_auth)
37
+
38
+ request = if basic_auth
39
+ HTTP.basic_auth(user: basic_auth[:user], pass: basic_auth[:pass])
40
+ else
41
+ HTTP
42
+ end
43
+
44
+ response = request.post(url, args)
45
+
46
+ if options[:debug]
47
+ Rails.logger.debug("POST #{url}")
48
+ Rails.logger.debug("Response: #{response.code}: #{response}")
49
+ end
50
+
51
+ if !options[:ignore_failure] && !response.status.success?
52
+ raise ResponseUnsuccessful.new(response)
53
+ end
54
+
55
+ response
56
+ end
27
57
  end
28
58
  end
29
59
  end
@@ -2,7 +2,7 @@ module Noticed
2
2
  module DeliveryMethods
3
3
  class Slack < Base
4
4
  def deliver
5
- HTTP.post(url, json: format)
5
+ post(url, json: format)
6
6
  end
7
7
 
8
8
  private
@@ -2,7 +2,7 @@ module Noticed
2
2
  module DeliveryMethods
3
3
  class Twilio < Base
4
4
  def deliver
5
- HTTP.basic_auth(user: account_sid, pass: auth_token).post(url, form: format)
5
+ post(url, basic_auth: {user: account_sid, pass: auth_token}, form: format)
6
6
  end
7
7
 
8
8
  private
@@ -2,7 +2,11 @@ module Noticed
2
2
  module DeliveryMethods
3
3
  class Vonage < Base
4
4
  def deliver
5
- HTTP.post("https://rest.nexmo.com/sms/json", json: format)
5
+ response = post("https://rest.nexmo.com/sms/json", json: format)
6
+ status = response.parse.dig("messages", 0, "status")
7
+ if !options[:ignore_failure] && status != "0"
8
+ raise ResponseUnsuccessful.new(response)
9
+ end
6
10
  end
7
11
 
8
12
  private
@@ -5,17 +5,28 @@ module Noticed
5
5
  included do
6
6
  self.inheritance_column = nil
7
7
 
8
- serialize :params, Noticed::Coder
8
+ serialize :params, noticed_coder
9
9
 
10
10
  belongs_to :recipient, polymorphic: true
11
11
 
12
12
  scope :newest_first, -> { order(created_at: :desc) }
13
+ scope :unread, -> { where(read_at: nil) }
14
+ scope :read, -> { where.not(read_at: nil) }
13
15
  end
14
16
 
15
17
  module ClassMethods
16
18
  def mark_as_read!
17
19
  update_all(read_at: Time.current, updated_at: Time.current)
18
20
  end
21
+
22
+ def noticed_coder
23
+ case attribute_types["params"].type
24
+ when :json, :jsonb
25
+ Noticed::Coder
26
+ else
27
+ Noticed::TextCoder
28
+ end
29
+ end
19
30
  end
20
31
 
21
32
  # Rehydrate the database notification into the Notification object for rendering
@@ -0,0 +1,16 @@
1
+ module Noticed
2
+ class TextCoder
3
+ def self.load(data)
4
+ return if data.nil?
5
+
6
+ # Text columns need JSON parsing
7
+ data = JSON.parse(data)
8
+ ActiveJob::Arguments.send(:deserialize_argument, data)
9
+ end
10
+
11
+ def self.dump(data)
12
+ return if data.nil?
13
+ ActiveJob::Arguments.send(:serialize_argument, data).to_json
14
+ end
15
+ end
16
+ end
@@ -1,21 +1,23 @@
1
- module Translation
2
- extend ActiveSupport::Concern
1
+ module Noticed
2
+ module Translation
3
+ extend ActiveSupport::Concern
3
4
 
4
- # Returns the +i18n_scope+ for the class. Overwrite if you want custom lookup.
5
- def i18n_scope
6
- :notifications
7
- end
5
+ # Returns the +i18n_scope+ for the class. Overwrite if you want custom lookup.
6
+ def i18n_scope
7
+ :notifications
8
+ end
8
9
 
9
- def translate(key, **options)
10
- I18n.translate(scope_translation_key(key), **options)
11
- end
12
- alias t translate
10
+ def translate(key, **options)
11
+ I18n.translate(scope_translation_key(key), **options)
12
+ end
13
+ alias t translate
13
14
 
14
- def scope_translation_key(key)
15
- if key.to_s.start_with?(".")
16
- "#{i18n_scope}.#{self.class.name.underscore}#{key}"
17
- else
18
- key
15
+ def scope_translation_key(key)
16
+ if key.to_s.start_with?(".")
17
+ "#{i18n_scope}.#{self.class.name.underscore}#{key}"
18
+ else
19
+ key
20
+ end
19
21
  end
20
22
  end
21
23
  end
@@ -1,3 +1,3 @@
1
1
  module Noticed
2
- VERSION = "1.2.9"
2
+ VERSION = "1.2.10"
3
3
  end
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.9
4
+ version: 1.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Oliver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-07 00:00:00.000000000 Z
11
+ date: 2020-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -109,6 +109,7 @@ files:
109
109
  - lib/noticed/delivery_methods/vonage.rb
110
110
  - lib/noticed/engine.rb
111
111
  - lib/noticed/model.rb
112
+ - lib/noticed/text_coder.rb
112
113
  - lib/noticed/translation.rb
113
114
  - lib/noticed/version.rb
114
115
  - lib/tasks/noticed_tasks.rake