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,27 @@
1
+ unless ENV['AN_TEST_DB'] == 'mongodb'
2
+ class Dummy::DummyNotifiableTarget < ActiveRecord::Base
3
+ self.table_name = :users
4
+ acts_as_target
5
+ acts_as_notifiable :dummy_notifiable_targets, targets: -> (n, key) { Dummy::DummyNotifiableTarget.all }, tracked: true
6
+
7
+ def notifiable_path(target_type, key = nil)
8
+ "dummy_path"
9
+ end
10
+ end
11
+ else
12
+ class Dummy::DummyNotifiableTarget
13
+ include Mongoid::Document
14
+ include Mongoid::Timestamps
15
+ include GlobalID::Identification
16
+ field :email, type: String, default: ""
17
+ field :name, type: String
18
+
19
+ include ActivityNotification::Models
20
+ acts_as_target
21
+ acts_as_notifiable :dummy_notifiable_targets, targets: -> (n, key) { Dummy::DummyNotifiableTarget.all }, tracked: true
22
+
23
+ def notifiable_path(target_type, key = nil)
24
+ "dummy_path"
25
+ end
26
+ end
27
+ end
@@ -7,6 +7,7 @@ else
7
7
  class Dummy::DummyNotifier
8
8
  include Mongoid::Document
9
9
  include Mongoid::Timestamps
10
+ include GlobalID::Identification
10
11
  include ActivityNotification::Models
11
12
  include ActivityNotification::Notifier
12
13
  field :name, type: String
@@ -7,6 +7,7 @@ else
7
7
  class Dummy::DummySubscriber
8
8
  include Mongoid::Document
9
9
  include Mongoid::Timestamps
10
+ include GlobalID::Identification
10
11
  include ActivityNotification::Models
11
12
  acts_as_target email: 'dummy@example.com', email_allowed: true, batch_email_allowed: true, subscription_allowed: true
12
13
  end
@@ -7,6 +7,7 @@ else
7
7
  class Dummy::DummyTarget
8
8
  include Mongoid::Document
9
9
  include Mongoid::Timestamps
10
+ include GlobalID::Identification
10
11
  include ActivityNotification::Models
11
12
  include ActivityNotification::Target
12
13
  field :email, type: String, default: ""
@@ -1,29 +1,48 @@
1
- unless ENV['AN_TEST_DB'] == 'mongodb'
2
- class User < ActiveRecord::Base
3
- devise :database_authenticatable, :registerable, :confirmable
1
+ module UserModel
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ devise :database_authenticatable, :confirmable
6
+ include DeviseTokenAuth::Concerns::User
4
7
  validates :email, presence: true
5
- has_many :articles, dependent: :destroy
6
8
  has_one :admin, dependent: :destroy
9
+ has_many :articles, dependent: :destroy
10
+
11
+ acts_as_target email: :email,
12
+ email_allowed: :confirmed_at, batch_email_allowed: :confirmed_at,
13
+ subscription_allowed: true,
14
+ action_cable_allowed: true, action_cable_with_devise: true,
15
+ printable_name: :name
7
16
 
8
- acts_as_target email: :email, email_allowed: :confirmed_at, batch_email_allowed: :confirmed_at,
9
- subscription_allowed: true, printable_name: :name
10
17
  acts_as_notifier printable_name: :name
18
+ end
11
19
 
12
- def admin?
13
- admin.present?
14
- end
20
+ def admin?
21
+ admin.present?
22
+ end
23
+
24
+ def as_json(_options = {})
25
+ options = _options.deep_dup
26
+ options[:include] = (options[:include] || {}).merge(admin: { methods: [:printable_target_name, :notification_action_cable_allowed?, :notification_action_cable_with_devise?] })
27
+ options[:methods] = (options[:methods] || []).push(:printable_target_name, :notification_action_cable_allowed?, :notification_action_cable_with_devise?)
28
+ super(options)
29
+ end
30
+ end
31
+
32
+ unless ENV['AN_TEST_DB'] == 'mongodb'
33
+ class User < ActiveRecord::Base
34
+ include UserModel
35
+ default_scope { order(:id) }
15
36
  end
16
37
  else
17
38
  require 'mongoid'
39
+ require 'mongoid-locker'
18
40
  class User
19
41
  include Mongoid::Document
20
42
  include Mongoid::Timestamps
43
+ include Mongoid::Locker
21
44
  include GlobalID::Identification
22
45
 
