activity_notification 1.4.4 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (271) hide show
  1. checksums.yaml +5 -5
  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/.github/workflows/build.yml +116 -0
  6. data/.gitignore +15 -3
  7. data/CHANGELOG.md +200 -1
  8. data/Gemfile +17 -2
  9. data/Procfile +2 -0
  10. data/README.md +168 -1033
  11. data/Rakefile +19 -10
  12. data/activity_notification.gemspec +14 -9
  13. data/app/channels/activity_notification/notification_api_channel.rb +12 -0
  14. data/app/channels/activity_notification/notification_api_with_devise_channel.rb +46 -0
  15. data/app/channels/activity_notification/notification_channel.rb +37 -0
  16. data/app/channels/activity_notification/notification_with_devise_channel.rb +51 -0
  17. data/app/controllers/activity_notification/apidocs_controller.rb +75 -0
  18. data/app/controllers/activity_notification/notifications_api_controller.rb +143 -0
  19. data/app/controllers/activity_notification/notifications_api_with_devise_controller.rb +7 -0
  20. data/app/controllers/activity_notification/notifications_controller.rb +60 -54
  21. data/app/controllers/activity_notification/subscriptions_api_controller.rb +197 -0
  22. data/app/controllers/activity_notification/subscriptions_api_with_devise_controller.rb +7 -0
  23. data/app/controllers/activity_notification/subscriptions_controller.rb +83 -73
  24. data/app/jobs/activity_notification/notify_all_job.rb +25 -0
  25. data/app/jobs/activity_notification/notify_job.rb +26 -0
  26. data/app/jobs/activity_notification/notify_to_job.rb +25 -0
  27. data/app/views/activity_notification/notifications/default/_default.html.erb +23 -23
  28. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +19 -19
  29. data/app/views/activity_notification/notifications/default/_index.html.erb +3 -3
  30. data/app/views/activity_notification/notifications/default/index.html.erb +60 -7
  31. data/app/views/activity_notification/notifications/default/open.js.erb +2 -2
  32. data/app/views/activity_notification/notifications/default/open_all.js.erb +2 -2
  33. data/app/views/activity_notification/notifications/default/show.html.erb +2 -2
  34. data/app/views/activity_notification/optional_targets/default/action_cable_channel/_default.html.erb +176 -0
  35. data/app/views/activity_notification/optional_targets/default/base/_default.text.erb +1 -1
  36. data/app/views/activity_notification/optional_targets/default/slack/_default.text.erb +1 -1
  37. data/app/views/activity_notification/subscriptions/default/_form.html.erb +2 -2
  38. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +5 -33
  39. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +8 -8
  40. data/app/views/activity_notification/subscriptions/default/index.html.erb +13 -9
  41. data/app/views/activity_notification/subscriptions/default/show.html.erb +3 -3
  42. data/app/views/activity_notification/subscriptions/default/subscribe.js.erb +1 -1
  43. data/app/views/activity_notification/subscriptions/default/subscribe_to_email.js.erb +1 -1
  44. data/app/views/activity_notification/subscriptions/default/subscribe_to_optional_target.js.erb +1 -1
  45. data/app/views/activity_notification/subscriptions/default/unsubscribe.js.erb +1 -1
  46. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_email.js.erb +1 -1
  47. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_optional_target.js.erb +1 -1
  48. data/bin/_dynamodblocal +4 -0
  49. data/bin/bundle_update.sh +7 -0
  50. data/bin/deploy_on_heroku.sh +16 -0
  51. data/bin/install_dynamodblocal.sh +5 -0
  52. data/bin/start_dynamodblocal.sh +47 -0
  53. data/bin/stop_dynamodblocal.sh +34 -0
  54. data/docs/CODE_OF_CONDUCT.md +76 -0
  55. data/docs/CONTRIBUTING.md +36 -0
  56. data/docs/Functions.md +1146 -0
  57. data/docs/Setup.md +817 -0
  58. data/docs/Testing.md +148 -0
  59. data/gemfiles/Gemfile.rails-5.0 +8 -1
  60. data/gemfiles/Gemfile.rails-5.1 +7 -1
  61. data/gemfiles/Gemfile.rails-5.2 +24 -0
  62. data/gemfiles/Gemfile.rails-6.0 +23 -0
  63. data/gemfiles/Gemfile.rails-6.1 +22 -0
  64. data/gemfiles/Gemfile.rails-7.0 +25 -0
  65. data/lib/activity_notification/apis/notification_api.rb +356 -159
  66. data/lib/activity_notification/apis/subscription_api.rb +98 -59
  67. data/lib/activity_notification/apis/swagger.rb +6 -0
  68. data/lib/activity_notification/common.rb +18 -7
  69. data/lib/activity_notification/config.rb +176 -30
  70. data/lib/activity_notification/controllers/common_api_controller.rb +30 -0
  71. data/lib/activity_notification/controllers/common_controller.rb +47 -27
  72. data/lib/activity_notification/controllers/concerns/swagger/error_responses.rb +55 -0
  73. data/lib/activity_notification/controllers/concerns/swagger/notifications_api.rb +273 -0
  74. data/lib/activity_notification/controllers/concerns/swagger/notifications_parameters.rb +92 -0
  75. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_api.rb +405 -0
  76. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_parameters.rb +50 -0
  77. data/lib/activity_notification/controllers/devise_authentication_controller.rb +22 -5
  78. data/lib/activity_notification/gem_version.rb +14 -0
  79. data/lib/activity_notification/helpers/errors.rb +6 -0
  80. data/lib/activity_notification/helpers/view_helpers.rb +118 -28
  81. data/lib/activity_notification/mailers/helpers.rb +19 -12
  82. data/lib/activity_notification/models/concerns/notifiable.rb +142 -55
  83. data/lib/activity_notification/models/concerns/subscriber.rb +28 -13
  84. data/lib/activity_notification/models/concerns/swagger/error_schema.rb +36 -0
  85. data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +209 -0
  86. data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +162 -0
  87. data/lib/activity_notification/models/concerns/target.rb +131 -32
  88. data/lib/activity_notification/models/notification.rb +1 -0
  89. data/lib/activity_notification/models/subscription.rb +1 -0
  90. data/lib/activity_notification/models.rb +23 -1
  91. data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +69 -0
  92. data/lib/activity_notification/optional_targets/action_cable_channel.rb +68 -0
  93. data/lib/activity_notification/optional_targets/base.rb +9 -15
  94. data/lib/activity_notification/orm/active_record/notification.rb +23 -34
  95. data/lib/activity_notification/orm/active_record/subscription.rb +1 -1
  96. data/lib/activity_notification/orm/active_record.rb +1 -1
  97. data/lib/activity_notification/orm/dynamoid/extension.rb +262 -0
  98. data/lib/activity_notification/orm/dynamoid/notification.rb +224 -0
  99. data/lib/activity_notification/orm/dynamoid/subscription.rb +82 -0
  100. data/lib/activity_notification/orm/dynamoid.rb +530 -0
  101. data/lib/activity_notification/orm/mongoid/notification.rb +29 -28
  102. data/lib/activity_notification/orm/mongoid/subscription.rb +3 -3
  103. data/lib/activity_notification/orm/mongoid.rb +33 -1
  104. data/lib/activity_notification/rails/routes.rb +273 -60
  105. data/lib/activity_notification/renderable.rb +22 -7
  106. data/lib/activity_notification/roles/acts_as_notifiable.rb +64 -1
  107. data/lib/activity_notification/roles/acts_as_target.rb +99 -9
  108. data/lib/activity_notification/version.rb +1 -1
  109. data/lib/activity_notification.rb +14 -0
  110. data/lib/generators/activity_notification/controllers_generator.rb +2 -1
  111. data/lib/generators/templates/activity_notification.rb +61 -7
  112. data/lib/generators/templates/controllers/README +2 -2
  113. data/lib/generators/templates/controllers/notifications_api_controller.rb +31 -0
  114. data/lib/generators/templates/controllers/notifications_api_with_devise_controller.rb +31 -0
  115. data/lib/generators/templates/controllers/notifications_controller.rb +1 -37
  116. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +1 -45
  117. data/lib/generators/templates/controllers/subscriptions_api_controller.rb +61 -0
  118. data/lib/generators/templates/controllers/subscriptions_api_with_devise_controller.rb +61 -0
  119. data/lib/generators/templates/controllers/subscriptions_controller.rb +14 -37
  120. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +14 -45
  121. data/lib/generators/templates/migrations/migration.rb +5 -5
  122. data/lib/generators/templates/models/README +8 -4
  123. data/lib/generators/templates/models/notification.rb +1 -1
  124. data/lib/generators/templates/models/subscription.rb +1 -1
  125. data/lib/tasks/activity_notification_tasks.rake +14 -4
  126. data/package.json +8 -0
  127. data/spec/channels/notification_api_channel_shared_examples.rb +59 -0
  128. data/spec/channels/notification_api_channel_spec.rb +49 -0
  129. data/spec/channels/notification_api_with_devise_channel_spec.rb +76 -0
  130. data/spec/channels/notification_channel_shared_examples.rb +59 -0
  131. data/spec/channels/notification_channel_spec.rb +48 -0
  132. data/spec/channels/notification_with_devise_channel_spec.rb +97 -0
  133. data/spec/concerns/apis/notification_api_spec.rb +177 -12
  134. data/spec/concerns/apis/subscription_api_spec.rb +146 -4
  135. data/spec/concerns/common_spec.rb +25 -3
  136. data/spec/concerns/models/notifiable_spec.rb +161 -11
  137. data/spec/concerns/models/subscriber_spec.rb +253 -79
  138. data/spec/concerns/models/target_spec.rb +180 -47
  139. data/spec/concerns/renderable_spec.rb +35 -16
  140. data/spec/config_spec.rb +52 -1
  141. data/spec/controllers/controller_spec_utility.rb +100 -0
  142. data/spec/controllers/notifications_api_controller_shared_examples.rb +506 -0
  143. data/spec/controllers/notifications_api_controller_spec.rb +19 -0
  144. data/spec/controllers/notifications_api_with_devise_controller_spec.rb +60 -0
  145. data/spec/controllers/notifications_controller_shared_examples.rb +55 -76
  146. data/spec/controllers/notifications_controller_spec.rb +1 -2
  147. data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -8
  148. data/spec/controllers/subscriptions_api_controller_shared_examples.rb +750 -0
  149. data/spec/controllers/subscriptions_api_controller_spec.rb +19 -0
  150. data/spec/controllers/subscriptions_api_with_devise_controller_spec.rb +60 -0
  151. data/spec/controllers/subscriptions_controller_shared_examples.rb +99 -121
  152. data/spec/controllers/subscriptions_controller_spec.rb +1 -2
  153. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +14 -8
  154. data/spec/factories/notifications.rb +1 -1
  155. data/spec/factories/subscriptions.rb +3 -3
  156. data/spec/factories/users.rb +3 -3
  157. data/spec/generators/migration/migration_generator_spec.rb +29 -4
  158. data/spec/helpers/view_helpers_spec.rb +31 -21
  159. data/spec/jobs/notify_all_job_spec.rb +23 -0
  160. data/spec/jobs/notify_job_spec.rb +23 -0
  161. data/spec/jobs/notify_to_job_spec.rb +23 -0
  162. data/spec/mailers/mailer_spec.rb +42 -1
  163. data/spec/models/dummy/dummy_group_spec.rb +4 -0
  164. data/spec/models/dummy/dummy_notifiable_spec.rb +4 -0
  165. data/spec/models/dummy/dummy_notifier_spec.rb +4 -0
  166. data/spec/models/dummy/dummy_subscriber_spec.rb +3 -0
  167. data/spec/models/dummy/dummy_target_spec.rb +4 -0
  168. data/spec/models/notification_spec.rb +181 -45
  169. data/spec/models/subscription_spec.rb +77 -27
  170. data/spec/optional_targets/action_cable_api_channel_spec.rb +34 -0
  171. data/spec/optional_targets/action_cable_channel_spec.rb +41 -0
  172. data/spec/optional_targets/amazon_sns_spec.rb +0 -2
  173. data/spec/optional_targets/slack_spec.rb +0 -2
  174. data/spec/orm/dynamoid_spec.rb +115 -0
  175. data/spec/rails_app/Rakefile +9 -0
  176. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  177. data/spec/rails_app/app/assets/javascripts/application.js +2 -1
  178. data/spec/rails_app/app/assets/javascripts/cable.js +12 -0
  179. data/spec/rails_app/app/controllers/admins_controller.rb +21 -0
  180. data/spec/rails_app/app/controllers/application_controller.rb +1 -1
  181. data/spec/rails_app/app/controllers/articles_controller.rb +6 -1
  182. data/spec/rails_app/app/controllers/comments_controller.rb +3 -1
  183. data/spec/rails_app/app/controllers/spa_controller.rb +7 -0
  184. data/spec/rails_app/app/controllers/users/notifications_controller.rb +0 -65
  185. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +0 -73
  186. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +0 -77
  187. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +0 -85
  188. data/spec/rails_app/app/controllers/users_controller.rb +26 -0
  189. data/spec/rails_app/app/javascript/App.vue +40 -0
  190. data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +82 -0
  191. data/spec/rails_app/app/javascript/components/Top.vue +98 -0
  192. data/spec/rails_app/app/javascript/components/notifications/Index.vue +200 -0
  193. data/spec/rails_app/app/javascript/components/notifications/Notification.vue +133 -0
  194. data/spec/rails_app/app/javascript/components/notifications/NotificationContent.vue +122 -0
  195. data/spec/rails_app/app/javascript/components/subscriptions/Index.vue +279 -0
  196. data/spec/rails_app/app/javascript/components/subscriptions/NewSubscription.vue +112 -0
  197. data/spec/rails_app/app/javascript/components/subscriptions/NotificationKey.vue +141 -0
  198. data/spec/rails_app/app/javascript/components/subscriptions/Subscription.vue +226 -0
  199. data/spec/rails_app/app/javascript/config/development.js +5 -0
  200. data/spec/rails_app/app/javascript/config/environment.js +7 -0
  201. data/spec/rails_app/app/javascript/config/production.js +5 -0
  202. data/spec/rails_app/app/javascript/config/test.js +5 -0
  203. data/spec/rails_app/app/javascript/packs/application.js +18 -0
  204. data/spec/rails_app/app/javascript/packs/spa.js +14 -0
  205. data/spec/rails_app/app/javascript/router/index.js +73 -0
  206. data/spec/rails_app/app/javascript/store/index.js +37 -0
  207. data/spec/rails_app/app/models/admin.rb +15 -10
  208. data/spec/rails_app/app/models/article.rb +25 -20
  209. data/spec/rails_app/app/models/comment.rb +27 -62
  210. data/spec/rails_app/app/models/dummy/dummy_base.rb +1 -0
  211. data/spec/rails_app/app/models/dummy/dummy_group.rb +9 -0
  212. data/spec/rails_app/app/models/dummy/dummy_notifiable.rb +1 -0
  213. data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +27 -0
  214. data/spec/rails_app/app/models/dummy/dummy_notifier.rb +1 -0
  215. data/spec/rails_app/app/models/dummy/dummy_subscriber.rb +1 -0
  216. data/spec/rails_app/app/models/dummy/dummy_target.rb +1 -0
  217. data/spec/rails_app/app/models/user.rb +44 -18
  218. data/spec/rails_app/app/views/activity_notification/notifications/default/article/_update.html.erb +146 -0
  219. data/spec/rails_app/app/views/activity_notification/notifications/users/overridden/custom/_test.html.erb +1 -0
  220. data/spec/rails_app/app/views/activity_notification/optional_targets/admins/amazon_sns/comment/_default.text.erb +1 -1
  221. data/spec/rails_app/app/views/articles/index.html.erb +68 -20
  222. data/spec/rails_app/app/views/articles/show.html.erb +1 -1
  223. data/spec/rails_app/app/views/layouts/_header.html.erb +9 -3
  224. data/spec/rails_app/app/views/spa/index.html.erb +2 -0
  225. data/spec/rails_app/babel.config.js +72 -0
  226. data/spec/rails_app/bin/webpack +18 -0
  227. data/spec/rails_app/bin/webpack-dev-server +18 -0
  228. data/spec/rails_app/config/application.rb +26 -6
  229. data/spec/rails_app/config/cable.yml +8 -0
  230. data/spec/rails_app/config/database.yml +1 -1
  231. data/spec/rails_app/config/dynamoid.rb +13 -0
  232. data/spec/rails_app/config/environment.rb +5 -1
  233. data/spec/rails_app/config/environments/development.rb +5 -0
  234. data/spec/rails_app/config/environments/production.rb +7 -1
  235. data/spec/rails_app/config/environments/test.rb +7 -11
  236. data/spec/rails_app/config/initializers/activity_notification.rb +63 -9
  237. data/spec/rails_app/config/initializers/copy_it.aws.rb.template +6 -0
  238. data/spec/rails_app/config/initializers/devise_token_auth.rb +55 -0
  239. data/spec/rails_app/config/initializers/mysql.rb +9 -0
  240. data/spec/rails_app/config/locales/activity_notification.en.yml +10 -4
  241. data/spec/rails_app/config/routes.rb +42 -1
  242. data/spec/rails_app/config/webpack/development.js +5 -0
  243. data/spec/rails_app/config/webpack/environment.js +7 -0
  244. data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
  245. data/spec/rails_app/config/webpack/production.js +5 -0
  246. data/spec/rails_app/config/webpack/test.js +5 -0
  247. data/spec/rails_app/config/webpacker.yml +97 -0
  248. data/spec/rails_app/db/migrate/{20160715050433_create_test_tables.rb → 20160716000000_create_test_tables.rb} +1 -1
  249. data/spec/rails_app/db/migrate/{20160715050420_create_activity_notification_tables.rb → 20181209000000_create_activity_notification_tables.rb} +3 -3
  250. data/spec/rails_app/db/migrate/20191201000000_add_tokens_to_users.rb +10 -0
  251. data/spec/rails_app/db/schema.rb +46 -43
  252. data/spec/rails_app/db/seeds.rb +28 -4
  253. data/spec/rails_app/lib/custom_optional_targets/raise_error.rb +14 -0
  254. data/spec/rails_app/lib/mailer_previews/mailer_preview.rb +14 -4
  255. data/spec/rails_app/package.json +23 -0
  256. data/spec/rails_app/postcss.config.js +12 -0
  257. data/spec/roles/acts_as_group_spec.rb +0 -2
  258. data/spec/roles/acts_as_notifiable_spec.rb +80 -20
  259. data/spec/roles/acts_as_notifier_spec.rb +0 -2
  260. data/spec/roles/acts_as_target_spec.rb +1 -5
  261. data/spec/spec_helper.rb +13 -11
  262. data/spec/version_spec.rb +31 -0
  263. metadata +306 -53
  264. data/.travis.yml +0 -85
  265. data/Gemfile.lock +0 -234
  266. data/gemfiles/Gemfile.rails-4.2 +0 -17
  267. data/gemfiles/Gemfile.rails-4.2.lock +0 -225
  268. data/gemfiles/Gemfile.rails-5.0.lock +0 -234
  269. data/gemfiles/Gemfile.rails-5.1.lock +0 -234
  270. data/spec/rails_app/app/views/activity_notification/notifications/users/overriden/custom/_test.html.erb +0 -1
  271. /data/spec/rails_app/app/{models → assets/images}/.keep +0 -0
