activity_notification 2.0.0 → 2.1.4

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.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +22 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  4. data/.github/pull_request_template.md +13 -0
  5. data/.gitignore +10 -3
  6. data/.travis.yml +6 -5
  7. data/CHANGELOG.md +60 -0
  8. data/Gemfile +8 -3
  9. data/Procfile +1 -1
  10. data/README.md +153 -1510
  11. data/activity_notification.gemspec +4 -1
  12. data/app/channels/activity_notification/notification_api_channel.rb +12 -0
  13. data/app/channels/activity_notification/notification_api_with_devise_channel.rb +46 -0
  14. data/app/channels/activity_notification/notification_channel.rb +2 -2
  15. data/app/channels/activity_notification/notification_with_devise_channel.rb +2 -2
  16. data/app/controllers/activity_notification/apidocs_controller.rb +75 -0
  17. data/app/controllers/activity_notification/notifications_api_controller.rb +143 -0
  18. data/app/controllers/activity_notification/notifications_api_with_devise_controller.rb +7 -0
  19. data/app/controllers/activity_notification/notifications_controller.rb +79 -53
  20. data/app/controllers/activity_notification/subscriptions_api_controller.rb +197 -0
  21. data/app/controllers/activity_notification/subscriptions_api_with_devise_controller.rb +7 -0
  22. data/app/controllers/activity_notification/subscriptions_controller.rb +78 -69
  23. data/app/views/activity_notification/notifications/default/_default.html.erb +18 -18
  24. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +14 -14
  25. data/app/views/activity_notification/notifications/default/index.html.erb +6 -6
  26. data/app/views/activity_notification/optional_targets/default/action_cable_channel/_default.html.erb +176 -0
  27. data/app/views/activity_notification/subscriptions/default/_form.html.erb +1 -1
  28. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +3 -31
  29. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +7 -7
  30. data/app/views/activity_notification/subscriptions/default/index.html.erb +11 -7
  31. data/bin/deploy_on_heroku.sh +3 -1
  32. data/docs/CODE_OF_CONDUCT.md +76 -0
  33. data/docs/CONTRIBUTING.md +36 -0
  34. data/docs/Functions.md +1130 -0
  35. data/docs/Setup.md +801 -0
  36. data/docs/Testing.md +148 -0
  37. data/gemfiles/Gemfile.rails-4.2 +5 -1
  38. data/gemfiles/Gemfile.rails-5.0 +6 -1
  39. data/gemfiles/Gemfile.rails-5.1 +6 -1
  40. data/gemfiles/Gemfile.rails-5.2 +6 -1
  41. data/gemfiles/{Gemfile.rails-6.0.rc → Gemfile.rails-6.0} +6 -5
  42. data/lib/activity_notification.rb +13 -0
  43. data/lib/activity_notification/apis/notification_api.rb +37 -93
  44. data/lib/activity_notification/apis/subscription_api.rb +20 -8
  45. data/lib/activity_notification/apis/swagger.rb +6 -0
  46. data/lib/activity_notification/common.rb +4 -1
  47. data/lib/activity_notification/config.rb +41 -21
  48. data/lib/activity_notification/controllers/common_api_controller.rb +30 -0
  49. data/lib/activity_notification/controllers/common_controller.rb +45 -21
  50. data/lib/activity_notification/controllers/concerns/swagger/error_responses.rb +55 -0
  51. data/lib/activity_notification/controllers/concerns/swagger/notifications_api.rb +273 -0
  52. data/lib/activity_notification/controllers/concerns/swagger/notifications_parameters.rb +92 -0
  53. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_api.rb +405 -0
  54. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_parameters.rb +50 -0
  55. data/lib/activity_notification/controllers/devise_authentication_controller.rb +7 -6
  56. data/lib/activity_notification/gem_version.rb +14 -0
  57. data/lib/activity_notification/helpers/errors.rb +2 -0
  58. data/lib/activity_notification/helpers/view_helpers.rb +4 -0
  59. data/lib/activity_notification/mailers/helpers.rb +17 -10
  60. data/lib/activity_notification/models/concerns/notifiable.rb +31 -15
  61. data/lib/activity_notification/models/concerns/subscriber.rb +12 -1
  62. data/lib/activity_notification/models/concerns/swagger/error_schema.rb +36 -0
  63. data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +209 -0
  64. data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +162 -0
  65. data/lib/activity_notification/models/concerns/target.rb +36 -10
  66. data/lib/activity_notification/models/notification.rb +1 -0
  67. data/lib/activity_notification/models/subscription.rb +1 -0
  68. data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +69 -0
  69. data/lib/activity_notification/optional_targets/action_cable_channel.rb +68 -0
  70. data/lib/activity_notification/optional_targets/base.rb +7 -13
  71. data/lib/activity_notification/orm/active_record/notification.rb +17 -1
  72. data/lib/activity_notification/orm/active_record/subscription.rb +1 -1
  73. data/lib/activity_notification/orm/dynamoid.rb +38 -3
  74. data/lib/activity_notification/orm/dynamoid/extension.rb +79 -1
  75. data/lib/activity_notification/orm/dynamoid/notification.rb +49 -14
  76. data/lib/activity_notification/orm/dynamoid/subscription.rb +2 -2
  77. data/lib/activity_notification/orm/mongoid.rb +32 -3
  78. data/lib/activity_notification/orm/mongoid/notification.rb +24 -6
  79. data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
  80. data/lib/activity_notification/rails/routes.rb +132 -48
  81. data/lib/activity_notification/renderable.rb +13 -2
  82. data/lib/activity_notification/roles/acts_as_notifiable.rb +39 -20
  83. data/lib/activity_notification/version.rb +1 -1
  84. data/lib/generators/activity_notification/controllers_generator.rb +2 -1
  85. data/lib/generators/templates/activity_notification.rb +8 -0
  86. data/lib/generators/templates/controllers/notifications_api_controller.rb +31 -0
  87. data/lib/generators/templates/controllers/notifications_api_with_devise_controller.rb +31 -0
  88. data/lib/generators/templates/controllers/notifications_controller.rb +1 -37
  89. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +1 -45
  90. data/lib/generators/templates/controllers/subscriptions_api_controller.rb +61 -0
  91. data/lib/generators/templates/controllers/subscriptions_api_with_devise_controller.rb +61 -0
  92. data/lib/generators/templates/controllers/subscriptions_controller.rb +14 -37
  93. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +14 -45
  94. data/lib/generators/templates/models/README +8 -4
  95. data/lib/generators/templates/models/notification.rb +1 -1
  96. data/lib/generators/templates/models/subscription.rb +1 -1
  97. data/package.json +8 -0
  98. data/spec/channels/notification_api_channel_shared_examples.rb +59 -0
  99. data/spec/channels/notification_api_channel_spec.rb +51 -0
  100. data/spec/channels/notification_api_with_devise_channel_spec.rb +78 -0
  101. data/spec/concerns/apis/notification_api_spec.rb +38 -3
  102. data/spec/concerns/models/notifiable_spec.rb +82 -18
  103. data/spec/concerns/models/subscriber_spec.rb +13 -16
  104. data/spec/concerns/models/target_spec.rb +32 -0
  105. data/spec/concerns/renderable_spec.rb +2 -2
  106. data/spec/config_spec.rb +26 -15
  107. data/spec/controllers/controller_spec_utility.rb +136 -0
  108. data/spec/controllers/notifications_api_controller_shared_examples.rb +506 -0
  109. data/spec/controllers/notifications_api_controller_spec.rb +19 -0
  110. data/spec/controllers/notifications_api_with_devise_controller_spec.rb +60 -0
  111. data/spec/controllers/notifications_controller_shared_examples.rb +54 -79
  112. data/spec/controllers/notifications_controller_spec.rb +1 -2
  113. data/spec/controllers/notifications_with_devise_controller_spec.rb +3 -12
  114. data/spec/controllers/subscriptions_api_controller_shared_examples.rb +750 -0
  115. data/spec/controllers/subscriptions_api_controller_spec.rb +19 -0
  116. data/spec/controllers/subscriptions_api_with_devise_controller_spec.rb +60 -0
  117. data/spec/controllers/subscriptions_controller_shared_examples.rb +94 -121
  118. data/spec/controllers/subscriptions_controller_spec.rb +1 -2
  119. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +3 -12
  120. data/spec/helpers/view_helpers_spec.rb +4 -11
  121. data/spec/mailers/mailer_spec.rb +41 -0
  122. data/spec/models/notification_spec.rb +17 -0
  123. data/spec/models/subscription_spec.rb +8 -13
  124. data/spec/optional_targets/action_cable_api_channel_spec.rb +37 -0
  125. data/spec/optional_targets/action_cable_channel_spec.rb +44 -0
  126. data/spec/optional_targets/amazon_sns_spec.rb +0 -2
  127. data/spec/optional_targets/slack_spec.rb +0 -2
  128. data/spec/rails_app/Rakefile +9 -0
  129. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  130. data/spec/rails_app/app/assets/images/.keep +0 -0
  131. data/spec/rails_app/app/controllers/admins_controller.rb +21 -0
  132. data/spec/rails_app/app/controllers/application_controller.rb +1 -1
  133. data/spec/rails_app/app/controllers/articles_controller.rb +6 -3
  134. data/spec/rails_app/app/controllers/spa_controller.rb +7 -0
  135. data/spec/rails_app/app/controllers/users/notifications_controller.rb +0 -65
  136. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +0 -73
  137. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +0 -77
  138. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +0 -85
  139. data/spec/rails_app/app/controllers/users_controller.rb +26 -0
  140. data/spec/rails_app/app/javascript/App.vue +40 -0
  141. data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +82 -0
  142. data/spec/rails_app/app/javascript/components/Top.vue +98 -0
  143. data/spec/rails_app/app/javascript/components/notifications/Index.vue +200 -0
  144. data/spec/rails_app/app/javascript/components/notifications/Notification.vue +133 -0
  145. data/spec/rails_app/app/javascript/components/notifications/NotificationContent.vue +122 -0
  146. data/spec/rails_app/app/javascript/components/subscriptions/Index.vue +279 -0
  147. data/spec/rails_app/app/javascript/components/subscriptions/NewSubscription.vue +112 -0
  148. data/spec/rails_app/app/javascript/components/subscriptions/NotificationKey.vue +141 -0
  149. data/spec/rails_app/app/javascript/components/subscriptions/Subscription.vue +226 -0
  150. data/spec/rails_app/app/javascript/config/development.js +5 -0
  151. data/spec/rails_app/app/javascript/config/environment.js +7 -0
  152. data/spec/rails_app/app/javascript/config/production.js +5 -0
  153. data/spec/rails_app/app/javascript/config/test.js +5 -0
  154. data/spec/rails_app/app/javascript/packs/application.js +18 -0
  155. data/spec/rails_app/app/javascript/packs/spa.js +14 -0
  156. data/spec/rails_app/app/javascript/router/index.js +73 -0
  157. data/spec/rails_app/app/javascript/store/index.js +37 -0
  158. data/spec/rails_app/app/models/admin.rb +16 -15
  159. data/spec/rails_app/app/models/article.rb +26 -21
  160. data/spec/rails_app/app/models/comment.rb +24 -71
  161. data/spec/rails_app/app/models/dummy/dummy_group.rb +8 -0
  162. data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +8 -0
  163. data/spec/rails_app/app/models/user.rb +44 -20
  164. data/spec/rails_app/app/views/activity_notification/notifications/default/article/_update.html.erb +146 -0
  165. data/spec/rails_app/app/views/articles/index.html.erb +51 -7
  166. data/spec/rails_app/app/views/articles/show.html.erb +1 -1
  167. data/spec/rails_app/app/views/layouts/_header.html.erb +8 -10
  168. data/spec/rails_app/app/views/spa/index.html.erb +2 -0
  169. data/spec/rails_app/babel.config.js +72 -0
  170. data/spec/rails_app/bin/webpack +18 -0
  171. data/spec/rails_app/bin/webpack-dev-server +18 -0
  172. data/spec/rails_app/config/application.rb +18 -2
  173. data/spec/rails_app/config/dynamoid.rb +11 -3
  174. data/spec/rails_app/config/environment.rb +2 -1
  175. data/spec/rails_app/config/environments/development.rb +5 -0
  176. data/spec/rails_app/config/environments/production.rb +6 -0
  177. data/spec/rails_app/config/environments/test.rb +5 -0
  178. data/spec/rails_app/config/initializers/activity_notification.rb +11 -3
  179. data/spec/rails_app/config/initializers/copy_it.aws.rb.template +6 -0
  180. data/spec/rails_app/config/initializers/devise_token_auth.rb +55 -0
  181. data/spec/rails_app/config/initializers/mysql.rb +9 -0
  182. data/spec/rails_app/config/locales/activity_notification.en.yml +2 -2
  183. data/spec/rails_app/config/routes.rb +37 -1
  184. data/spec/rails_app/config/webpack/development.js +5 -0
  185. data/spec/rails_app/config/webpack/environment.js +7 -0
  186. data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
  187. data/spec/rails_app/config/webpack/production.js +5 -0
  188. data/spec/rails_app/config/webpack/test.js +5 -0
  189. data/spec/rails_app/config/webpacker.yml +97 -0
  190. data/spec/rails_app/db/migrate/20191201000000_add_tokens_to_users.rb +10 -0
  191. data/spec/rails_app/db/schema.rb +4 -1
  192. data/spec/rails_app/db/seeds.rb +10 -2
  193. data/spec/rails_app/lib/custom_optional_targets/raise_error.rb +14 -0
  194. data/spec/rails_app/package.json +23 -0
  195. data/spec/rails_app/postcss.config.js +12 -0
  196. data/spec/roles/acts_as_group_spec.rb +0 -2
  197. data/spec/roles/acts_as_notifiable_spec.rb +6 -8
  198. data/spec/roles/acts_as_notifier_spec.rb +0 -2
  199. data/spec/roles/acts_as_target_spec.rb +0 -4
  200. data/spec/spec_helper.rb +7 -15
  201. data/spec/version_spec.rb +31 -0
  202. metadata +191 -13
