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
@@ -0,0 +1,61 @@
1
+ class <%= @target_prefix %>SubscriptionsWithDeviseController < ActivityNotification::SubscriptionsWithDeviseController
2
+ # GET /:target_type/:target_id/subscriptions
3
+ # def index
4
+ # super
5
+ # end
6
+
7
+ # PUT /:target_type/:target_id/subscriptions
8
+ # def create
9
+ # super
10
+ # end
11
+
12
+ # GET /:target_type/:target_id/subscriptions/find
13
+ def find
14
+ super
15
+ end
16
+
17
+ # GET /:target_type/:target_id/subscriptions/optional_target_names
18
+ def optional_target_names
19
+ super
20
+ end
21
+
22
+ # GET /:target_type/:target_id/subscriptions/:id
23
+ # def show
24
+ # super
25
+ # end
26
+
27
+ # DELETE /:target_type/:target_id/subscriptions/:id
28
+ # def destroy
29
+ # super
30
+ # end
31
+
32
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
33
+ # def subscribe
34
+ # super
35
+ # end
36
+
37
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
38
+ # def unsubscribe
39
+ # super
40
+ # end
41
+
42
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_email
43
+ # def subscribe_to_email
44
+ # super
45
+ # end
46
+
47
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
48
+ # def unsubscribe_to_email
49
+ # super
50
+ # end
51
+
52
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
53
+ # def subscribe_to_optional_target
54
+ # super
55
+ # end
56
+
57
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
58
+ # def unsubscribe_to_optional_target
59
+ # super
60
+ # end
61
+ end
@@ -4,11 +4,16 @@ class <%= @target_prefix %>SubscriptionsController < ActivityNotification::Subsc
4
4
  # super
5
5
  # end
6
6
 
7
- # POST /:target_type/:target_id/subscriptions
7
+ # PUT /:target_type/:target_id/subscriptions
8
8
  # def create
9
9
  # super
10
10
  # end
11
11
 
12
+ # GET /:target_type/:target_id/subscriptions/find
13
+ def find
14
+ super
15
+ end
16
+
12
17
  # GET /:target_type/:target_id/subscriptions/:id
13
18
  # def show
14
19
  # super
@@ -19,61 +24,33 @@ class <%= @target_prefix %>SubscriptionsController < ActivityNotification::Subsc
19
24
  # super
20
25
  # end
21
26
 
22
- # POST /:target_type/:target_id/subscriptions/:id/subscribe
27
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
23
28
  # def subscribe
24
29
  # super
25
30
  # end
26
31
 
27
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe
32
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
28
33
  # def unsubscribe
29
34
  # super
30
35
  # end
31
36
 
32
- # POST /:target_type/:target_id/subscriptions/:id/subscribe_to_email
37
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_email
33
38
  # def subscribe_to_email
34
39
  # super
35
40
  # end
36
41
 
37
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
42
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
38
43
  # def unsubscribe_to_email
39
44
  # super
40
45
  # end
41
46
 
42
- # protected
43
-
44
- # def set_target
45
- # super
46
- # end
47
-
48
- # def set_subscription
49
- # super
50
- # end
51
-
52
- # def subscription_params
53
- # super
54
- # end
55
-
56
- # def set_index_options
57
- # super
58
- # end
59
-
60
- # def load_index
61
- # super
62
- # end
63
-
64
- # def controller_path
65
- # super
66
- # end
67
-
68
- # def target_view_path
69
- # super
70
- # end
71
-
72
- # def set_view_prefixes
47
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
48
+ # def subscribe_to_optional_target
73
49
  # super
74
50
  # end
75
51
 
76
- # def return_back_or_ajax
52
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
53
+ # def unsubscribe_to_optional_target
77
54
  # super
78
55
  # end
79
56
  end
@@ -4,11 +4,16 @@ class <%= @target_prefix %>SubscriptionsWithDeviseController < ActivityNotificat
4
4
  # super
5
5
  # end
6
6
 
7
- # POST /:target_type/:target_id/subscriptions
7
+ # PUT /:target_type/:target_id/subscriptions
8
8
  # def create
9
9
  # super
10
10
  # end
11
11
 