@@ -13,12 +13,14 @@ 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
19
21
  notifications.render self, options
20
22
  elsif notifications.respond_to?(:map)
21
- return nil if notifications.empty?
23
+ return nil if (notifications.respond_to?(:empty?) ? notifications.empty? : notifications.to_a.empty?)
22
24
  notifications.map {|notification| notification.render self, options.dup }.join.html_safe
23
25
  end
24
26
  end
@@ -40,6 +42,8 @@ module ActivityNotification
40
42
  # @option options [String] :notification_layout (nil) Layout template name of the notification index content
41
43
  # @option options [String] :fallback (nil) Fallback template to use when MissingTemplate is raised. Set :text to use i18n text as fallback.
42
44
  # @option options [String] :partial ('index') Partial template name of the partial index
45
+ # @option options [String] :routing_scope (nil) Routing scope for notification and subscription routes
46
+ # @option options [Boolean] :devise_default_routes (false) If links in default views will be handles as devise default routes
43
47
  # @option options [String] :layout (nil) Layout template name of the partial index
44
48
  # @option options [Integer] :limit (nil) Limit to query for notifications
45
49
  # @option options [Boolean] :reverse (false) If notification index will be ordered as earliest first
@@ -49,9 +53,11 @@ module ActivityNotification
49
53
  # @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