@@ -0,0 +1,50 @@
1
+ module ActivityNotification
2
+ module Swagger::SubscriptionsParameters #:nodoc:
3
+ module TargetParameters #:nodoc:
4
+ def self.extended(base)
5
+ base.parameter do
6
+ key :name, :target_type
7
+ key :in, :path
8
+ key :description, "Target type of subscriptions: e.g. 'users'"
9
+ key :required, true
10
+ key :type, :string
11
+ key :example, "users"
12
+ end
13
+ base.parameter do
14
+ key :name, :target_id
15
+ key :in, :path
16
+ key :description, "Target ID of subscriptions. This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
17
+ key :required, true
18
+ key :type, :string
19
+ key :example, 1
20
+ end
21
+ end
22
+ end
23
+
24
+ module IdParameter #:nodoc:
25
+ def self.extended(base)
26
+ base.parameter do
27
+ key :name, :id
28
+ key :in, :path
29
+ key :description, 'ID of subscription record. This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs.'
30
+ key :required, true
31
+ key :type, :string
32
+ key :example, 123
33
+ end
34
+ end
35
+ end
36
+
37
+ module FilterByParameters #:nodoc:
38
+ def self.extended(base)
39
+ base.parameter do
40
+ key :name, :filtered_by_key
41
+ key :in, :query
42
+ key :description, "Key of subscriptions to filter subscription index: e.g. 'comment.default'"
43
+ key :required, false
44
+ key :type, :string
45
+ key :example, "comment.default"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -2,6 +2,7 @@ module ActivityNotification
2
2
  # Module included in controllers to authenticate with Devise module