23
- devise :database_authenticatable, :registerable, :confirmable
24
- has_many :articles, dependent: :destroy
25
- has_one :admin, dependent: :destroy
26
- validates :email, presence: true
27
46
  # Devise
28
47
  ## Database authenticatable
29
48
  field :email, type: String, default: ""
@@ -32,16 +51,23 @@ else
32
51
  field :confirmation_token, type: String
33
52
  field :confirmed_at, type: Time
34
53
  field :confirmation_sent_at, type: Time
54
+ ## Required
55
+ field :provider, type: String, default: "email"
56
+ field :uid, type: String, default: ""
57
+ ## Tokens
58
+ field :tokens, type: Hash, default: {}
35
59
  # Apps
36
60
  field :name, type: String
37
61
 
38
62
  include ActivityNotification::Models
39
- acts_as_target email: :email, email_allowed: :confirmed_at, batch_email_allowed: :confirmed_at,
40
- subscription_allowed: true, printable_name: :name
41
- acts_as_notifier printable_name: :name
63
+ include UserModel
42
64
 
43
- def admin?
44
- admin.present?
65
+ # To avoid Devise Token Auth issue
66
+ # https://github.com/lynndylanhurley/devise_token_auth/issues/1335
67
+ if Rails::VERSION::MAJOR == 6
68
+ def saved_change_to_attribute?(attr_name, **options)
69
+ true
70
+ end
45
71
  end
46
72
  end
47
73
  end
@@ -0,0 +1,146 @@
1
+ <% content_for :notification_content, flush: true do %>
2
+ <div class='notification_list <%= notification.opened? ? "opened" : "unopened" %>'>
3
+ <div class="notification_list_cover"></div>
4
+ <div class="list_image"></div>
5
+ <div class="list_text_wrapper">
6
+ <p class="list_text">
7
+ <strong><%= notification.notifier.name %></strong> updated his or her article "<%= notification.notifiable.title %>".
8
+ <br>
9
+ <span><%= notification.created_at.strftime("%b %d %H:%M") %></span>
10
+ </p>
11
+ </div>
12
+ </div>
13
+ <% end %>
14
+
15
+ <div class='<%= "notification_#{notification.id}" %>'>
16
+ <% if notification.unopened? %>
17
+ <%= link_to open_notification_path_for(notification, parameters.slice(:routing_scope, :devise_default_routes).merge(reload: false)), method: :put, remote: true, class: "unopened_wrapper" do %>
18
+ <div class="unopened_circle"></div>
19
+ <div class="unopened_description_wrapper">
20
+ <p class="unopened_description">Open</p>
21
+ </div>
22
+ <% end %>
23
+ <%= link_to open_notification_path_for(notification, parameters.slice(:routing_scope, :devise_default_routes).merge(move: true)), method: :put do %>
24
+ <%= yield :notification_content %>
25
+ <% end %>
26
+ <div class="unopened_wrapper"></div>
27
+ <% else %>
28
+ <%= link_to move_notification_path_for(notification, parameters.slice(:routing_scope, :devise_default_routes)) do %>
29
+ <%= yield :notification_content %>
30
+ <% end %>
31
+ <% end %>
32
+
33
+ </div>
34
+
35
+ <style>
36
+ /* unopened_circle */
37
+ .unopened_wrapper{
38
+ position: absolute;
39
+ margin-top: 20px;
40
+ margin-left: 56px;
41
+ }
42
+ .unopened_wrapper .unopened_circle {
43
+ display: block;
44
+ width: 10px;
45
+ height: 10px;
46
+ position: absolute;
47
+ border-radius: 50%;
48
+ background-color: #27a5eb;
49
+ z-index: 2;
50
+ }
51
+ .unopened_wrapper:hover > .unopened_description_wrapper{
52
+ display: block;
53
+ }
54
+ .unopened_wrapper .unopened_description_wrapper {
55
+ display: none;
56
+ position: absolute;
57
+ margin-top: 26px;
58
+ margin-left: -24px;
59
+ }
60
+ .unopened_wrapper .unopened_description_wrapper .unopened_description {
61
+ position: absolute;
62
+ color: #fff;
63
+ font-size: 12px;
64
+ text-align: center;
65
+
66
+ border-radius: 4px;
67
+ background: rgba(0, 0, 0, 0.8);
68
+ padding: 4px 12px;
69
+ z-index: 999;
70
+ }
71
+ .unopened_wrapper .unopened_description_wrapper .unopened_description:before {
72
+ border: solid transparent;
73
+ border-top-width: 0;
74
+ content: "";
75
+ display: block;
76
+ position: absolute;
77
+ width: 0;
78
+ left: 50%;
79
+ top: -5px;
80
+ margin-left: -5px;
81
+ height: 0;
82
+ border-width: 0 5px 5px 5px;
83
+ border-color: transparent transparent rgba(0, 0, 0, 0.8) transparent;
84
+ z-index: 0;
85
+ }
86
+
87
+ /* list */
88
+ .notification_list {
89
+ padding: 15px 10px;
90
+ position: relative;
91
+ border-bottom: 1px solid #e5e5e5;
92
+ }
93
+ .notification_list.unopened {
94
+ background-color: #eeeff4;
95
+ }
96
+ .notification_list:hover {
97
+ background-color: #f8f9fb;
98
+ }
99
+ .notification_list:last-child {
100
+ border-bottom: none;
101
+ }
102
+ .notification_list:after{
103
+ content: "";
104
+ clear: both;
105
+ display: block;
106
+ }
107
+ .notification_list .notification_list_cover{
108
+ position: absolute;
109
+ opacity: 0;
110
+ top: 0;
111
+ left: 0;
112
+ width: 100%;
113
+ height: 100%;
114
+ z-index: 1;
115
+
116
+ }
117
+ .notification_list .list_image {
118
+ float: left;
119
+ width: 40px;
120
+ height: 40px;
121
+ background-position: center;
122
+ background-repeat: no-repeat;
123
+ background-size: cover;
124
+ background-color: #979797;
125
+ }
126
+ .notification_list .list_text_wrapper {
127
+ float: left;
128
+ width: calc(100% - 60px);
129
+ margin-left: 20px;
130
+ }
131
+ .notification_list .list_text_wrapper .list_text {
132
+ color: #4f4f4f;
133
+ font-size: 14px;
134
+ line-height: 1.4;
135
+ margin-top: 0;
136
+ height: auto;
137
+ font-weight: normal;
138
+ }
139
+ .notification_list .list_text_wrapper .list_text strong{
140
+ font-weight: bold;
141
+ }
142
+ .notification_list .list_text_wrapper .list_text span {
143
+ color: #979797;
144
+ font-size: 13px;
145
+ }
146
+ </style>
@@ -0,0 +1 @@
1
+ Overridden custom template root for user target: <%= notification.id %>
@@ -5,6 +5,6 @@ Dear <%= @target.printable_target_name %>
5
5
  <%= @notification.notifier.present? ? @notification.notifier.printable_notifier_name : 'Someone' %> notified you of <%= @notification.notifiable.printable_notifiable_name(@notification.target) %><%= " in #{@notification.group.printable_group_name}" if @notification.group.present? %>.