50
54
  # @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
51
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
52
58
  # @option options [Array] :custom_filter (nil) Custom notification filter (e.g. ["created_at >= ?", time.hour.ago])
53
59
  # @return [String] Rendered view or text as string
54
- def render_notification_of target, options = {}
60
+ def render_notification_of(target, options = {})
55
61
  return unless target.is_a? ActivityNotification::Target
56
62
 
57
63
  # Prepare content for notifications index
@@ -77,7 +83,10 @@ module ActivityNotification
77
83
  # @todo Needs any other better implementation
78
84
  # @todo Must handle devise namespace
79
85
  def notifications_path_for(target, params = {})
80
- send("#{target.to_resource_name}_notifications_path", target, params)
86
+ options = params.dup
87
+ options.delete(:devise_default_routes) ?
88
+ send("#{routing_scope(options)}notifications_path", options) :
89
+ send("#{routing_scope(options)}#{target.to_resource_name}_notifications_path", target, options)
81
90
  end
82
91
 
83
92
  # Returns notification_path for the notification
@@ -88,7 +97,10 @@ module ActivityNotification
88
97
  # @todo Needs any other better implementation
89
98
  # @todo Must handle devise namespace
90
99
  def notification_path_for(notification, params = {})
91
- send("#{notification.target.to_resource_name}_notification_path", notification.target, notification, params)
100
+ options = params.dup
101
+ options.delete(:devise_default_routes) ?
102
+ send("#{routing_scope(options)}notification_path", notification, options) :
103
+ send("#{routing_scope(options)}#{notification.target.to_resource_name}_notification_path", notification.target, notification, options)
92
104
  end