12
+ # GET /:target_type/:target_id/subscriptions/find
13
+ def find
14
+ super
15
+ end
16
+
12
17
  # GET /:target_type/:target_id/subscriptions/:id
13
18
  # def show
14
19
  # super
@@ -19,69 +24,33 @@ class <%= @target_prefix %>SubscriptionsWithDeviseController < ActivityNotificat
19
24
  # super
20
25
  # end
21
26
 
22
- # POST /:target_type/:target_id/subscriptions/:id/subscribe
27
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
23
28
  # def subscribe
24
29
  # super
25
30
  # end
26
31
 
27
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe
32
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
28
33
  # def unsubscribe
29
34
  # super
30
35
  # end
31
36
 
32
- # POST /:target_type/:target_id/subscriptions/:id/subscribe_to_email
37
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_email
33
38
  # def subscribe_to_email
34
39
  # super
35
40
  # end
36
41
 
37
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
42
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
38
43
  # def unsubscribe_to_email
39
44
  # super
40
45
  # end
41
46
 
42
- # protected
43
-
44
- # def set_target
45
- # super
46
- # end
47
-
48
- # def set_subscription
49
- # super
50
- # end
51
-
52
- # def subscription_params
53
- # super
54
- # end
55
-
56
- # def set_index_options
57
- # super
58
- # end
59
-
60
- # def load_index
61
- # super
62
- # end
63
-
64
- # def controller_path
65
- # super
66
- # end
67
-
68
- # def target_view_path
69
- # super
70
- # end
71
-
72
- # def set_view_prefixes
73
- # super
74
- # end
75
-
76
- # def return_back_or_ajax
77
- # super
78
- # end
79
-
80
- # def authenticate_devise_resource!
47
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
48
+ # def subscribe_to_optional_target
81
49
  # super
82
50
  # end
83
51
 
84
- # def authenticate_target!
52
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
53
+ # def unsubscribe_to_optional_target
85
54
  # super
86
55
  # end
87
56
  end
@@ -1,5 +1,5 @@
1
1
  # Migration responsible for creating a table with notifications
2
- class <%= @migration_name %> < ActiveRecord::Migration
2
+ class <%= @migration_name %> < ActiveRecord::Migration<%= "[#{Rails.version.to_f}]" %>
3
3
  # Create tables
4
4
  def change
5
5
  <% if @migration_tables.include?('notifications') %>create_table :notifications do |t|
@@ -12,7 +12,7 @@ class <%= @migration_name %> < ActiveRecord::Migration
12
12
  t.text :parameters
13
13
  t.datetime :opened_at
14
14
 
15
- t.timestamps
15
+ t.timestamps null: false
16
16
  end<% else %># create_table :notifications do |t|
17
17
  # t.belongs_to :target, polymorphic: true, index: true, null: false
18
18
  # t.belongs_to :notifiable, polymorphic: true, index: true, null: false
@@ -23,7 +23,7 @@ class <%= @migration_name %> < ActiveRecord::Migration
23
23
  # t.text :parameters
24
24
  # t.datetime :opened_at
25
25
  #
26
- # t.timestamps
26
+ # t.timestamps null: false
27
27
  # end<% end %>
28
28
 
29
29
  <% if @migration_tables.include?('subscriptions') %>create_table :subscriptions do |t|
@@ -37,7 +37,7 @@ class <%= @migration_name %> < ActiveRecord::Migration
37
37
  t.datetime :unsubscribed_to_email_at
38
38
  t.text :optional_targets
39
39
 
40
- t.timestamps
40
+ t.timestamps null: false
41
41
  end
42
42
  add_index :subscriptions, [:target_type, :target_id, :key], unique: true<% else %># create_table :subscriptions do |t|
43
43
  # t.belongs_to :target, polymorphic: true, index: true, null: false
@@ -50,7 +50,7 @@ class <%= @migration_name %> < ActiveRecord::Migration
50
50
  # t.datetime :unsubscribed_to_email_at
51
51
  # t.text :optional_targets
52
52
  #
53
- # t.timestamps
53
+ # t.timestamps null: false
54
54
  # end