6
6
 
7
7
  <%= "Move to notified #{@notification.notifiable.printable_type.downcase}:" %>
8
- <%= move_notification_url_for(@notification, open: true) %>
8
+ <%= move_notification_url_for(@notification, parameters.slice(:routing_scope, :devise_default_routes).merge(open: true)) %>
9
9
 
10
10
  Thank you!
@@ -1,38 +1,86 @@
1
- <section>
2
- <h1>Listing Users</h1>
3
- <% User.all.each do |user| %>
1
+ <% if @exists_notifications_routes %>
2
+ <section>
3
+ <h1>Authentecated User</h1>
4
4
  <div class="list_wrapper">
5
5
  <div class="list_image"></div>
6
6
  <div class="list_description_wrapper">
7
7
  <p class="list_description">
8
- <span><%= user.name %></span> · <%= user.email %><br>
9
- <%= link_to 'Notifications', user_notifications_path(user) %>
8
+ <% if user_signed_in? %>
9
+ <span><%= current_user.name %></span> · <%= current_user.email %> · <%= link_to 'Logout', destroy_user_session_path, method: :delete %><br>
10
+ <% else %>
11
+ <span>Not logged in</span> · <%= link_to 'Login', new_user_session_path %><br>
12
+ <% end %>
13
+ <%= link_to 'Notifications', notifications_path %> /
10
14
  <% if User.subscription_enabled? %>
11
- <%= link_to 'Subscriptions', user_subscriptions_path(user) %>
15
+ <%= link_to 'Subscriptions', subscriptions_path %>
12
16
  <% end %>
13
17
  </p>