93
105
 
94
106
  # Returns move_notification_path for the target of specified notification
@@ -99,7 +111,10 @@ module ActivityNotification
99
111
  # @todo Needs any other better implementation
100
112
  # @todo Must handle devise namespace
101
113
  def move_notification_path_for(notification, params = {})
102
- send("move_#{notification.target.to_resource_name}_notification_path", notification.target, notification, params)
114
+ options = params.dup
115
+ options.delete(:devise_default_routes) ?
116
+ send("move_#{routing_scope(options)}notification_path", notification, options) :
117
+ send("move_#{routing_scope(options)}#{notification.target.to_resource_name}_notification_path", notification.target, notification, options)
103
118
  end
104
119
 
105
120
  # Returns open_notification_path for the target of specified notification
@@ -110,7 +125,10 @@ module ActivityNotification
110
125
  # @todo Needs any other better implementation
111
126
  # @todo Must handle devise namespace
112
127
  def open_notification_path_for(notification, params = {})
113
- send("open_#{notification.target.to_resource_name}_notification_path", notification.target, notification, params)
128
+ options = params.dup
129
+ options.delete(:devise_default_routes) ?
130
+ send("open_#{routing_scope(options)}notification_path", notification, options) :
131
+ send("open_#{routing_scope(options)}#{notification.target.to_resource_name}_notification_path", notification.target, notification, options)
114
132
  end