55
55
  # add_index :subscriptions, [:target_type, :target_id, :key], unique: true<% end %>
56
56
  end
@@ -1,10 +1,14 @@
1
1
  ===============================================================================
2
2
 
3
- Some setup you must do manually if you haven't yet:
3
+ activity_notification uses internal models for notifications and subscriptions
4
+ - ActivityNotification::Notification
5
+ - ActivityNotification::Subscription
4
6
 
5
- Ensure you have configured model name in your initializer activity_notification.rb.
6
- For example:
7
+ You can use your own models with same database table used by these internal models.
7
8
 
8
- #TODO
9
+ Ensure you have configured table name in your initializer activity_notification.rb.
10
+ For example:
11
+ config.notification_table_name = "notifications"
12
+ config.subscription_table_name = "subscriptions"
9
13
 
10
14
  ===============================================================================
@@ -1,4 +1,4 @@
1
- # Notification model for customisation & custom methods
1
+ # Notification model for customization & custom methods
2
2
  class <%= @target_prefix %><%= @model_name %> < ActivityNotification::Notification
3
3
  # Write custom methods or override methods here
4
4
  end
@@ -1,4 +1,4 @@
1
- # Subscription model for customisation & custom methods
1
+ # Subscription model for customization & custom methods
2
2
  class <%= @target_prefix %><%= @model_name %> < ActivityNotification::Subscription
3
3
  # Write custom methods or override methods here
4
4
  end