14
18
  </div>
15
19
  </div>
16
- <% end %>
17
- </section>
20
+ </section>
21
+ <% end %>
18
22
 
19
- <section>
20
- <h1>Listing Admins</h1>
21
- <% Admin.all.each do |admin| %>
23
+ <% if @exists_user_notifications_routes %>
24
+ <section>
25
+ <h1>Listing Users</h1>
26
+ <% User.all.each do |user| %>
27
+ <div class="list_wrapper">
28
+ <div class="list_image"></div>
29
+ <div class="list_description_wrapper">
30
+ <p class="list_description">
31
+ <span><%= user.name %></span> · <%= user.email %><br>
32
+ <%= link_to 'Notifications', user_notifications_path(user) %> /
33
+ <% if User.subscription_enabled? %>
34
+ <%= link_to 'Subscriptions', user_subscriptions_path(user) %>
35
+ <% end %>
36
+ </p>
37
+ </div>
38
+ </div>
39
+ <% end %>
40
+ </section>
41
+ <% end %>
42
+
43
+ <% if @exists_admins_notifications_routes %>
44
+ <section>
45
+ <h1>Authentecated User as Admin</h1>
22
46
  <div class="list_wrapper">
23
47
  <div class="list_image"></div>
24
48
  <div class="list_description_wrapper">
25
49
  <p class="list_description">
26
- <span><%= admin.user.name %></span> · <%= admin.user.email %><br>
27
- <%= link_to 'Notifications', admin_notifications_path(admin) %>
28
- <% if Admin.subscription_enabled? %>
29
- <%= link_to 'Subscriptions', admin_subscriptions_path(admin) %>
50
+ <% if user_signed_in? %>
51
+ <span><%= current_user.name %></span> · <%= current_user.email %> <span><%= current_user.admin? ? "(admin)" : "(not admin)" %></span><br>
52
+ <% else %>
53
+ <span>Not logged in</span> · <%= link_to 'Login', new_user_session_path %><br>
54
+ <% end %>
55
+ <%= link_to 'Notifications', admins_notifications_path %> /
56
+ <% if User.subscription_enabled? %>
57
+ <%= link_to 'Subscriptions', admins_subscriptions_path %>
30
58
  <% end %>
31
59
  </p>
32
60
  </div>
33
61
  </div>
34
- <% end %>
35
- </section>
62
+ </section>
63
+ <% end %>
64
+
65
+ <% if @exists_admin_notifications_routes %>
66
+ <section>
67
+ <h1>Listing Admins</h1>
68
+ <% Admin.all.each do |admin| %>
69
+ <div class="list_wrapper">
70
+ <div class="list_image"></div>
71
+ <div class="list_description_wrapper">
72
+ <p class="list_description">
73
+ <span><%= admin.user.name %></span> · <%= admin.user.email %><br>
74
+ <%= link_to 'Notifications', admin_notifications_path(admin) %> /
75
+ <% if Admin.subscription_enabled? %>
76
+ <%= link_to 'Subscriptions', admin_subscriptions_path(admin) %>
77
+ <% end %>
78
+ </p>
79
+ </div>
80
+ </div>
81
+ <% end %>
82
+ </section>
83
+ <% end %>
36
84
 
37
85
  <section>
38
86
  <div class="create_button_wrapper">
@@ -55,9 +103,9 @@
55
103
  <% if user_signed_in? and article.author?(current_user) %>
56
104
  <%= link_to 'Edit Article', edit_article_path(article), class: "gray_button" %>
57
105
  <% end %>
58
- <% if user_signed_in? and (article.author?(current_user) or current_user.admin?) %>
59
- <%= link_to 'Destroy Article', article, method: :delete, data: { confirm: 'Are you sure?' }, class: "gray_button" %>
60
- <% end %>
106
+ <%# if user_signed_in? and (article.author?(current_user) or current_user.admin?) %>
107
+ <%#= link_to 'Destroy Article', article, method: :delete, data: { confirm: 'Are you sure?' }, class: "gray_button" %>
108
+ <%# end %>
61
109
  </div>
62
110
  </div>
63
111
  </div>
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
  <div class="list_button_wrapper">
11
11
  <%= link_to 'Edit Article', edit_article_path(@article), class: "gray_button" %>
12
- <%= link_to 'Destroy Article', @article, method: :delete, data: { confirm: 'Are you sure?' }, class: "gray_button" %>
12
+ <%#= link_to 'Destroy Article', @article, method: :delete, data: { confirm: 'Are you sure?' }, class: "gray_button" %>
13
13
  </div>
