activity_notification 1.4.4 → 2.2.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 (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
@@ -23,9 +23,28 @@ module ActionDispatch::Routing
23
23
  # { controller:"activity_notification/notifications", action:"open_all", target_type:"users" }
24
24
  # move_user_notification GET /users/:user_id/notifications/:id/move(.:format)
25
25
  # { controller:"activity_notification/notifications", action:"move", target_type:"users" }
26
- # open_user_notification POST /users/:user_id/notifications/:id/open(.:format)
26
+ # open_user_notification PUT /users/:user_id/notifications/:id/open(.:format)
27
27
  # { controller:"activity_notification/notifications", action:"open", target_type:"users" }
28
28
  #
29
+ # You can also configure notification routes with scope like this:
30
+ # scope :myscope, as: :myscope do
31
+ # notify_to :users, routing_scope: :myscope
32
+ # end
33
+ # This routing_scope option creates the needed routes with specified scope like this:
34
+ # # Notification routes
35
+ # myscope_user_notifications GET /myscope/users/:user_id/notifications(.:format)
36
+ # { controller:"activity_notification/notifications", action:"index", target_type:"users", routing_scope: :myscope }
37
+ # myscope_user_notification GET /myscope/users/:user_id/notifications/:id(.:format)
38
+ # { controller:"activity_notification/notifications", action:"show", target_type:"users", routing_scope: :myscope }
39
+ # myscope_user_notification DELETE /myscope/users/:user_id/notifications/:id(.:format)
40
+ # { controller:"activity_notification/notifications", action:"destroy", target_type:"users", routing_scope: :myscope }
41
+ # open_all_myscope_user_notifications POST /myscope/users/:user_id/notifications/open_all(.:format)
42
+ # { controller:"activity_notification/notifications", action:"open_all", target_type:"users", routing_scope: :myscope }
43
+ # move_myscope_user_notification GET /myscope/users/:user_id/notifications/:id/move(.:format)
44
+ # { controller:"activity_notification/notifications", action:"move", target_type:"users", routing_scope: :myscope }
45
+ # open_myscope_user_notification PUT /myscope/users/:user_id/notifications/:id/open(.:format)
46
+ # { controller:"activity_notification/notifications", action:"open", target_type:"users", routing_scope: :myscope }
47
+ #
29
48
  # When you use devise authentication and you want make notification targets assciated with devise,
30
49
  # you can create as follows in your routes:
31
50
  # notify_to :users, with_devise: :users
@@ -41,9 +60,48 @@ module ActionDispatch::Routing
41
60
  # { controller:"activity_notification/notifications_with_devise", action:"open_all", target_type:"users", devise_type:"users" }
42
61
  # move_user_notification GET /users/:user_id/notifications/:id/move(.:format)
43
62
  # { controller:"activity_notification/notifications_with_devise", action:"move", target_type:"users", devise_type:"users" }
44
- # open_user_notification POST /users/:user_id/notifications/:id/open(.:format)
63
+ # open_user_notification PUT /users/:user_id/notifications/:id/open(.:format)
64
+ # { controller:"activity_notification/notifications_with_devise", action:"open", target_type:"users", devise_type:"users" }
65
+ #
66
+ # When you use with_devise option and you want to make simple default routes as follows, you can use devise_default_routes option:
67
+ # notify_to :users, with_devise: :users, devise_default_routes: true
68
+ # These with_devise and devise_default_routes options create the needed routes assciated with authenticated devise resource as the default target
69
+ # # Notification with default devise routes
70
+ # user_notifications GET /notifications(.:format)
71
+ # { controller:"activity_notification/notifications_with_devise", action:"index", target_type:"users", devise_type:"users" }
72
+ # user_notification GET /notifications/:id(.:format)
73
+ # { controller:"activity_notification/notifications_with_devise", action:"show", target_type:"users", devise_type:"users" }
74
+ # user_notification DELETE /notifications/:id(.:format)
75
+ # { controller:"activity_notification/notifications_with_devise", action:"destroy", target_type:"users", devise_type:"users" }
76
+ # open_all_user_notifications POST /notifications/open_all(.:format)
77
+ # { controller:"activity_notification/notifications_with_devise", action:"open_all", target_type:"users", devise_type:"users" }
78
+ # move_user_notification GET /notifications/:id/move(.:format)
79
+ # { controller:"activity_notification/notifications_with_devise", action:"move", target_type:"users", devise_type:"users" }
80
+ # open_user_notification PUT /notifications/:id/open(.:format)
45
81
  # { controller:"activity_notification/notifications_with_devise", action:"open", target_type:"users", devise_type:"users" }
46
82
  #
83
+ # When you use activity_notification controllers as REST API mode,
84
+ # you can create as follows in your routes:
85
+ # scope :api do
86
+ # scope :"v2" do
87
+ # notify_to :users, api_mode: true
88
+ # end
89
+ # end
90
+ # This api_mode option creates the needed routes as REST API:
91
+ # # Notification as API mode routes
92
+ # GET /api/v2/users/:user_id/notifications(.:format)
93
+ # { controller:"activity_notification/notifications_api", action:"index", target_type:"users" }
94
+ # GET /api/v2/users/:user_id/notifications/:id(.:format)
95
+ # { controller:"activity_notification/notifications_api", action:"show", target_type:"users" }
96
+ # DELETE /api/v2/users/:user_id/notifications/:id(.:format)
97
+ # { controller:"activity_notification/notifications_api", action:"destroy", target_type:"users" }
98
+ # POST /api/v2/users/:user_id/notifications/open_all(.:format)
99
+ # { controller:"activity_notification/notifications_api", action:"open_all", target_type:"users" }
100
+ # GET /api/v2/users/:user_id/notifications/:id/move(.:format)
101
+ # { controller:"activity_notification/notifications_api", action:"move", target_type:"users" }
102
+ # PUT /api/v2/users/:user_id/notifications/:id/open(.:format)
103
+ # { controller:"activity_notification/notifications_api", action:"open", target_type:"users" }
104
+ #
47
105
  # When you would like to define subscription management paths with notification paths,
48
106
  # you can create as follows in your routes:
49
107
  # notify_to :users, with_subscription: true
@@ -60,32 +118,43 @@ module ActionDispatch::Routing
60
118
  # notify_to :users, with_devise: :users
61
119
  # @example Define notification paths including subscription paths
62
120
  # notify_to :users, with_subscription: true
121
+ # @example Integrated with Devise authentication as simple default routes including subscription management
122
+ # notify_to :users, with_devise: :users, devise_default_routes: true, with_subscription: true
123
+ # @example Integrated with Devise authentication as simple default routes with scope including subscription management
124
+ # scope :myscope, as: :myscope do
125
+ # notify_to :myscope, with_devise: :users, devise_default_routes: true, with_subscription: true, routing_scope: :myscope
126
+ # end
127
+ # @example Define notification paths as API mode including subscription paths
128
+ # scope :api do
129
+ # scope :"v2" do
130
+ # notify_to :users, api_mode: true, with_subscription: true
131
+ # end
132
+ # end
63
133
  #
64
134
  # @overload notify_to(*resources, *options)
65
135
  # @param [Symbol] resources Resources to notify
66
- # @option options [Symbol] :with_devise (false) Devise resources name for devise integration. Devise integration will be enabled by this option.
67
- # @option options [Hash|Boolean] :with_subscription (false) Subscription path options to define subscription management paths with notification paths. Calls subscribed_by routing when truthy value is passed as this option.
68
- # @option options [String] :model (:notifications) Model name of notifications
69
- # @option options [String] :controller ("activity_notification/notifications" | activity_notification/notifications_with_devise") :controller option as resources routing
70
- # @option options [Symbol] :as (nil) :as option as resources routing
71
- # @option options [Array] :only (nil) :only option as resources routing
72
- # @option options [Array] :except (nil) :except option as resources routing
136
+ # @option options [String] :routing_scope (nil) Routing scope for notification routes
137
+ # @option options [Symbol] :with_devise (false) Devise resources name for devise integration. Devise integration will be enabled by this option.
138
+ # @option options [Boolean] :devise_default_routes (false) Whether you will create routes as device default routes assciated with authenticated devise resource as the default target
139
+ # @option options [Boolean] :api_mode (false) Whether you will use activity_notification controllers as REST API mode
140
+ # @option options [Hash|Boolean] :with_subscription (false) Subscription path options to define subscription management paths with notification paths. Calls subscribed_by routing when truthy value is passed as this option.
141
+ # @option options [String] :model (:notifications) Model name of notifications
142
+ # @option options [String] :controller ("activity_notification/notifications" | activity_notification/notifications_with_devise") :controller option as resources routing
143
+ # @option options [Symbol] :as (nil) :as option as resources routing
144
+ # @option options [Array] :only (nil) :only option as resources routing
145
+ # @option options [Array] :except (nil) :except option as resources routing
73
146
  # @return [ActionDispatch::Routing::Mapper] Routing mapper instance
74
147
  def notify_to(*resources)
75
148
  options = create_options(:notifications, resources.extract_options!, [:new, :create, :edit, :update])
76
149
 
77
150
  resources.each do |target|
78
- self.resources target, only: :none do
79
- options[:defaults] = { target_type: target.to_s }.merge(options[:devise_defaults])
80
- resources_options = options.select { |key, _| [:with_devise, :with_subscription, :subscription_option, :model, :devise_defaults].exclude? key }
81
- self.resources options[:model], resources_options do
82
- collection do
83
- post :open_all unless ignore_path?(:open_all, options)
84
- end
85
- member do
86
- get :move unless ignore_path?(:move, options)
87
- post :open unless ignore_path?(:open, options)
88
- end
151
+ options[:defaults] = { target_type: target.to_s }.merge(options[:devise_defaults])
152
+ resources_options = options.select { |key, _| [:api_mode, :with_devise, :devise_default_routes, :with_subscription, :subscription_option, :model, :devise_defaults].exclude? key }
153
+ if options[:with_devise].present? && options[:devise_default_routes].present?
154
+ create_notification_routes options, resources_options
155
+ else
156
+ self.resources target, only: :none do
157
+ create_notification_routes options, resources_options
89
158
  end
90
159
  end
91
160
 
@@ -106,83 +175,181 @@ module ActionDispatch::Routing
106
175
  # # Subscription routes
107
176
  # user_subscriptions GET /users/:user_id/subscriptions(.:format)
108
177
  # { controller:"activity_notification/subscriptions", action:"index", target_type:"users" }
178
+ # find_user_subscriptions GET /users/:user_id/subscriptions/find(.:format)
179
+ # { controller:"activity_notification/subscriptions", action:"find", target_type:"users" }
109
180
  # user_subscription GET /users/:user_id/subscriptions/:id(.:format)
110
181
  # { controller:"activity_notification/subscriptions", action:"show", target_type:"users" }
111
- # open_all_user_subscriptions POST /users/:user_id/subscriptions(.:format)
182
+ # PUT /users/:user_id/subscriptions(.:format)
112
183
  # { controller:"activity_notification/subscriptions", action:"create", target_type:"users" }
113
- # user_subscription DELETE /users/:user_id/subscriptions/:id(.:format)
184
+ # DELETE /users/:user_id/subscriptions/:id(.:format)
114
185
  # { controller:"activity_notification/subscriptions", action:"destroy", target_type:"users" }
115
- # subscribe_user_subscription POST /users/:user_id/subscriptions/:id/subscribe(.:format)
186
+ # subscribe_user_subscription PUT /users/:user_id/subscriptions/:id/subscribe(.:format)
116
187
  # { controller:"activity_notification/subscriptions", action:"subscribe", target_type:"users" }
117
- # unsubscribe_user_subscription POST /users/:user_id/subscriptions/:id/unsubscribe(.:format)
188
+ # unsubscribe_user_subscription PUT /users/:user_id/subscriptions/:id/unsubscribe(.:format)
118
189
  # { controller:"activity_notification/subscriptions", action:"unsubscribe", target_type:"users" }
119
- # subscribe_to_email_user_subscription POST /users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
190
+ # subscribe_to_email_user_subscription PUT /users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
120
191
  # { controller:"activity_notification/subscriptions", action:"subscribe_to_email", target_type:"users" }
121
- # unsubscribe_to_email_user_subscription POST /users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
192
+ # unsubscribe_to_email_user_subscription PUT /users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
122
193
  # { controller:"activity_notification/subscriptions", action:"unsubscribe_to_email", target_type:"users" }
123
- # subscribe_to_optional_target_user_subscription POST /users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
194
+ # subscribe_to_optional_target_user_subscription PUT /users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
124
195
  # { controller:"activity_notification/subscriptions", action:"subscribe_to_optional_target", target_type:"users" }
125
- # unsubscribe_to_optional_target_user_subscription POST /users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
196
+ # unsubscribe_to_optional_target_user_subscription PUT /users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
126
197
  # { controller:"activity_notification/subscriptions", action:"unsubscribe_to_optional_target", target_type:"users" }
127
198
  #
199
+ # You can also configure notification routes with scope like this:
200
+ # scope :myscope, as: :myscope do
201
+ # subscribed_by :users, routing_scope: :myscope
202
+ # end
203
+ # This routing_scope option creates the needed routes with specified scope like this:
204
+ # # Subscription routes
205
+ # myscope_user_subscriptions GET /myscope/users/:user_id/subscriptions(.:format)
206
+ # { controller:"activity_notification/subscriptions", action:"index", target_type:"users", routing_scope: :myscope }
207
+ # find_myscope_user_subscriptions GET /myscope/users/:user_id/subscriptions/find(.:format)
208
+ # { controller:"activity_notification/subscriptions", action:"find", target_type:"users", routing_scope: :myscope }
209
+ # myscope_user_subscription GET /myscope/users/:user_id/subscriptions/:id(.:format)
210
+ # { controller:"activity_notification/subscriptions", action:"show", target_type:"users", routing_scope: :myscope }
211
+ # PUT /myscope/users/:user_id/subscriptions(.:format)
212
+ # { controller:"activity_notification/subscriptions", action:"create", target_type:"users", routing_scope: :myscope }
213
+ # DELETE /myscope/users/:user_id/subscriptions/:id(.:format)
214
+ # { controller:"activity_notification/subscriptions", action:"destroy", target_type:"users", routing_scope: :myscope }
215
+ # subscribe_myscope_user_subscription PUT /myscope/users/:user_id/subscriptions/:id/subscribe(.:format)
216
+ # { controller:"activity_notification/subscriptions", action:"subscribe", target_type:"users", routing_scope: :myscope }
217
+ # unsubscribe_myscope_user_subscription PUT /myscope/users/:user_id/subscriptions/:id/unsubscribe(.:format)
218
+ # { controller:"activity_notification/subscriptions", action:"unsubscribe", target_type:"users", routing_scope: :myscope }
219
+ # subscribe_to_email_myscope_user_subscription PUT /myscope/users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
220
+ # { controller:"activity_notification/subscriptions", action:"subscribe_to_email", target_type:"users", routing_scope: :myscope }
221
+ # unsubscribe_to_email_myscope_user_subscription PUT /myscope/users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
222
+ # { controller:"activity_notification/subscriptions", action:"unsubscribe_to_email", target_type:"users", routing_scope: :myscope }
223
+ # subscribe_to_optional_target_myscope_user_subscription PUT /myscope/users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
224
+ # { controller:"activity_notification/subscriptions", action:"subscribe_to_optional_target", target_type:"users", routing_scope: :myscope }
225
+ # unsubscribe_to_optional_target_myscope_user_subscription PUT /myscope/users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
226
+ # { controller:"activity_notification/subscriptions", action:"unsubscribe_to_optional_target", target_type:"users", routing_scope: :myscope }
227
+ #
128
228
  # When you use devise authentication and you want make subscription targets assciated with devise,
129
229
  # you can create as follows in your routes:
130
- # notify_to :users, with_devise: :users
230
+ # subscribed_by :users, with_devise: :users
131
231
  # This with_devise option creates the needed routes assciated with devise authentication:
132
232
  # # Subscription with devise routes
133
233
  # user_subscriptions GET /users/:user_id/subscriptions(.:format)
134
234
  # { controller:"activity_notification/subscriptions_with_devise", action:"index", target_type:"users", devise_type:"users" }
235
+ # find_user_subscriptions GET /users/:user_id/subscriptions/find(.:format)
236
+ # { controller:"activity_notification/subscriptions_with_devise", action:"find", target_type:"users", devise_type:"users" }
135
237
  # user_subscription GET /users/:user_id/subscriptions/:id(.:format)
136
238
  # { controller:"activity_notification/subscriptions_with_devise", action:"show", target_type:"users", devise_type:"users" }
137
- # open_all_user_subscriptions POST /users/:user_id/subscriptions(.:format)
239
+ # PUT /users/:user_id/subscriptions(.:format)
240
+ # { controller:"activity_notification/subscriptions_with_devise", action:"create", target_type:"users", devise_type:"users" }
241
+ # DELETE /users/:user_id/subscriptions/:id(.:format)
242
+ # { controller:"activity_notification/subscriptions_with_devise", action:"destroy", target_type:"users", devise_type:"users" }
243
+ # subscribe_user_subscription PUT /users/:user_id/subscriptions/:id/subscribe(.:format)
244
+ # { controller:"activity_notification/subscriptions_with_devise", action:"subscribe", target_type:"users", devise_type:"users" }
245
+ # unsubscribe_user_subscription PUT /users/:user_id/subscriptions/:id/unsubscribe(.:format)
246
+ # { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe", target_type:"users", devise_type:"users" }
247
+ # subscribe_to_email_user_subscription PUT /users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
248
+ # { controller:"activity_notification/subscriptions_with_devise", action:"subscribe_to_email", target_type:"users", devise_type:"users" }
249
+ # unsubscribe_to_email_user_subscription PUT /users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
250
+ # { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe_to_email", target_type:"users", devise_type:"users" }
251
+ # subscribe_to_optional_target_user_subscription PUT /users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
252
+ # { controller:"activity_notification/subscriptions_with_devise", action:"subscribe_to_optional_target", target_type:"users", devise_type:"users" }
253
+ # unsubscribe_to_optional_target_user_subscription PUT /users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
254
+ # { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe_to_optional_target", target_type:"users", devise_type:"users" }
255
+ #
256
+ # When you use with_devise option and you want to make simple default routes as follows, you can use devise_default_routes option:
257
+ # subscribed_by :users, with_devise: :users, devise_default_routes: true
258
+ # These with_devise and devise_default_routes options create the needed routes assciated with authenticated devise resource as the default target
259
+ # # Subscription with devise routes
260
+ # user_subscriptions GET /subscriptions(.:format)
261
+ # { controller:"activity_notification/subscriptions_with_devise", action:"index", target_type:"users", devise_type:"users" }
262
+ # find_user_subscriptions GET /subscriptions/find(.:format)
263
+ # { controller:"activity_notification/subscriptions_with_devise", action:"find", target_type:"users", devise_type:"users" }
264
+ # user_subscription GET /subscriptions/:id(.:format)
265
+ # { controller:"activity_notification/subscriptions_with_devise", action:"show", target_type:"users", devise_type:"users" }
266
+ # PUT /subscriptions(.:format)
138
267
  # { controller:"activity_notification/subscriptions_with_devise", action:"create", target_type:"users", devise_type:"users" }
139
- # user_subscription DELETE /users/:user_id/subscriptions/:id(.:format)
268
+ # DELETE /subscriptions/:id(.:format)
140
269
  # { controller:"activity_notification/subscriptions_with_devise", action:"destroy", target_type:"users", devise_type:"users" }
141
- # subscribe_user_subscription POST /users/:user_id/subscriptions/:id/subscribe(.:format)
270
+ # subscribe_user_subscription PUT /subscriptions/:id/subscribe(.:format)
142
271
  # { controller:"activity_notification/subscriptions_with_devise", action:"subscribe", target_type:"users", devise_type:"users" }
143
- # unsubscribe_user_subscription POST /users/:user_id/subscriptions/:id/unsubscribe(.:format)
272
+ # unsubscribe_user_subscription PUT /subscriptions/:id/unsubscribe(.:format)
144
273
  # { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe", target_type:"users", devise_type:"users" }
145
- # subscribe_to_email_user_subscription POST /users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
274
+ # subscribe_to_email_user_subscription PUT /subscriptions/:id/subscribe_to_email(.:format)
146
275
  # { controller:"activity_notification/subscriptions_with_devise", action:"subscribe_to_email", target_type:"users", devise_type:"users" }
147
- # unsubscribe_to_email_user_subscription POST /users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
276
+ # unsubscribe_to_email_user_subscription PUT /subscriptions/:id/unsubscribe_to_email(.:format)
148
277
  # { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe_to_email", target_type:"users", devise_type:"users" }
149
- # subscribe_to_optional_target_user_subscription POST /users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
278
+ # subscribe_to_optional_target_user_subscription PUT /subscriptions/:id/subscribe_to_optional_target(.:format)
150
279
  # { controller:"activity_notification/subscriptions_with_devise", action:"subscribe_to_optional_target", target_type:"users", devise_type:"users" }
151
- # unsubscribe_to_optional_target_user_subscription POST /users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
280
+ # unsubscribe_to_optional_target_user_subscription PUT /subscriptions/:id/unsubscribe_to_optional_target(.:format)
152
281
  # { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe_to_optional_target", target_type:"users", devise_type:"users" }
153
282
  #
283
+ # When you use activity_notification controllers as REST API mode,
284
+ # you can create as follows in your routes:
285
+ # scope :api do
286
+ # scope :"v2" do
287
+ # subscribed_by :users, api_mode: true
288
+ # end
289
+ # end
290
+ # This api_mode option creates the needed routes as REST API:
291
+ # # Subscription as API mode routes
292
+ # GET /subscriptions(.:format)
293
+ # { controller:"activity_notification/subscriptions_api", action:"index", target_type:"users" }
294
+ # GET /subscriptions/find(.:format)
295
+ # { controller:"activity_notification/subscriptions_api", action:"find", target_type:"users" }
296
+ # GET /subscriptions/optional_target_names(.:format)
297
+ # { controller:"activity_notification/subscriptions_api", action:"optional_target_names", target_type:"users" }
298
+ # GET /subscriptions/:id(.:format)
299
+ # { controller:"activity_notification/subscriptions_api", action:"show", target_type:"users" }
300
+ # PUT /subscriptions(.:format)
301
+ # { controller:"activity_notification/subscriptions_api", action:"create", target_type:"users" }
302
+ # DELETE /subscriptions/:id(.:format)
303
+ # { controller:"activity_notification/subscriptions_api", action:"destroy", target_type:"users" }
304
+ # PUT /subscriptions/:id/subscribe(.:format)
305
+ # { controller:"activity_notification/subscriptions_api", action:"subscribe", target_type:"users" }
306
+ # PUT /subscriptions/:id/unsubscribe(.:format)
307
+ # { controller:"activity_notification/subscriptions_api", action:"unsubscribe", target_type:"users" }
308
+ # PUT /subscriptions/:id/subscribe_to_email(.:format)
309
+ # { controller:"activity_notification/subscriptions_api", action:"subscribe_to_email", target_type:"users" }
310
+ # PUT /subscriptions/:id/unsubscribe_to_email(.:format)
311
+ # { controller:"activity_notification/subscriptions_api", action:"unsubscribe_to_email", target_type:"users" }
312
+ # PUT /subscriptions/:id/subscribe_to_optional_target(.:format)
313
+ # { controller:"activity_notification/subscriptions_api", action:"subscribe_to_optional_target", target_type:"users" }
314
+ # PUT /subscriptions/:id/unsubscribe_to_optional_target(.:format)
315
+ # { controller:"activity_notification/subscriptions_api", action:"unsubscribe_to_optional_target", target_type:"users" }
316
+ #
154
317
  # @example Define subscribed_by in config/routes.rb
155
318
  # subscribed_by :users
156
319
  # @example Define subscribed_by with options
157
320
  # subscribed_by :users, except: [:index, :show]
158
321
  # @example Integrated with Devise authentication
159
322
  # subscribed_by :users, with_devise: :users
323
+ # @example Define subscription paths as API mode
324
+ # scope :api do
325
+ # scope :"v2" do
326
+ # subscribed_by :users, api_mode: true
327
+ # end
328
+ # end
160
329
  #
161
330
  # @overload subscribed_by(*resources, *options)
162
331
  # @param [Symbol] resources Resources to notify
163
- # @option options [Symbol] :with_devise (false) Devise resources name for devise integration. Devise integration will be enabled by this option.
164
- # @option options [String] :model (:subscriptions) Model name of subscriptions
165
- # @option options [String] :controller ("activity_notification/subscriptions" | activity_notification/subscriptions_with_devise") :controller option as resources routing
166
- # @option options [Symbol] :as (nil) :as option as resources routing
167
- # @option options [Array] :only (nil) :only option as resources routing
168
- # @option options [Array] :except (nil) :except option as resources routing
332
+ # @option options [String] :routing_scope (nil) Routing scope for subscription routes
333
+ # @option options [Symbol] :with_devise (false) Devise resources name for devise integration. Devise integration will be enabled by this option.
334
+ # @option options [Boolean] :devise_default_routes (false) Whether you will create routes as device default routes assciated with authenticated devise resource as the default target
335
+ # @option options [Boolean] :api_mode (false) Whether you will use activity_notification controllers as REST API mode
336
+ # @option options [String] :model (:subscriptions) Model name of subscriptions
337
+ # @option options [String] :controller ("activity_notification/subscriptions" | activity_notification/subscriptions_with_devise") :controller option as resources routing
338
+ # @option options [Symbol] :as (nil) :as option as resources routing
339
+ # @option options [Array] :only (nil) :only option as resources routing
340
+ # @option options [Array] :except (nil) :except option as resources routing
169
341
  # @return [ActionDispatch::Routing::Mapper] Routing mapper instance
170
342
  def subscribed_by(*resources)
171
343
  options = create_options(:subscriptions, resources.extract_options!, [:new, :edit, :update])
172
344
 
173
345
  resources.each do |target|
174
- self.resources target, only: :none do
175
- options[:defaults] = { target_type: target.to_s }.merge(options[:devise_defaults])
176
- resources_options = options.select { |key, _| [:with_devise, :model, :devise_defaults].exclude? key }
177
- self.resources options[:model], resources_options do
178
- member do
179
- post :subscribe unless ignore_path?(:subscribe, options)
180
- post :unsubscribe unless ignore_path?(:unsubscribe, options)
181
- post :subscribe_to_email unless ignore_path?(:subscribe_to_email, options)
182
- post :unsubscribe_to_email unless ignore_path?(:unsubscribe_to_email, options)
183
- post :subscribe_to_optional_target unless ignore_path?(:subscribe_to_optional_target, options)
184
- post :unsubscribe_to_optional_target unless ignore_path?(:unsubscribe_to_optional_target, options)
185
- end
346
+ options[:defaults] = { target_type: target.to_s }.merge(options[:devise_defaults])
347
+ resources_options = options.select { |key, _| [:api_mode, :with_devise, :devise_default_routes, :model, :devise_defaults].exclude? key }
348
+ if options[:with_devise].present? && options[:devise_default_routes].present?
349
+ create_subscription_routes options, resources_options
350
+ else
351
+ self.resources target, only: :none do
352
+ create_subscription_routes options, resources_options
186
353
  end
187
354
  end
188
355
  end
@@ -202,35 +369,81 @@ module ActionDispatch::Routing
202
369
  false
203
370
  end
204
371
 
205
- # Create options fo routing
372
+ # Create options for routing
206
373
  # @api private
207
374
  # @todo Check resources if it includes target module
208
375
  # @todo Check devise configuration in model
209
376
  # @todo Support other options like :as, :path_prefix, :path_names ...
210
377
  #
211
378
  # @param [Symbol] resource Name of the resource model
212
- # @return [Boolean] Whether action path is ignored
379
+ # @param [Hash] options Passed options from notify_to or subscribed_by
380
+ # @param [Hash] except_actions Actions in [:index, :show, :new, :create, :edit, :update, :destroy] to remove routes
381
+ # @return [Hash] Options to create routes
213
382
  def create_options(resource, options = {}, except_actions = [])
214
383
  # Check resources if it includes target module
215
384
  resources_name = resource.to_s.pluralize.underscore
216
385
  options[:model] ||= resources_name.to_sym
386
+ controller_name = "activity_notification/#{resources_name}"
387
+ controller_name.concat("_api") if options[:api_mode]
217
388
  if options[:with_devise].present?
218
- options[:controller] ||= "activity_notification/#{resources_name}_with_devise"
389
+ options[:controller] ||= "#{controller_name}_with_devise"
219
390
  options[:as] ||= resources_name
220
391
  # Check devise configuration in model
221
392
  options[:devise_defaults] = { devise_type: options[:with_devise].to_s }
393
+ options[:devise_defaults] = options[:devise_defaults].merge(options.slice(:devise_default_routes))
222
394
  else
223
- options[:controller] ||= "activity_notification/#{resources_name}"
395
+ options[:controller] ||= controller_name
224
396
  options[:devise_defaults] = {}
225
397
  end
226
398
  (options[:except] ||= []).concat(except_actions)
227
399
  if options[:with_subscription].present?
228
400
  options[:subscription_option] = (options[:with_subscription].is_a?(Hash) ? options[:with_subscription] : {})
229
- .merge(with_devise: options[:with_devise])
401
+ .merge(options.slice(:api_mode, :with_devise, :devise_default_routes, :routing_scope))
230
402
  end
231
403
  # Support other options like :as, :path_prefix, :path_names ...
232
404
  options
233
405
  end
234
406
 
407
+ # Create routes for notifications
408
+ # @api private
409
+ #
410
+ # @param [Symbol] resource Name of the resource model
411
+ # @param [Hash] options Passed options from notify_to
412
+ # @param [Hash] resources_options Options to send resources method
413
+ def create_notification_routes(options = {}, resources_options = [])
414
+ self.resources options[:model], resources_options do
415
+ collection do
416
+ post :open_all unless ignore_path?(:open_all, options)
417
+ end
418
+ member do
419
+ get :move unless ignore_path?(:move, options)
420
+ put :open unless ignore_path?(:open, options)
421
+ end
422
+ end
423
+ end
424
+
425
+ # Create routes for subscriptions
426
+ # @api private
427
+ #
428
+ # @param [Symbol] resource Name of the resource model
429
+ # @param [Hash] options Passed options from subscribed_by
430
+ # @param [Hash] resources_options Options to send resources method
431
+ def create_subscription_routes(options = {}, resources_options = [])
432
+ self.resources options[:model], resources_options do
433
+ collection do
434
+ get :find unless ignore_path?(:find, options)
435
+ get :optional_target_names if options[:api_mode] && !ignore_path?(:optional_target_names, options)
436
+ end
437
+ member do
438
+ put :subscribe unless ignore_path?(:subscribe, options)
439
+ put :unsubscribe unless ignore_path?(:unsubscribe, options)
440
+ put :subscribe_to_email unless ignore_path?(:subscribe_to_email, options)
441
+ put :unsubscribe_to_email unless ignore_path?(:unsubscribe_to_email, options)
442
+ put :subscribe_to_optional_target unless ignore_path?(:subscribe_to_optional_target, options)
443
+ put :unsubscribe_to_optional_target unless ignore_path?(:unsubscribe_to_optional_target, options)
444
+ end
445
+ end
446
+ end
447
+
235
448
  end
236
449
  end
@@ -8,7 +8,7 @@ module ActivityNotification
8
8
  #
9
9
  # @param [Hash] params Parameters for rendering notification text
10
10
  # @option params [String] :target Target type name to use as i18n text key
11
- # @option params [Hash] others Parameters to be reffered in i18n text
11
+ # @option params [Hash] others Parameters to be referred in i18n text
12
12
  # @return [String] Rendered text
13
13
  def text(params = {})
14
14
  k = key.split('.')
@@ -21,12 +21,16 @@ module ActivityNotification
21
21
  k.push('text')
22
22
  k = k.join('.')
23
23
 
24
- I18n.t(k, (parameters.merge(params) || {}).merge(
24
+ attrs = (parameters.symbolize_keys.merge(params) || {}).merge(
25
25
  group_member_count: group_member_count,
26
26
  group_notification_count: group_notification_count,
27
27
  group_member_notifier_count: group_member_notifier_count,
28
28
  group_notifier_count: group_notifier_count
29
- ))
29
+ )
30
+
31
+ # Generate the :default fallback key without using pluralization key :count
32
+ default = I18n.t(k, **attrs)
33
+ I18n.t(k, **attrs.merge(count: group_notification_count, default: default))
30
34
  end
31
35
 
32
36
  # Renders notification from views.
@@ -88,7 +92,7 @@ module ActivityNotification
88
92
  # <%= yield %>
89
93
  #
90
94
  # == Custom Layout Location
91
- #
95
+ #
92
96
  # You can customize the layout directory by supplying :layout_root
93
97
  # or by using an absolute path.
94
98
  #
@@ -139,23 +143,26 @@ module ActivityNotification
139
143
  # @option params [String] :layout (nil) Layout template name
140
144
  # @option params [String] :layout_root ('layouts') Root path of layout template
141
145
  # @option params [String, Symbol] :fallback (nil) Fallback template to use when MissingTemplate is raised. Set :text to use i18n text as fallback.
146
+ # @option params [Hash] :assigns Parameters to be set as assigns
147
+ # @option params [Hash] :locals Parameters to be set as locals
142
148
  # @option params [Hash] others Parameters to be set as locals
143
149
  # @return [String] Rendered view or text as string
144
150
  def render(context, params = {})
145
- params[:i18n] and return context.render text: self.text(params)
151
+ params[:i18n] and return context.render plain: self.text(params)
146
152
 
147
153
  partial = partial_path(*params.values_at(:partial, :partial_root, :target))
148
154
  layout = layout_path(*params.values_at(:layout, :layout_root))
155
+ assigns = prepare_assigns(params)
149
156
  locals = prepare_locals(params)
150
157
 
151
158
  begin
152
- context.render params.merge(partial: partial, layout: layout, locals: locals)
159
+ context.render params.merge(partial: partial, layout: layout, assigns: assigns, locals: locals)
153
160
  rescue ActionView::MissingTemplate => e
154
161
  if params[:fallback] == :text
155
162
  context.render plain: self.text(params)
156
163
  elsif params[:fallback].present?
157
164
  partial = partial_path(*params.values_at(:fallback, :partial_root, :target))
158
- context.render params.merge(partial: partial, layout: layout, locals: locals)
165
+ context.render params.merge(partial: partial, layout: layout, assigns: assigns, locals: locals)
159
166
  else
160
167
  raise e
161
168
  end
@@ -192,6 +199,14 @@ module ActivityNotification
192
199
  select_path(path, root)
193
200
  end
194
201
 
202
+ # Returns assigns parameter for view
203
+ #
204
+ # @param [Hash] params Parameters to add parameters at assigns
205
+ # @return [Hash] assigns parameter
206
+ def prepare_assigns(params)
207
+ params.delete(:assigns) || {}
208
+ end
209
+
195
210
  # Returns locals parameter for view
196
211
  # There are three variables to be add by method:
197
212
  # * notification