@@ -1,4 +1,14 @@
1
- # desc "Explaining what the task does"
2
- # task :activity_notification do
3
- # # Task goes here
4
- # end
1
+ namespace :activity_notification do
2
+ desc "Create Amazon DynamoDB tables used by activity_notification with Dynamoid"
3
+ task create_dynamodb_tables: :environment do
4
+ if ActivityNotification.config.orm == :dynamoid
5
+ ActivityNotification::Notification.create_table(sync: true)
6
+ puts "Created table: #{ActivityNotification::Notification.table_name}"
7
+ ActivityNotification::Subscription.create_table(sync: true)
8
+ puts "Created table: #{ActivityNotification::Subscription.table_name}"
9
+ else
10
+ puts "Error: ActivityNotification.config.orm is not set to :dynamoid."
11
+ puts "Error: Confirm to set AN_ORM environment variable to dynamoid or set ActivityNotification.config.orm to :dynamoid."
12
+ end
13
+ end
14
+ end
data/package.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "engines": {
3
+ "yarn": "1.x"
4
+ },
5
+ "scripts": {
6
+ "postinstall": "cd ./spec/rails_app && yarn && yarn install --check-files"
7
+ }
8
+ }
@@ -0,0 +1,59 @@
1
+ # @See https://github.com/palkan/action-cable-testing
2
+ shared_examples_for :notification_api_channel do
3
+ let(:target_params) { { target_type: target_type }.merge(extra_params || {}) }
4
+
5
+ before { stub_connection }
6
+
7
+ context "with target_type and target_id parameters" do
8
+ it "successfully subscribes" do
9
+ subscribe(target_params.merge({ target_id: test_target.id, typed_target_param => 'dummy' }).merge(@auth_headers))
10
+ expect(subscription).to be_confirmed
11
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
12
+ end
13
+ end
14
+
15
+ context "with target_type and (typed_target)_id parameters" do
16
+ it "successfully subscribes" do
17
+ subscribe(target_params.merge({ typed_target_param => test_target.id }).merge(@auth_headers))
18
+ expect(subscription).to be_confirmed
19
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
20
+ end
21
+ end
22
+
23
+ context "without any parameters" do
24
+ it "rejects subscription" do
25
+ subscribe(@auth_headers)
26
+ expect(subscription).to be_rejected
27
+ expect {
28
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
29
+ }.to raise_error(/Must be subscribed!/)
30
+ end
31
+ end
32
+
33
+ context "without target_type parameter" do
34
+ it "rejects subscription" do
35
+ subscribe({ typed_target_param => test_target.id }.merge(@auth_headers))
36
+ expect(subscription).to be_rejected
37
+ expect {
38
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
39
+ }.to raise_error(/Must be subscribed!/)
40
+ end
41
+ end
42
+
43
+ context "without target_id and (typed_target)_id parameters" do
44
+ it "rejects subscription" do
45
+ subscribe(target_params.merge(@auth_headers))
46
+ expect(subscription).to be_rejected
47
+ end
48
+ end
49
+
50
+ context "with not found (typed_target)_id parameter" do
51
+ it "rejects subscription" do
52
+ subscribe(target_params.merge({ typed_target_param => 0 }).merge(@auth_headers))
53
+ expect(subscription).to be_rejected
54
+ expect {
55
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
56
+ }.to raise_error(/Must be subscribed!/)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,49 @@
1
+ require 'channels/notification_api_channel_shared_examples'
2
+
3
+ # @See https://github.com/palkan/action-cable-testing
4
+ describe ActivityNotification::NotificationApiChannel, type: :channel do
5
+ let(:test_target) { create(:user) }
6
+ let(:target_type) { "User" }
7
+ let(:typed_target_param) { "user_id" }
8
+ let(:extra_params) { {} }
9
+
10
+ context "when target.notification_action_cable_with_devise? returns true" do
11
+ before do
12
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
13
+ User._notification_action_cable_with_devise = true
14
+ end
15
+
16
+ after do
17
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
18
+ end
19
+
20
+ it "rejects subscription even if target_type and target_id parameters are passed" do
21
+ subscribe({ target_type: target_type, target_id: test_target.id })
22
+ expect(subscription).to be_rejected
23
+ expect {
24
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
25
+ }.to raise_error(/Must be subscribed!/)
26
+ end
27
+ end
28
+
29
+ context "when target.notification_action_cable_with_devise? returns false" do
30
+ before do
31
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
32
+ User._notification_action_cable_with_devise = false
33
+ @auth_headers = {}
34
+ end
35
+
36
+ after do
37
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
38
+ end
39
+
40
+ it "successfully subscribes with target_type and target_id parameters" do
41
+ subscribe({ target_type: target_type, target_id: test_target.id })
42
+ expect(subscription).to be_confirmed
43
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
44
+ expect(subscription).to have_stream_from("activity_notification_api_channel_User##{test_target.id}")
45
+ end
46
+
47
+ it_behaves_like :notification_api_channel
48
+ end
49
+ end
@@ -0,0 +1,76 @@
1
+ require 'channels/notification_api_channel_shared_examples'
2
+
3
+ # @See https://github.com/palkan/action-cable-testing
4
+ describe ActivityNotification::NotificationApiWithDeviseChannel, type: :channel do
5
+ let(:test_user) { create(:confirmed_user) }
6
+ let(:unauthenticated_user) { create(:confirmed_user) }
7
+ let(:test_target) { create(:admin, user: test_user) }
8
+ let(:target_type) { "Admin" }
9
+ let(:typed_target_param) { "admin_id" }
10
+ let(:extra_params) { { devise_type: :users } }
11
+ let(:valid_session) {}
12
+
13
+ # @See https://github.com/lynndylanhurley/devise_token_auth
14
+ def sign_in(current_target)
15
+ @auth_headers = current_target.create_new_auth_token
16
+ end
17
+
18
+ before do
19
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
20
+ User._notification_action_cable_with_devise = true
21
+ end
22
+
23
+ after do
24
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
25
+ end
26
+
27
+ context "signed in with devise as authenticated user" do
28
+ before do
29
+ sign_in test_user
30
+ end
31
+
32
+ it_behaves_like :notification_api_channel
33
+ end
34
+
35
+ context "signed in with devise as unauthenticated user" do
36
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
37
+
38
+ before do
39
+ sign_in unauthenticated_user
40
+ end
41
+
42
+ it "rejects subscription" do
43
+ subscribe(target_params.merge({ typed_target_param => test_target }).merge(@auth_headers))
44
+ expect(subscription).to be_rejected
45
+ expect {
46
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
47
+ }.to raise_error(/Must be subscribed!/)
48
+ end
49
+ end
50
+
51
+ context "unsigned in with devise" do
52
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
53
+
54
+ it "rejects subscription" do
55
+ subscribe(target_params.merge({ typed_target_param => test_target }))
56
+ expect(subscription).to be_rejected
57
+ expect {
58
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
59
+ }.to raise_error(/Must be subscribed!/)
60
+ end
61
+ end
62
+
63
+ context "without target_id and (typed_target)_id parameters for devise integrated channel with devise_type option" do
64
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
65
+
66
+ before do
67
+ sign_in test_target.user
68
+ end
69
+
70
+ it "successfully subscribes" do
71
+ subscribe(target_params.merge(@auth_headers))
72
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
73
+ expect(subscription).to have_stream_from("activity_notification_api_channel_Admin##{test_target.id}")
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,59 @@
1
+ # @See https://github.com/palkan/action-cable-testing
2
+ shared_examples_for :notification_channel do
3
+ let(:target_params) { { target_type: target_type }.merge(extra_params || {}) }
4
+
5
+ before { stub_connection }
6
+
7
+ context "with target_type and target_id parameters" do
8
+ it "successfully subscribes" do
9
+ subscribe(target_params.merge({ target_id: test_target.id, typed_target_param => 'dummy' }))
10
+ expect(subscription).to be_confirmed
11
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
12
+ end
13
+ end
14
+
15
+ context "with target_type and (typed_target)_id parameters" do
16
+ it "successfully subscribes" do
17
+ subscribe(target_params.merge({ typed_target_param => test_target.id }))
18
+ expect(subscription).to be_confirmed
19
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
20
+ end
21
+ end
22
+
23
+ context "without any parameters" do
24
+ it "rejects subscription" do
25
+ subscribe
26
+ expect(subscription).to be_rejected
27
+ expect {
28
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
29
+ }.to raise_error(/Must be subscribed!/)
30
+ end
31
+ end
32
+
33
+ context "without target_type parameter" do
34
+ it "rejects subscription" do
35
+ subscribe({ typed_target_param => test_target.id })
36
+ expect(subscription).to be_rejected
37
+ expect {
38
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
39
+ }.to raise_error(/Must be subscribed!/)
40
+ end
41
+ end
42
+
43
+ context "without target_id and (typed_target)_id parameters" do
44
+ it "rejects subscription" do
45
+ subscribe(target_params)
46
+ expect(subscription).to be_rejected
47
+ end
48
+ end
49
+
50
+ context "with not found (typed_target)_id parameter" do
51
+ it "rejects subscription" do
52
+ subscribe(target_params.merge({ typed_target_param => 0 }))
53
+ expect(subscription).to be_rejected
54
+ expect {
55
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
56
+ }.to raise_error(/Must be subscribed!/)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,48 @@
1
+ require 'channels/notification_channel_shared_examples'
2
+
3
+ # @See https://github.com/palkan/action-cable-testing
4
+ describe ActivityNotification::NotificationChannel, type: :channel do
5
+ let(:test_target) { create(:user) }
6
+ let(:target_type) { "User" }
7
+ let(:typed_target_param) { "user_id" }
8
+ let(:extra_params) { {} }
9
+
10
+ context "when target.notification_action_cable_with_devise? returns true" do
11
+ before do
12
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
13
+ User._notification_action_cable_with_devise = true
14
+ end
15
+
16
+ after do
17
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
18
+ end
19
+
20
+ it "rejects subscription even if target_type and target_id parameters are passed" do
21
+ subscribe({ target_type: target_type, target_id: test_target.id })
22
+ expect(subscription).to be_rejected
23
+ expect {
24
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
25
+ }.to raise_error(/Must be subscribed!/)
26
+ end
27
+ end
28
+
29
+ context "when target.notification_action_cable_with_devise? returns false" do
30
+ before do
31
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
32
+ User._notification_action_cable_with_devise = false
33
+ end
34
+
35
+ after do
36
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
37
+ end
38
+
39
+ it "successfully subscribes with target_type and target_id parameters" do
40
+ subscribe({ target_type: target_type, target_id: test_target.id })
41
+ expect(subscription).to be_confirmed
42
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
43
+ expect(subscription).to have_stream_from("activity_notification_channel_User##{test_target.id}")
44
+ end
45
+
46
+ it_behaves_like :notification_channel
47
+ end
48
+ end