3
3
  module DeviseAuthenticationController
4
4
  extend ActiveSupport::Concern
5
+ include CommonController
5
6
 
6
7
  included do
7
8
  prepend_before_action :authenticate_devise_resource!
@@ -13,17 +14,17 @@ module ActivityNotification
13
14
  # Authenticate devise resource by Devise (e.g. calling authenticate_user! method).
14
15
  # @api protected
15
16
  # @todo Needs to call authenticate method by more secure way
16
- # @return [Responce] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
17
+ # @return [Response] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
17
18
  def authenticate_devise_resource!
18
19
  if params[:devise_type].present?
19
20
  authenticate_method_name = "authenticate_#{params[:devise_type].to_resource_name}!"
20
21
  if respond_to?(authenticate_method_name)
21
22
  send(authenticate_method_name)
22
23
  else
23
- render plain: "403 Forbidden: Unauthenticated", status: 403
24
+ render status: 403, json: error_response(code: 403, message: "Unauthenticated with Devise")
24
25
  end
25
26
  else
26
- render plain: "400 Bad Request: Missing parameter", status: 400
27
+ render status: 400, json: error_response(code: 400, message: "Invalid parameter", type: "Missing devise_type")
27
28
  end
28
29
  end
29
30
 
@@ -38,7 +39,7 @@ module ActivityNotification
38
39
  target_class = target_type.to_model_class
