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,405 @@
1
+ module ActivityNotification
2
+ module Swagger::SubscriptionsApi #:nodoc:
3
+ extend ActiveSupport::Concern
4
+ include ::Swagger::Blocks
5
+
6
+ included do
7
+ include Swagger::ErrorSchema
8
+
9
+ swagger_path '/{target_type}/{target_id}/subscriptions' do
10
+ operation :get do
11
+ key :summary, 'Get subscriptions'
12
+ key :description, 'Returns subscription index of the target.'
13
+ key :operationId, 'getSubscriptions'
14
+ key :tags, ['subscriptions']
15
+
16
+ extend Swagger::SubscriptionsParameters::TargetParameters
17
+ parameter do
18
+ key :name, :filter
19
+ key :in, :query
20
+ key :description, "Filter option to load subscription index by their configuration status"
21
+ key :required, false
22
+ key :type, :string
23
+ key :enum, ['all', 'configured', 'unconfigured']
24
+ key :default, 'all'
25
+ end
26
+ parameter do
27
+ key :name, :limit
28
+ key :in, :query
29
+ key :description, "Maximum number of subscriptions to return"
30
+ key :required, false
31
+ key :type, :integer
32
+ end
33
+ parameter do
34
+ key :name, :reverse
35
+ key :in, :query
36
+ key :description, "Whether subscription index and unconfigured notification keys will be ordered as earliest first"
37
+ key :required, false
38
+ key :type, :boolean
39
+ key :default, false
40
+ end
41
+ extend Swagger::SubscriptionsParameters::FilterByParameters
42
+
43
+ response 200 do
44
+ key :description, "Subscription index of the target"
45
+ content 'application/json' do
46
+ schema do
47
+ key :type, :object
48
+ property :configured_count do
49
+ key :type, :integer
50
+ key :description, "Number of configured subscription records"
51
+ key :example, 1
52
+ end
53
+ property :subscriptions do
54
+ key :type, :array
55
+ items do
56
+ key :'$ref', :Subscription
57
+ end
58
+ key :description, "Subscription index, which means array of configured subscriptions of the target"
59
+ end
60
+ property :unconfigured_count do
61
+ key :type, :integer
62
+ key :description, "Number of unconfigured notification keys"
63
+ key :example, 1
64
+ end
65
+ property :unconfigured_notification_keys do
66
+ key :type, :array
67
+ items do
68
+ key :type, :string
69
+ key :example, "article.default"
70
+ end
71
+ key :description, "Unconfigured notification keys, which means array of configured notification keys of the target to configure subscriptions"
72
+ end
73
+ end
74
+ end
75
+ end
76
+ extend Swagger::ErrorResponses::InvalidParameterError
77
+ end
78
+
79
+ operation :post do
80
+ key :summary, 'Create subscription'
81
+ key :description, 'Creates new subscription.'
82
+ key :operationId, 'createSubscription'
83
+ key :tags, ['subscriptions']
84
+
85
+ extend Swagger::SubscriptionsParameters::TargetParameters
86
+ parameter do
87
+ key :name, :subscription
88
+ key :in, :body
89
+ key :description, 'Subscription parameters'
90
+ key :required, true
91
+ schema do
92
+ key :'$ref', :SubscriptionInput
93
+ end
94
+ end
95
+
96
+ response 201 do
97
+ key :description, "Created subscription"
98
+ content 'application/json' do
99
+ schema do
100
+ key :'$ref', :Subscription
101
+ end
102
+ end
103
+ end
104
+ extend Swagger::ErrorResponses::InvalidParameterError
105
+ extend Swagger::ErrorResponses::ResourceNotFoundError
106
+ extend Swagger::ErrorResponses::UnprocessableEntityError
107
+ end
108
+ end
109
+
110
+ swagger_path '/{target_type}/{target_id}/subscriptions/find' do
111
+ operation :get do
112
+ key :summary, 'Find subscription'
113
+ key :description, 'Find and returns a single subscription.'
114
+ key :operationId, 'findSubscription'
115
+ key :tags, ['subscriptions']
116
+
117
+ extend Swagger::SubscriptionsParameters::TargetParameters
118
+ parameter do
119
+ key :name, :key
120
+ key :in, :query
121
+ key :description, "Key of the subscription to find"
122
+ key :required, true
123
+ key :type, :string
124
+ end
125
+
126
+ response 200 do
127
+ key :description, "Found single subscription"
128
+ content 'application/json' do
129
+ schema do
130
+ key :'$ref', :Subscription
131
+ end
132
+ end
133
+ end
134
+ extend Swagger::ErrorResponses::InvalidParameterError
135
+ extend Swagger::ErrorResponses::ResourceNotFoundError
136
+ end
137
+ end
138
+
139
+ swagger_path '/{target_type}/{target_id}/subscriptions/optional_target_names' do
140
+ operation :get do
141
+ key :summary, 'Find configured optional_target names'
142
+ key :description, 'Finds and returns configured optional_target names from specified key.'
143
+ key :operationId, 'findOptionalTargetNames'
144
+ key :tags, ['subscriptions']
145
+
146
+ extend Swagger::SubscriptionsParameters::TargetParameters
147
+ parameter do
148
+ key :name, :key
149
+ key :in, :query
150
+ key :description, "Key of the notification and subscription to find"
151
+ key :required, true
152
+ key :type, :string
153
+ end
154
+
155
+ response 200 do
156
+ key :description, "Found configured optional_target names"
157
+ content 'application/json' do
158
+ schema do
159
+ key :type, :object
160
+ property :configured_count do
161
+ key :type, :integer
162
+ key :description, "Number of configured optional_target names"
163
+ key :example, 1
164
+ end
165
+ property :optional_target_names do
166
+ key :type, :array
167
+ items do
168
+ key :type, :string
169
+ key :example, "action_cable_channel"
170
+ end
171
+ key :description, "Configured optional_target names"
172
+ end
173
+ end
174
+ end
175
+ end
176
+ extend Swagger::ErrorResponses::InvalidParameterError
177
+ extend Swagger::ErrorResponses::ResourceNotFoundError
178
+ end
179
+ end
180
+
181
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}' do
182
+ operation :get do
183
+ key :summary, 'Get subscription'
184
+ key :description, 'Returns a single subscription.'
185
+ key :operationId, 'getSubscription'
186
+ key :tags, ['subscriptions']
187
+
188
+ extend Swagger::SubscriptionsParameters::TargetParameters
189
+ extend Swagger::SubscriptionsParameters::IdParameter
190
+
191
+ response 200 do
192
+ key :description, "Found single subscription"
193
+ content 'application/json' do
194
+ schema do
195
+ key :'$ref', :Subscription
196
+ end
197
+ end
198
+ end
199
+ extend Swagger::ErrorResponses::InvalidParameterError
200
+ extend Swagger::ErrorResponses::ForbiddenError
201
+ extend Swagger::ErrorResponses::ResourceNotFoundError
202
+ end
203
+
204
+ operation :delete do
205
+ key :summary, 'Delete subscription'
206
+ key :description, 'Deletes a subscription.'
207
+ key :operationId, 'deleteSubscription'
208
+ key :tags, ['subscriptions']
209
+
210
+ extend Swagger::SubscriptionsParameters::TargetParameters
211
+ extend Swagger::SubscriptionsParameters::IdParameter
212
+
213
+ response 204 do
214
+ key :description, "No content as successfully deleted"
215
+ end
216
+ extend Swagger::ErrorResponses::InvalidParameterError
217
+ extend Swagger::ErrorResponses::ForbiddenError
218
+ extend Swagger::ErrorResponses::ResourceNotFoundError
219
+ end
220
+ end
221
+
222
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}/subscribe' do
223
+ operation :put do
224
+ key :summary, 'Subscribe to notifications'
225
+ key :description, 'Updates a subscription to subscribe to the notifications.'
226
+ key :operationId, 'subscribeNotifications'
227
+ key :tags, ['subscriptions']
228
+
229
+ extend Swagger::SubscriptionsParameters::TargetParameters
230
+ extend Swagger::SubscriptionsParameters::IdParameter
231
+ parameter do
232
+ key :name, :with_email_subscription
233
+ key :in, :query
234
+ key :description, "Whether the subscriber (target) also subscribes notification email"
235
+ key :required, false
236
+ key :type, :boolean
237
+ key :default, true
238
+ end
239
+ parameter do
240
+ key :name, :with_optional_targets
241
+ key :in, :query
242
+ key :description, "Whether the subscriber (target) also subscribes optional targets"
243
+ key :required, false
244
+ key :type, :boolean
245
+ key :default, true
246
+ end
247
+
248
+ response 200 do
249
+ key :description, "Updated subscription"
250
+ content 'application/json' do
251
+ schema do
252
+ key :'$ref', :Subscription
253
+ end
254
+ end
255
+ end
256
+ extend Swagger::ErrorResponses::InvalidParameterError
257
+ extend Swagger::ErrorResponses::ForbiddenError
258
+ extend Swagger::ErrorResponses::ResourceNotFoundError
259
+ extend Swagger::ErrorResponses::UnprocessableEntityError
260
+ end
261
+ end
262
+
263
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}/unsubscribe' do
264
+ operation :put do
265
+ key :summary, 'Unsubscribe to notifications'
266
+ key :description, 'Updates a subscription to unsubscribe to the notifications.'
267
+ key :operationId, 'unsubscribeNotifications'
268
+ key :tags, ['subscriptions']
269
+
270
+ extend Swagger::SubscriptionsParameters::TargetParameters
271
+ extend Swagger::SubscriptionsParameters::IdParameter
272
+
273
+ response 200 do
274
+ key :description, "Updated subscription"
275
+ content 'application/json' do
276
+ schema do
277
+ key :'$ref', :Subscription
278
+ end
279
+ end
280
+ end
281
+ extend Swagger::ErrorResponses::InvalidParameterError
282
+ extend Swagger::ErrorResponses::ForbiddenError
283
+ extend Swagger::ErrorResponses::ResourceNotFoundError
284
+ extend Swagger::ErrorResponses::UnprocessableEntityError
285
+ end
286
+ end
287
+
288
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}/subscribe_to_email' do
289
+ operation :put do
290
+ key :summary, 'Subscribe to notification email'
291
+ key :description, 'Updates a subscription to subscribe to the notification email.'
292
+ key :operationId, 'subscribeNotificationEmail'
293
+ key :tags, ['subscriptions']
294
+
295
+ extend Swagger::SubscriptionsParameters::TargetParameters
296
+ extend Swagger::SubscriptionsParameters::IdParameter
297
+
298
+ response 200 do
299
+ key :description, "Updated subscription"
300
+ content 'application/json' do
301
+ schema do
302
+ key :'$ref', :Subscription
303
+ end
304
+ end
305
+ end
306
+ extend Swagger::ErrorResponses::InvalidParameterError
307
+ extend Swagger::ErrorResponses::ForbiddenError
308
+ extend Swagger::ErrorResponses::ResourceNotFoundError
309
+ extend Swagger::ErrorResponses::UnprocessableEntityError
310
+ end
311
+ end
312
+
313
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}/unsubscribe_to_email' do
314
+ operation :put do
315
+ key :summary, 'Unsubscribe to notification email'
316
+ key :description, 'Updates a subscription to unsubscribe to the notification email.'
317
+ key :operationId, 'unsubscribeNotificationEmail'
318
+ key :tags, ['subscriptions']
319
+
320
+ extend Swagger::SubscriptionsParameters::TargetParameters
321
+ extend Swagger::SubscriptionsParameters::IdParameter
322
+
323
+ response 200 do
324
+ key :description, "Updated subscription"
325
+ content 'application/json' do
326
+ schema do
327
+ key :'$ref', :Subscription
328
+ end
329
+ end
330
+ end
331
+ extend Swagger::ErrorResponses::InvalidParameterError
332
+ extend Swagger::ErrorResponses::ForbiddenError
333
+ extend Swagger::ErrorResponses::ResourceNotFoundError
334
+ extend Swagger::ErrorResponses::UnprocessableEntityError
335
+ end
336
+ end
337
+
338
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}/subscribe_to_optional_target' do
339
+ operation :put do
340
+ key :summary, 'Subscribe to optional target'
341
+ key :description, 'Updates a subscription to subscribe to the specified optional target.'
342
+ key :operationId, 'subscribeOptionalTarget'
343
+ key :tags, ['subscriptions']
344
+
345
+ extend Swagger::SubscriptionsParameters::TargetParameters
346
+ extend Swagger::SubscriptionsParameters::IdParameter
347
+ parameter do
348
+ key :name, :optional_target_name
349
+ key :in, :query
350
+ key :description, "Class name of the optional target implementation: e.g. 'amazon_sns', 'slack' and so on"
351
+ key :required, true
352
+ key :type, :string
353
+ key :example, "slack"
354
+ end
355
+
356
+ response 200 do
357
+ key :description, "Updated subscription"
358
+ content 'application/json' do
359
+ schema do
360
+ key :'$ref', :Subscription
361
+ end
362
+ end
363
+ end
364
+ extend Swagger::ErrorResponses::InvalidParameterError
365
+ extend Swagger::ErrorResponses::ForbiddenError
366
+ extend Swagger::ErrorResponses::ResourceNotFoundError
367
+ extend Swagger::ErrorResponses::UnprocessableEntityError
368
+ end
369
+ end
370
+
371
+ swagger_path '/{target_type}/{target_id}/subscriptions/{id}/unsubscribe_to_optional_target' do
372
+ operation :put do
373
+ key :summary, 'Unsubscribe to optional target'
374
+ key :description, 'Updates a subscription to unsubscribe to the specified optional target.'
375
+ key :operationId, 'unsubscribeOptionalTarget'
376
+ key :tags, ['subscriptions']
377
+
378
+ extend Swagger::SubscriptionsParameters::TargetParameters
379
+ extend Swagger::SubscriptionsParameters::IdParameter
380
+ parameter do
381
+ key :name, :optional_target_name
382
+ key :in, :query
383
+ key :description, "Class name of the optional target implementation: e.g. 'amazon_sns', 'slack' and so on"
384
+ key :required, true
385
+ key :type, :string
386
+ key :example, "slack"
387
+ end
388
+
389
+ response 200 do
390
+ key :description, "Updated subscription"
391
+ content 'application/json' do
392
+ schema do
393
+ key :'$ref', :Subscription
394
+ end
395
+ end
396
+ end
397
+ extend Swagger::ErrorResponses::InvalidParameterError
398
+ extend Swagger::ErrorResponses::ForbiddenError
399
+ extend Swagger::ErrorResponses::ResourceNotFoundError
400
+ extend Swagger::ErrorResponses::UnprocessableEntityError
401
+ end
402
+ end
403
+ end
404
+ end
405
+ end
@@ -0,0 +1,50 @@
1
+ module ActivityNotification
2
+ module Swagger::SubscriptionsParameters #:nodoc:
3
+ module TargetParameters #:nodoc:
4
+ def self.extended(base)
5
+ base.parameter do
6
+ key :name, :target_type
7
+ key :in, :path
8
+ key :description, "Target type of subscriptions: e.g. 'users'"
9
+ key :required, true
10
+ key :type, :string
11
+ key :example, "users"
12
+ end
13
+ base.parameter do
14
+ key :name, :target_id
15
+ key :in, :path
16
+ key :description, "Target ID of subscriptions. This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs."
17
+ key :required, true
18
+ key :type, :string
19
+ key :example, 1
20
+ end
21
+ end
22
+ end
23
+
24
+ module IdParameter #:nodoc:
25
+ def self.extended(base)
26
+ base.parameter do
27
+ key :name, :id
28
+ key :in, :path
29
+ key :description, 'ID of subscription record. This parameter type is integer with ActiveRecord, but will be string with Mongoid or Dynamoid ORMs.'
30
+ key :required, true
31
+ key :type, :string
32
+ key :example, 123
33
+ end
34
+ end
35
+ end
36
+
37
+ module FilterByParameters #:nodoc:
38
+ def self.extended(base)
39
+ base.parameter do
40
+ key :name, :filtered_by_key
41
+ key :in, :query
42
+ key :description, "Key of subscriptions to filter subscription index: e.g. 'comment.default'"
43
+ key :required, false
44
+ key :type, :string
45
+ key :example, "comment.default"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -2,6 +2,7 @@ module ActivityNotification
2
2
  # Module included in controllers to authenticate with Devise module