115
133
 
116
134
  # Returns open_all_notifications_path for the target
@@ -121,7 +139,10 @@ module ActivityNotification
121
139
  # @todo Needs any other better implementation
122
140
  # @todo Must handle devise namespace
123
141
  def open_all_notifications_path_for(target, params = {})
124
- send("open_all_#{target.to_resource_name}_notifications_path", target, params)
142
+ options = params.dup
143
+ options.delete(:devise_default_routes) ?
144
+ send("open_all_#{routing_scope(options)}notifications_path", options) :
145
+ send("open_all_#{routing_scope(options)}#{target.to_resource_name}_notifications_path", target, options)
125
146
  end
126
147
 
127
148
  # Returns notifications_url for the target
@@ -132,7 +153,10 @@ module ActivityNotification
132
153
  # @todo Needs any other better implementation
133
154
  # @todo Must handle devise namespace
134
155
  def notifications_url_for(target, params = {})
135
- send("#{target.to_resource_name}_notifications_url", target, params)
156
+ options = params.dup
157
+ options.delete(:devise_default_routes) ?
158
+ send("#{routing_scope(options)}notifications_url", options) :
159
+ send("#{routing_scope(options)}#{target.to_resource_name}_notifications_url", target, options)
136
160
  end
137
161
 
138
162
  # Returns notification_url for the target of specified notification