39
40
  current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
40
41
  params[:target_id] = target_class.resolve_current_devise_target(send(current_resource_method_name))
41
- render(plain: "403 Forbidden: Unauthenticated as default target", status: 403) and return if params[:target_id].blank?
42
+ render status: 403, json: error_response(code: 403, message: "Unauthenticated as default target") and return if params[:target_id].blank?
42
43
  end
43
44
  super
44
45
  end
@@ -46,11 +47,11 @@ module ActivityNotification
46
47
  # Authenticate the target of requested notification with authenticated devise resource.
47
48
  # @api protected
48
49
  # @todo Needs to call authenticate method by more secure way
49
- # @return [Responce] Returns HTTP 403 for unauthorized target
50
+ # @return [Response] Returns HTTP 403 for unauthorized target
50
51
  def authenticate_target!
51
52
  current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
52
53
  unless @target.authenticated_with_devise?(send(current_resource_method_name))
53
- render plain: "403 Forbidden: Unauthorized target", status: 403
54
+ render status: 403, json: error_response(code: 403, message: "Unauthorized target")
54
55
  end
55
56
  end
56
57
  end
@@ -0,0 +1,14 @@
1
+ module ActivityNotification
2
+ # Returns the version of the currently loaded ActivityNotification as a Gem::Version
3
+ def self.gem_version
4
+ Gem::Version.new VERSION
5
+ end
6
+
7
+ # Manages individual gem version from Gem::Version
8
+ module GEM_VERSION
9
+ MAJOR = VERSION.split(".")[0]
10
+ MINOR = VERSION.split(".")[1]
11
+ TINY = VERSION.split(".")[2]
12
+ PRE = VERSION.split(".")[3]
13
+ end
14
+ end
@@ -1,4 +1,6 @@
1
1
  module ActivityNotification