14
14
  </div>
15
15
  </div>
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
  <div class="header_notification_wrapper">
26
26
  <% if user_signed_in? %>
27
- <%= render_notifications_of current_user, fallback: :default, index_content: :with_attributes %>
27
+ <%= render_notifications_of current_user, fallback: :default, index_content: :with_attributes, devise_default_routes: respond_to?('notifications_path') %>
28
28
  <%#= render_notifications_of current_user, fallback: :default, index_content: :unopened_with_attributes, reverse: true %>
29
29
  <%#= render_notifications_of current_user, fallback: :default, index_content: :with_attributes, as_latest_group_member: true %>
30
30
  <%#= render_notifications_of current_user, fallback: :default_without_grouping, index_content: :with_attributes, with_group_members: true %>
@@ -32,8 +32,14 @@
32
32
  </div>
33
33
  <div class="header_menu_wrapper">
34
34
  <p>
35
- <%= link_to 'Preview email', "/rails/mailers" %>
36
- <%= " · " unless user_signed_in? %>
35
+ <%= link_to 'Preview Email', "/rails/mailers" %>
36
+ <%= " · " if !user_signed_in? or (current_user.admin? and respond_to?('admins_notifications_path')) %>
37
+ </p>
38
+ </div>
39
+ <div class="header_menu_wrapper">
40
+ <p>
41
+ <%= link_to 'SPA', "/spa/" %>
42
+ <%= " · " %>
37
43
  </p>
38
44
  </div>
39
45
  </div>
@@ -0,0 +1,2 @@
1
+ <div id='spa'/>
2
+ <%= javascript_pack_tag 'spa' %>
@@ -0,0 +1,72 @@
1
+ module.exports = function(api) {
2
+ var validEnv = ['development', 'test', 'production']
3
+ var currentEnv = api.env()
4
+ var isDevelopmentEnv = api.env('development')
5
+ var isProductionEnv = api.env('production')
6
+ var isTestEnv = api.env('test')
7
+
8
+ if (!validEnv.includes(currentEnv)) {
9
+ throw new Error(
10
+ 'Please specify a valid `NODE_ENV` or ' +
11
+ '`BABEL_ENV` environment variables. Valid values are "development", ' +
12
+ '"test", and "production". Instead, received: ' +
13
+ JSON.stringify(currentEnv) +
14
+ '.'
15
+ )
16
+ }
17
+
18
+ return {
19
+ presets: [
20
+ isTestEnv && [
21
+ '@babel/preset-env',
22
+ {
23
+ targets: {
24
+ node: 'current'
25
+ }
26
+ }
27
+ ],
28
+ (isProductionEnv || isDevelopmentEnv) && [
29
+ '@babel/preset-env',
30
+ {
31
+ forceAllTransforms: true,
32
+ useBuiltIns: 'entry',
33
+ corejs: 3,
34
+ modules: false,
35
+ exclude: ['transform-typeof-symbol']
36
+ }
37
+ ]
38
+ ].filter(Boolean),
39
+ plugins: [
40
+ 'babel-plugin-macros',
41
+ '@babel/plugin-syntax-dynamic-import',
42
+ isTestEnv && 'babel-plugin-dynamic-import-node',
43
+ '@babel/plugin-transform-destructuring',
44
+ [
45
+ '@babel/plugin-proposal-class-properties',
46
+ {
47
+ loose: true
48
+ }
49
+ ],
50
+ [
51
+ '@babel/plugin-proposal-object-rest-spread',
52
+ {
53
+ useBuiltIns: true
54
+ }
55
+ ],
56
+ [
57
+ '@babel/plugin-transform-runtime',
58
+ {
59
+ helpers: false,
60
+ regenerator: true,
61
+ corejs: false
62
+ }
63
+ ],
64
+ [
65
+ '@babel/plugin-transform-regenerator',
66
+ {
67
+ async: false
68
+ }
69
+ ]
70
+ ].filter(Boolean)
71
+ }
72
+ }
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "bundler/setup"
11
+
12
+ require "webpacker"
13
+ require "webpacker/webpack_runner"
14
+
15
+ APP_ROOT = File.expand_path("..", __dir__)
16
+ Dir.chdir(APP_ROOT) do
17
+ Webpacker::WebpackRunner.run(ARGV)
18
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "bundler/setup"
11
+
12
+ require "webpacker"
13
+ require "webpacker/dev_server_runner"
14
+
15
+ APP_ROOT = File.expand_path("..", __dir__)
16
+ Dir.chdir(APP_ROOT) do
17
+ Webpacker::DevServerRunner.run(ARGV)
18
+ end
@@ -4,30 +4,50 @@ require File.expand_path('../boot', __FILE__)
4
4
  if ENV['AN_ORM'] == 'mongoid'