@@ -143,7 +167,10 @@ module ActivityNotification
143
167
  # @todo Needs any other better implementation
144
168
  # @todo Must handle devise namespace
145
169
  def notification_url_for(notification, params = {})
146
- send("#{notification.target.to_resource_name}_notification_url", notification.target, notification, params)
170
+ options = params.dup
171
+ options.delete(:devise_default_routes) ?
172
+ send("#{routing_scope(options)}notification_url", notification, options) :
173
+ send("#{routing_scope(options)}#{notification.target.to_resource_name}_notification_url", notification.target, notification, options)
147
174
  end
148
175
 
149
176
  # Returns move_notification_url for the target of specified notification
@@ -154,7 +181,10 @@ module ActivityNotification
154
181
  # @todo Needs any other better implementation
155
182
  # @todo Must handle devise namespace
156
183
  def move_notification_url_for(notification, params = {})
157
- send("move_#{notification.target.to_resource_name}_notification_url", notification.target, notification, params)
184
+ options = params.dup
185
+ options.delete(:devise_default_routes) ?
186
+ send("move_#{routing_scope(options)}notification_url", notification, options) :
187
+ send("move_#{routing_scope(options)}#{notification.target.to_resource_name}_notification_url", notification.target, notification, options)
158
188
  end
159
189
 
160
190
  # Returns open_notification_url for the target of specified notification
@@ -165,7 +195,10 @@ module ActivityNotification
165
195
  # @todo Needs any other better implementation
166
196
  # @todo Must handle devise namespace
167
197
  def open_notification_url_for(notification, params = {})
168
- send("open_#{notification.target.to_resource_name}_notification_url", notification.target, notification, params)
198
+ options = params.dup
199
+ options.delete(:devise_default_routes) ?
200
+ send("open_#{routing_scope(options)}notification_url", notification, options) :
201
+ send("open_#{routing_scope(options)}#{notification.target.to_resource_name}_notification_url", notification.target, notification, options)
169
202
  end
170
203
 
171
204
  # Returns open_all_notifications_url for the target of specified notification
@@ -176,7 +209,10 @@ module ActivityNotification
176
209
  # @todo Needs any other better implementation
177
210
  # @todo Must handle devise namespace
178
211
  def open_all_notifications_url_for(target, params = {})
179
- send("open_all_#{target.to_resource_name}_notifications_url", target, params)
212
+ options = params.dup
213
+ options.delete(:devise_default_routes) ?
214
+ send("open_all_#{routing_scope(options)}notifications_url", options) :
215
+ send("open_all_#{routing_scope(options)}#{target.to_resource_name}_notifications_url", target, options)
180
216
  end
181
217
 
182
218
  # Returns subscriptions_path for the target
@@ -186,7 +222,10 @@ module ActivityNotification
186
222
  # @return [String] subscriptions_path for the target
187
223
  # @todo Needs any other better implementation
188
224
  def subscriptions_path_for(target, params = {})
189
- send("#{target.to_resource_name}_subscriptions_path", target, params)
225
+ options = params.dup
226
+ options.delete(:devise_default_routes) ?
227
+ send("#{routing_scope(options)}subscriptions_path", options) :
228
+ send("#{routing_scope(options)}#{target.to_resource_name}_subscriptions_path", target, options)
190
229
  end
191
230
 
192
231
  # Returns subscription_path for the subscription
@@ -196,7 +235,10 @@ module ActivityNotification
196
235
  # @return [String] subscription_path for the subscription
197
236
  # @todo Needs any other better implementation
198
237
  def subscription_path_for(subscription, params = {})