2
2
  class ConfigError < StandardError; end
3
3
  class DeleteRestrictionError < StandardError; end
4
+ class NotifiableNotFoundError < StandardError; end
5
+ class RecordInvalidError < StandardError; end
4
6
  end
@@ -13,6 +13,8 @@ module ActivityNotification
13
13
  # @option options [String] :layout (nil) Layout template name
14
14
  # @option options [String] :layout_root ('layouts') Root path of layout template
15
15
  # @option options [String, Symbol] :fallback (nil) Fallback template to use when MissingTemplate is raised. Set :text to use i18n text as fallback.
16
+ # @option options [Hash] :assigns (nil) Parameters to be set as assigns
17
+ # @option options [Hash] :locals (nil) Parameters to be set as locals
16
18
  # @return [String] Rendered view or text as string
17
19
  def render_notification(notifications, options = {})
18
20
  if notifications.is_a? ActivityNotification::Notification
@@ -51,6 +53,8 @@ module ActivityNotification
51
53
  # @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
52
54
  # @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
53
55
  # @option options [String] :filtered_by_key (nil) Key of the notification for filter
56
+ # @option options [String] :later_than (nil) ISO 8601 format time to filter notification index later than specified time
57
+ # @option options [String] :earlier_than (nil) ISO 8601 format time to filter notification index earlier than specified time
54
58
  # @option options [Array] :custom_filter (nil) Custom notification filter (e.g. ["created_at >= ?", time.hour.ago])
55
59
  # @return [String] Rendered view or text as string
56
60
  def render_notification_of(target, options = {})
@@ -58,21 +58,28 @@ module ActivityNotification
58
58
  @notification.notifiable.overriding_notification_email_key(@target, key).present?
59
59
  key = @notification.notifiable.overriding_notification_email_key(@target, key)
60
60
  end
61
- if @notification.notifiable.respond_to?(:overriding_notification_email_subject) &&
62
- @notification.notifiable.overriding_notification_email_subject(@target, key).present?
63
- subject = @notification.notifiable.overriding_notification_email_subject(@target, key)
64
- else
65
- subject = subject_for(key)
66
- end
67
61
  headers = {
68
- subject: subject,
69
62
  to: mailer_to(@target),
70
- from: mailer_from(key),
71
- reply_to: mailer_reply_to(key),
72
63
  template_path: template_paths,
73
64
  template_name: template_name(key)
74
65
  }.merge(options)