3
3
  module DeviseAuthenticationController
4
4
  extend ActiveSupport::Concern
5
+ include CommonController
5
6
 
6
7
  included do
7
8
  prepend_before_action :authenticate_devise_resource!
@@ -13,28 +14,44 @@ module ActivityNotification
13
14
  # Authenticate devise resource by Devise (e.g. calling authenticate_user! method).
14
15
  # @api protected
15
16
  # @todo Needs to call authenticate method by more secure way
16
- # @return [Responce] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
17
+ # @return [Response] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
17
18
  def authenticate_devise_resource!
18
19
  if params[:devise_type].present?
19
20
  authenticate_method_name = "authenticate_#{params[:devise_type].to_resource_name}!"
20
21
  if respond_to?(authenticate_method_name)
21
22
  send(authenticate_method_name)
22
23
  else
23
- render plain: "403 Forbidden: Unauthenticated", status: 403
24
+ render status: 403, json: error_response(code: 403, message: "Unauthenticated with Devise")
24
25
  end
25
26
  else
26
- render plain: "400 Bad Request: Missing parameter", status: 400
27
+ render status: 400, json: error_response(code: 400, message: "Invalid parameter", type: "Missing devise_type")
27
28
  end
28
29
  end
29
30
 
31
+ # Sets @target instance variable from request parameters.
32
+ # This method override super (ActivityNotiication::CommonController#set_target)
33
+ # to set devise authenticated target when the target_id params is not specified.
34
+ # @api protected
35
+ # @return [Object] Target instance (Returns HTTP 400 when request parameters are not enough)
36
+ def set_target
37
+ target_type = params[:target_type]
38
+ if params[:target_id].blank? && params["#{target_type.to_resource_name}_id"].blank?
39
+ target_class = target_type.to_model_class
40
+ current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
41
+ params[:target_id] = target_class.resolve_current_devise_target(send(current_resource_method_name))
42
+ render status: 403, json: error_response(code: 403, message: "Unauthenticated as default target") and return if params[:target_id].blank?
43
+ end
44
+ super
45
+ end
46
+
30
47
  # Authenticate the target of requested notification with authenticated devise resource.