199
- send("#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
238
+ options = params.dup
239
+ options.delete(:devise_default_routes) ?
240
+ send("#{routing_scope(options)}subscription_path", subscription, options) :
241
+ send("#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
200
242
  end
201
243
 
202
244
  # Returns subscribe_subscription_path for the target of specified subscription
@@ -206,7 +248,10 @@ module ActivityNotification
206
248
  # @return [String] subscription_path for the subscription
207
249
  # @todo Needs any other better implementation
208
250
  def subscribe_subscription_path_for(subscription, params = {})
209
- send("subscribe_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
251
+ options = params.dup
252
+ options.delete(:devise_default_routes) ?
253
+ send("subscribe_#{routing_scope(options)}subscription_path", subscription, options) :
254
+ send("subscribe_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
210
255
  end
211
256
  alias_method :subscribe_path_for, :subscribe_subscription_path_for
212
257
 
@@ -217,7 +262,10 @@ module ActivityNotification
217
262
  # @return [String] subscription_path for the subscription
218
263
  # @todo Needs any other better implementation
219
264
  def unsubscribe_subscription_path_for(subscription, params = {})
220
- send("unsubscribe_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
265
+ options = params.dup
266
+ options.delete(:devise_default_routes) ?
267
+ send("unsubscribe_#{routing_scope(options)}subscription_path", subscription, options) :
268
+ send("unsubscribe_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
221
269
  end
222
270
  alias_method :unsubscribe_path_for, :unsubscribe_subscription_path_for
223
271
 
@@ -228,7 +276,10 @@ module ActivityNotification
228
276
  # @return [String] subscription_path for the subscription
229
277
  # @todo Needs any other better implementation
230
278
  def subscribe_to_email_subscription_path_for(subscription, params = {})
231
- send("subscribe_to_email_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
279
+ options = params.dup
280
+ options.delete(:devise_default_routes) ?
281
+ send("subscribe_to_email_#{routing_scope(options)}subscription_path", subscription, options) :
282
+ send("subscribe_to_email_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
232
283
  end
233
284
  alias_method :subscribe_to_email_path_for, :subscribe_to_email_subscription_path_for
234
285
 
@@ -239,7 +290,10 @@ module ActivityNotification
239
290
  # @return [String] subscription_path for the subscription
240
291
  # @todo Needs any other better implementation
241
292
  def unsubscribe_to_email_subscription_path_for(subscription, params = {})
242
- send("unsubscribe_to_email_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
293
+ options = params.dup
294
+ options.delete(:devise_default_routes) ?
295
+ send("unsubscribe_to_email_#{routing_scope(options)}subscription_path", subscription, options) :
296
+ send("unsubscribe_to_email_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
243
297
  end
244
298
  alias_method :unsubscribe_to_email_path_for, :unsubscribe_to_email_subscription_path_for
245
299
 
@@ -250,7 +304,10 @@ module ActivityNotification
250
304
  # @return [String] subscription_path for the subscription
251
305
  # @todo Needs any other better implementation
252
306
  def subscribe_to_optional_target_subscription_path_for(subscription, params = {})
253
- send("subscribe_to_optional_target_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
307
+ options = params.dup
308
+ options.delete(:devise_default_routes) ?
309
+ send("subscribe_to_optional_target_#{routing_scope(options)}subscription_path", subscription, options) :
310
+ send("subscribe_to_optional_target_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
254
311
  end
255
312
  alias_method :subscribe_to_optional_target_path_for, :subscribe_to_optional_target_subscription_path_for
256
313
 
@@ -261,7 +318,10 @@ module ActivityNotification
261
318
  # @return [String] subscription_path for the subscription
262
319
  # @todo Needs any other better implementation
263
320
  def unsubscribe_to_optional_target_subscription_path_for(subscription, params = {})
264
- send("unsubscribe_to_optional_target_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
321
+ options = params.dup
322
+ options.delete(:devise_default_routes) ?
323
+ send("unsubscribe_to_optional_target_#{routing_scope(options)}subscription_path", subscription, options) :
324
+ send("unsubscribe_to_optional_target_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, options)
265
325
  end
266
326
  alias_method :unsubscribe_to_optional_target_path_for, :unsubscribe_to_optional_target_subscription_path_for
267
327
 
@@ -272,7 +332,10 @@ module ActivityNotification
272
332
  # @return [String] subscriptions_url for the target
273
333
  # @todo Needs any other better implementation
274
334
  def subscriptions_url_for(target, params = {})
275
- send("#{target.to_resource_name}_subscriptions_url", target, params)
335
+ options = params.dup
336
+ options.delete(:devise_default_routes) ?
337
+ send("#{routing_scope(options)}subscriptions_url", options) :
338
+ send("#{routing_scope(options)}#{target.to_resource_name}_subscriptions_url", target, options)
276
339
  end
277
340
 
278
341
  # Returns subscription_url for the subscription
@@ -282,7 +345,10 @@ module ActivityNotification
282
345
  # @return [String] subscription_url for the subscription
283
346
  # @todo Needs any other better implementation
284
347
  def subscription_url_for(subscription, params = {})
285
- send("#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
348
+ options = params.dup
349
+ options.delete(:devise_default_routes) ?
350
+ send("#{routing_scope(options)}subscription_url", subscription, options) :
351
+ send("#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
286
352
  end
287
353
 
288
354
  # Returns subscribe_subscription_url for the target of specified subscription
@@ -292,7 +358,10 @@ module ActivityNotification
292
358
  # @return [String] subscription_url for the subscription
293
359
  # @todo Needs any other better implementation
294
360
  def subscribe_subscription_url_for(subscription, params = {})
295
- send("subscribe_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
361
+ options = params.dup
362
+ options.delete(:devise_default_routes) ?
363
+ send("subscribe_#{routing_scope(options)}subscription_url", subscription, options) :
364
+ send("subscribe_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
296
365
  end
297
366
  alias_method :subscribe_url_for, :subscribe_subscription_url_for
298
367
 
@@ -303,7 +372,10 @@ module ActivityNotification
303
372
  # @return [String] subscription_url for the subscription
304
373
  # @todo Needs any other better implementation
305
374
  def unsubscribe_subscription_url_for(subscription, params = {})
306
- send("unsubscribe_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
375
+ options = params.dup
376
+ options.delete(:devise_default_routes) ?
377
+ send("unsubscribe_#{routing_scope(options)}subscription_url", subscription, options) :
378
+ send("unsubscribe_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
307
379
  end
308
380
  alias_method :unsubscribe_url_for, :unsubscribe_subscription_url_for
309
381
 
@@ -314,7 +386,10 @@ module ActivityNotification
314
386
  # @return [String] subscription_url for the subscription
315
387
  # @todo Needs any other better implementation
316
388
  def subscribe_to_email_subscription_url_for(subscription, params = {})
317
- send("subscribe_to_email_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
389
+ options = params.dup
390
+ options.delete(:devise_default_routes) ?
391
+ send("subscribe_to_email_#{routing_scope(options)}subscription_url", subscription, options) :
392
+ send("subscribe_to_email_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
318
393
  end
319
394
  alias_method :subscribe_to_email_url_for, :subscribe_to_email_subscription_url_for
320
395
 
@@ -325,7 +400,10 @@ module ActivityNotification
325
400
  # @return [String] subscription_url for the subscription
326
401
  # @todo Needs any other better implementation
327
402
  def unsubscribe_to_email_subscription_url_for(subscription, params = {})
328
- send("unsubscribe_to_email_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
403
+ options = params.dup
404
+ options.delete(:devise_default_routes) ?
405
+ send("unsubscribe_to_email_#{routing_scope(options)}subscription_url", subscription, options) :
406
+ send("unsubscribe_to_email_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
329
407
  end
330
408
  alias_method :unsubscribe_to_email_url_for, :unsubscribe_to_email_subscription_url_for
331
409
 
@@ -336,7 +414,10 @@ module ActivityNotification
336
414
  # @return [String] subscription_url for the subscription
337
415
  # @todo Needs any other better implementation
338
416
  def subscribe_to_optional_target_subscription_url_for(subscription, params = {})
339
- send("subscribe_to_optional_target_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
417
+ options = params.dup
418
+ options.delete(:devise_default_routes) ?
419
+ send("subscribe_to_optional_target_#{routing_scope(options)}subscription_url", subscription, options) :
420
+ send("subscribe_to_optional_target_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
340
421
  end
341
422
  alias_method :subscribe_to_optional_target_url_for, :subscribe_to_optional_target_subscription_url_for
342
423
 
@@ -347,7 +428,10 @@ module ActivityNotification
347
428
  # @return [String] subscription_url for the subscription
348
429
  # @todo Needs any other better implementation
349
430
  def unsubscribe_to_optional_target_subscription_url_for(subscription, params = {})
350
- send("unsubscribe_to_optional_target_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
431
+ options = params.dup
432
+ options.delete(:devise_default_routes) ?
433
+ send("unsubscribe_to_optional_target_#{routing_scope(options)}subscription_url", subscription, options) :
434
+ send("unsubscribe_to_optional_target_#{routing_scope(options)}#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, options)
351
435
  end
352
436
  alias_method :unsubscribe_to_optional_target_url_for, :unsubscribe_to_optional_target_subscription_url_for
353
437
 
@@ -441,6 +525,12 @@ module ActivityNotification
441
525
  [root, path].map(&:to_s).join('/')
442
526
  end
443
527
 
528
+ # Prepare routing scope from options
529
+ # @api private
530
+ def routing_scope(options = {})
531
+ options[:routing_scope] ? options.delete(:routing_scope).to_s + '_' : ''
532
+ end
533
+
444
534
  end
445
535
 
446
536
  ActionView::Base.class_eval { include ViewHelpers }
@@ -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
@@ -120,8 +127,8 @@ module ActivityNotification
120
127
  #
121
128
  # @return [Array<String>] Template paths to find email view
122
129
  def template_paths
123
- paths = ['activity_notification/mailer/default']
124
- paths.unshift("activity_notification/mailer/#{@target.to_resources_name}") if @target.present?
130
+ paths = ["#{ActivityNotification.config.mailer_templates_dir}/default"]
131
+ paths.unshift("#{ActivityNotification.config.mailer_templates_dir}/#{@target.to_resources_name}") if @target.present?
125
132
  paths
126
133
  end
127
134