75
-
66
+ {
67
+ subject: :subject_for,
68
+ from: :mailer_from,
69
+ reply_to: :mailer_reply_to,
70
+ message_id: nil
71
+ }.each do |header_name, default_method|
72
+ overridding_method_name = "overriding_notification_email_#{header_name.to_s}"
73
+ header_value = if @notification.notifiable.respond_to?(overridding_method_name) &&
74
+ @notification.notifiable.send(overridding_method_name, @target, key).present?
75
+ @notification.notifiable.send(overridding_method_name, @target, key)
76
+ elsif default_method
77
+ send(default_method, key)
78
+ else
79
+ nil
80
+ end
81
+ headers[header_name] = header_value if header_value
82
+ end
76
83
  @email = headers[:to]
77
84
  headers
78
85
  end
@@ -25,7 +25,8 @@ module ActivityNotification
25
25
  :_notifier,
26
26
  :_notification_parameters,
27
27
  :_notification_email_allowed,
28
- :_notification_action_cable_allowed,
28
+ :_notifiable_action_cable_allowed,
29
+ :_notifiable_action_cable_api_allowed,
29
30
  :_notifiable_path,
30
31
  :_printable_notifiable_name,
31
32
  :_optional_targets
@@ -48,16 +49,17 @@ module ActivityNotification
48
49
  # Sets default values to notifiable class fields.
49
50
  # @return [NilClass] nil
50
51
  def set_notifiable_class_defaults
51
- self._notification_targets = {}
52
- self._notification_group = {}
53
- self._notification_group_expiry_delay = {}
54
- self._notifier = {}
55
- self._notification_parameters = {}
56
- self._notification_email_allowed = {}
57
- self._notification_action_cable_allowed = {}
58
- self._notifiable_path = {}
59
- self._printable_notifiable_name = {}
60
- self._optional_targets = {}
52
+ self._notification_targets = {}
53
+ self._notification_group = {}
54
+ self._notification_group_expiry_delay = {}
55
+ self._notifier = {}
56
+ self._notification_parameters = {}
57
+ self._notification_email_allowed = {}
58
+ self._notifiable_action_cable_allowed = {}
59
+ self._notifiable_action_cable_api_allowed = {}
60
+ self._notifiable_path = {}
61
+ self._printable_notifiable_name = {}
62
+ self._optional_targets = {}
61
63
  nil
62
64
  end
63
65
  end
@@ -160,14 +162,28 @@ module ActivityNotification
160
162
  # @param [Object] target Target instance to notify
161
163
  # @param [String] key Key of the notification
162
164
  # @return [Boolean] If publishing WebSocket using ActionCable is allowed for the notifiable
163
- def notification_action_cable_allowed?(target, key = nil)
165
+ def notifiable_action_cable_allowed?(target, key = nil)
164
166
  resolve_parameter(
165
- "notification_action_cable_allowed_for_#{cast_to_resources_name(target.class)}?",
166
- _notification_action_cable_allowed[cast_to_resources_sym(target.class)],
167
+ "notifiable_action_cable_allowed_for_#{cast_to_resources_name(target.class)}?",
168
+ _notifiable_action_cable_allowed[cast_to_resources_sym(target.class)],
167
169
  ActivityNotification.config.action_cable_enabled,
168
170
  target, key)
169
171
  end
170
172
 
173
+ # Returns if publishing WebSocket API using ActionCable is allowed for the notifiable from configured field or overridden method.
174
+ # This method is able to be overridden.
175
+ #
176
+ # @param [Object] target Target instance to notify
177
+ # @param [String] key Key of the notification
178
+ # @return [Boolean] If publishing WebSocket API using ActionCable is allowed for the notifiable
179
+ def notifiable_action_cable_api_allowed?(target, key = nil)
180
+ resolve_parameter(
181
+ "notifiable_action_cable_api_allowed_for_#{cast_to_resources_name(target.class)}?",
182
+ _notifiable_action_cable_api_allowed[cast_to_resources_sym(target.class)],
183
+ ActivityNotification.config.action_cable_api_enabled,
184
+ target, key)
185
+ end
186
+
171
187
  # Returns notifiable_path to move after opening notification from configured field or overridden method.
172
188
  # This method is able to be overridden.
173
189
  #
@@ -466,7 +482,7 @@ module ActivityNotification
466
482
  # Casts to symbol of resources name.
467
483
  # @api private