5
5
  require 'mongoid'
6
6
  require 'rails'
7
- if Rails.env != 'test'
7
+ unless Rails.env.test?
8
8
  Mongoid.load!(File.expand_path("config/mongoid.yml"), :development)
9
9
  end
10
+ # Load dynamoid configuration if necessary:
11
+ elsif ENV['AN_ORM'] == 'dynamoid'
12
+ require 'dynamoid'
13
+ require 'rails'
14
+ require File.expand_path('../dynamoid', __FILE__)
10
15
  end
11
16
 
12
17
  # Pick the frameworks you want:
13
- unless ENV['AN_ORM'] == 'mongoid' && ENV['AN_TEST_DB'] == 'mongodb'
18
+ if ENV['AN_ORM'] == 'mongoid' && ENV['AN_TEST_DB'] == 'mongodb'
19
+ require "mongoid/railtie"
20
+ else
14
21
  require "active_record/railtie"
15
22
  end
16
23
  require "action_controller/railtie"
17
24
  require "action_mailer/railtie"
18
25
  require "action_view/railtie"
19
26
  require "sprockets/railtie"
20
- # require "rails/test_unit/railtie"
27
+ require 'action_cable/engine'
21
28
 
22
29
  Bundler.require(*Rails.groups)
23
30
  require "activity_notification"
24
31
 
25
32
  module Dummy
26
33
  class Application < Rails::Application
27
- # Do not swallow errors in after_commit/after_rollback callbacks.
28
- if Rails::VERSION::MAJOR == 4 && Rails::VERSION::MINOR >= 2 && ENV['AN_TEST_DB'] != 'mongodb'
29
- config.active_record.raise_in_transactional_callbacks = true
34
+ if Gem::Version.new("5.2.0") <= Rails.gem_version && Rails.gem_version < Gem::Version.new("6.0.0") && ENV['AN_TEST_DB'] != 'mongodb'
35
+ config.active_record.sqlite3.represent_boolean_as_integer = true
36
+ end
37
+
38
+ # Configure CORS for API mode
39
+ if defined?(Rack::Cors)
40
+ config.middleware.insert_before 0, Rack::Cors do
41
+ allow do
42
+ origins '*'
43
+ resource '*',
44
+ headers: :any,
45
+ expose: ['access-token', 'client', 'uid'],
46
+ methods: [:get, :post, :put, :delete]
47
+ end
48
+ end
30
49
  end
31
50
  end
32
51
  end
33
52
 
53
+ puts "ActivityNotification test parameters: AN_ORM=#{ENV['AN_ORM'] || 'active_record(default)'} AN_TEST_DB=#{ENV['AN_TEST_DB'] || 'sqlite(default)'}"
@@ -0,0 +1,8 @@
1
+ production:
2
+ adapter: async
3
+
4
+ development:
5
+ adapter: async
6
+
7
+ test:
8
+ adapter: test
@@ -23,7 +23,7 @@ mongodb: &mongodb
23
23
  default: &default
24
24
  pool: 5
25
25
  timeout: 5000
26
- host: localhost
26
+ host: 127.0.0.1
27
27
  <<: *<%= ENV['AN_TEST_DB'].blank? ? "sqlite" : ENV['AN_TEST_DB'] %>
28
28
 
29
29
  development:
@@ -0,0 +1,13 @@
1
+ Dynamoid.configure do |config|
2
+ config.namespace = ENV['AN_NO_DYNAMODB_NAMESPACE'] ? "" : "activity_notification_#{Rails.env}"
3
+ # TODO Update Dynamoid v3.4.0+
4
+ # config.capacity_mode = :on_demand
5
+ config.read_capacity = 5
6
+ config.write_capacity = 5
7
+ unless Rails.env.production?
8
+ config.endpoint = 'http://localhost:8000'
9
+ end
10
+ unless Rails.env.test?
11
+ config.store_datetime_as_string = true
12
+ end
13
+ end