31
48
  # @api protected
32
49
  # @todo Needs to call authenticate method by more secure way
33
- # @return [Responce] Returns HTTP 403 for unauthorized target
50
+ # @return [Response] Returns HTTP 403 for unauthorized target
34
51
  def authenticate_target!
35
52
  current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
36
53
  unless @target.authenticated_with_devise?(send(current_resource_method_name))
37
- render plain: "403 Forbidden: Unauthorized target", status: 403
54
+ render status: 403, json: error_response(code: 403, message: "Unauthorized target")
38
55
  end
39
56
  end
40
57
  end
@@ -0,0 +1,14 @@
1
+ module ActivityNotification
2
+ # Returns the version of the currently loaded ActivityNotification as a Gem::Version
3
+ def self.gem_version
4
+ Gem::Version.new VERSION
5
+ end
6
+
7
+ # Manages individual gem version from Gem::Version
8
+ module GEM_VERSION
9
+ MAJOR = VERSION.split(".")[0]
10
+ MINOR = VERSION.split(".")[1]
11
+ TINY = VERSION.split(".")[2]
12
+ PRE = VERSION.split(".")[3]
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ module ActivityNotification
2
+ class ConfigError < StandardError; end
3
+ class DeleteRestrictionError < StandardError; end
4
+ class NotifiableNotFoundError < StandardError; end
5
+ class RecordInvalidError < StandardError; end
6
+ end