468
484
  def cast_to_resources_sym(target_type)
469
- target_type.to_s.to_resources_name.to_sym
485
+ cast_to_resources_name(target_type).to_sym
470
486
  end
471
487
  end
472
488
  end
@@ -46,8 +46,19 @@ module ActivityNotification
46
46
  # Creates new subscription of the target.
47
47
  #
48
48
  # @param [Hash] subscription_params Parameters to create subscription record
49
+ # @raise [ActivityNotification::RecordInvalidError] Failed to save subscription due to model validation
49
50
  # @return [Subscription] Created subscription instance
50
51
  def create_subscription(subscription_params = {})
52
+ subscription = build_subscription(subscription_params)
53
+ raise RecordInvalidError, subscription.errors.full_messages.first unless subscription.save
54
+ subscription
55
+ end
56
+
57
+ # Builds new subscription of the target.
58
+ #
59
+ # @param [Hash] subscription_params Parameters to build subscription record
60
+ # @return [Subscription] Built subscription instance
61
+ def build_subscription(subscription_params = {})
51
62
  created_at = Time.current
52
63
  if subscription_params[:subscribing] == false && subscription_params[:subscribing_to_email].nil?
53
64
  subscription_params[:subscribing_to_email] = subscription_params[:subscribing]
@@ -74,7 +85,7 @@ module ActivityNotification
74
85
  )
75
86
  end
76
87
  subscription.assign_attributes(optional_targets: optional_targets)
77
- subscription.save ? subscription : nil
88
+ subscription
78
89
  end
79
90
 
80
91
  # Gets configured subscription index of the target.
@@ -0,0 +1,36 @@
1
+ module ActivityNotification
2
+ module Swagger::ErrorSchema #:nodoc:
3
+ extend ActiveSupport::Concern
4
+ include ::Swagger::Blocks
5
+
6
+ included do
7
+ swagger_component do
8
+ schema :Error do
9
+ key :required, [:gem, :error]
10
+ property :gem do
11
+ key :type, :string
12
+ key :description, "Name of gem generating this error"
13
+ key :default, "activity_notification"
14
+ key :example, "activity_notification"
15
+ end
16
+ property :error do
17
+ key :type, :object
18
+ key :description, "Error information"
19
+ property :code do
20
+ key :type, :integer
21
+ key :description, "Error code: default value is HTTP status code"
22
+ end
23
+ property :message do
24
+ key :type, :string
25
+ key :description, "Error message"
26
+ end
27
+ property :type do
28
+ key :type, :string
29
+ key :description, "Error type describing error message"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,209 @@
1
+ module ActivityNotification
2
+ module Swagger::NotificationSchema #:nodoc:
3
+ extend ActiveSupport::Concern
4
+ include ::Swagger::Blocks
5
+
6
+ included do
7
+ swagger_component do
8
+ schema :NotificationAttributes do
9
+ key :type, :object
10
+ property :id do
11
+ key :oneOf, [
12
+ { type: :integer },
13
+ { type: :string }
14
+ ]
15
+ key :description, "This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
16
+ key :example, 123
17
+ end
18
+ property :target_type do
19
+ key :type, :string
20
+ key :example, "User"
21
+ end
22
+ property :target_id do
23
+ key :oneOf, [
24
+ { type: :integer },
25
+ { type: :string }
26
+ ]
27
+ key :description, "This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
28
+ key :example, 1
29
+ end
30
+ property :notifiable_type do
31
+ key :type, :string
32
+ key :example, "Comment"
33
+ end
34
+ property :notifiable_id do
35
+ key :oneOf, [
36
+ { type: :integer },
37
+ { type: :string }
38
+ ]
39
+ key :description, "This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
40
+ key :example, 22
41
+ end
42
+ property :key do
43
+ key :type, :string
44
+ key :example, "comment.default"
45
+ end
46
+ property :group_type do
47
+ key :type, :string
48
+ key :nullable, true
49
+ key :example, "Article"
50
+ end
51
+ property :group_id do
52
+ key :oneOf, [
53
+ { type: :integer },
54
+ { type: :string },
55
+ { nullable: true }
56
+ ]
57
+ key :description, "This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
58
+ key :nullable, true
59
+ key :example, 11
60
+ end
61
+ property :group_owner_id do
62
+ key :oneOf, [
63
+ { type: :integer },
64
+ { type: :string },
65
+ { type: :object },
66
+ { nullable: true }
67
+ ]
68
+ key :description, "This parameter type is integer with ActiveRecord, but will be string or object including $oid with Mongoid or Dynamoid ORMs."
69
+ key :nullable, true
70
+ key :example, 123
71
+ end
72
+ property :notifier_type do
73
+ key :type, :string
74
+ key :nullable, true
75
+ key :example, "User"
76
+ end
77
+ property :notifier_id do
78
+ key :oneOf, [
79
+ { type: :integer },
80
+ { type: :string },
81
+ { nullable: true }
82
+ ]
83
+ key :description, "This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
84
+ key :nullable, true
85
+ key :example, 2
86
+ end
87
+ property :parameters do
88
+ key :type, :object
89
+ key :additionalProperties, {
90
+ type: :string
91
+ }
92
+ key :example, {
93
+ test_default_param: "1"
94
+ }
95
+ end
96
+ property :opened_at do
97
+ key :type, :string
98
+ key :format, :'date-time'
99
+ key :nullable, true
100
+ end
101
+ property :created_at do
102
+ key :type, :string
103
+ key :format, :'date-time'
104
+ end
105
+ property :updated_at do
106
+ key :type, :string
107
+ key :format, :'date-time'
108
+ end
109
+ end
110
+
111
+ schema :Notification do
112
+ key :type, :object
113
+ key :required, [ :id, :target_type, :target_id, :notifiable_type, :notifiable_id, :key, :created_at, :updated_at, :target, :notifiable ]
114
+ allOf do
115
+ schema do
116
+ key :'$ref', :NotificationAttributes
117
+ end
118
+ schema do
119
+ key :type, :object
120
+ property :notifiable_path do
121
+ key :type, :string
122
+ key :format, :uri
123
+ key :example, "/articles/11"
124
+ end
125
+ property :printable_notifiable_name do
126
+ key :type, :string
127
+ key :format, :uri
128
+ key :example, "comment \"This is the first Stephen's comment to Ichiro's article.\""
129
+ end
130
+ property :group_member_notifier_count do
131
+ key :type, :integer
132
+ key :example, 1
133
+ end
134
+ property :group_notification_count do
135
+ key :type, :integer
136
+ key :example, 2
137
+ end
138
+ property :target do
139
+ key :type, :object
140
+ key :description, "Associated target model in your application"
141
+ key :example, {
142
+ id: 1,
143
+ email: "ichiro@example.com",
144
+ name: "Ichiro",
145
+ created_at: Time.current,
146
+ updated_at: Time.current,
147
+ provider: "email",
148
+ uid: "",
149
+ printable_type: "User",
150
+ printable_target_name: "Ichiro"
151
+ }
152
+ end
153
+ property :notifiable do
154
+ key :type, :object
155
+ key :description, "Associated notifiable model in your application"
156
+ key :example, {
157
+ id: 22,
158
+ user_id: 2,
159
+ article_id: 11,
160
+ body: "This is the first Stephen's comment to Ichiro's article.",
161
+ created_at: Time.current,
162
+ updated_at: Time.current,
163
+ printable_type: "Comment"
164
+ }
165
+ end
166
+ property :group do
167
+ key :type, :object
168
+ key :description, "Associated group model in your application"
169
+ key :nullable, true
170
+ key :example, {
171
+ id: 11,
172
+ user_id: 4,
173
+ title: "Ichiro's great article",
174
+ body: "This is Ichiro's great article. Please read it!",
175
+ created_at: Time.current,
176
+ updated_at: Time.current,
177
+ printable_type: "Article",
178
+ printable_group_name: "article \"Ichiro's great article\""
179
+ }
180
+ end
181
+ property :notifier do
182
+ key :type, :object
183
+ key :description, "Associated notifier model in your application"
184
+ key :nullable, true
185
+ key :example, {
186
+ id: 2,
187
+ email: "stephen@example.com",
188
+ name: "Stephen",
189
+ created_at: Time.current,
190
+ updated_at: Time.current,
191
+ provider: "email",
192
+ uid: "",
193
+ printable_type: "User",
194
+ printable_notifier_name: "Stephen"
195
+ }
196
+ end
197
+ property :group_members do
198
+ key :type, :array
199
+ items do
200
+ key :'$ref', :NotificationAttributes
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end