activity_notification 1.6.1 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +41 -3
- data/app/jobs/activity_notification/notify_all_job.rb +9 -0
- data/app/jobs/activity_notification/notify_job.rb +9 -0
- data/app/jobs/activity_notification/notify_to_job.rb +9 -0
- data/lib/activity_notification/apis/notification_api.rb +114 -18
- data/lib/activity_notification/config.rb +20 -0
- data/lib/activity_notification/models/concerns/notifiable.rb +63 -0
- data/lib/activity_notification/models/concerns/target.rb +23 -2
- data/lib/activity_notification/roles/acts_as_notifiable.rb +8 -0
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/templates/activity_notification.rb +6 -0
- data/lib/generators/templates/migrations/migration.rb +5 -5
- data/spec/concerns/apis/notification_api_spec.rb +107 -0
- data/spec/concerns/models/notifiable_spec.rb +25 -4
- data/spec/concerns/models/subscriber_spec.rb +11 -11
- data/spec/concerns/models/target_spec.rb +9 -2
- data/spec/generators/migration/migration_generator_spec.rb +37 -4
- data/spec/jobs/notify_all_job_spec.rb +23 -0
- data/spec/jobs/notify_job_spec.rb +23 -0
- data/spec/jobs/notify_to_job_spec.rb +23 -0
- data/spec/rails_app/app/controllers/comments_controller.rb +4 -1
- data/spec/rails_app/app/models/dummy/dummy_base.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_group.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_notifiable.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_notifier.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_subscriber.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_target.rb +1 -0
- data/spec/rails_app/config/initializers/activity_notification.rb +6 -0
- data/spec/rails_app/db/migrate/{20160715050433_create_test_tables.rb → 20160716000000_create_test_tables.rb} +1 -1
- data/spec/rails_app/db/migrate/{20160715050420_create_activity_notification_tables.rb → 20181209000000_create_activity_notification_tables.rb} +3 -3
- data/spec/rails_app/db/schema.rb +43 -43
- data/spec/roles/acts_as_notifiable_spec.rb +45 -0
- metadata +15 -6
@@ -0,0 +1,23 @@
|
|
1
|
+
describe ActivityNotification::NotifyAllJob, type: :job do
|
2
|
+
before do
|
3
|
+
ActiveJob::Base.queue_adapter = :test
|
4
|
+
ActiveJob::Base.queue_adapter.enqueued_jobs.clear
|
5
|
+
@author_user = create(:confirmed_user)
|
6
|
+
@user = create(:confirmed_user)
|
7
|
+
@article = create(:article, user: @author_user)
|
8
|
+
@comment = create(:comment, article: @article, user: @user)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#perform_later" do
|
12
|
+
it "generates notifications" do
|
13
|
+
expect {
|
14
|
+
ActivityNotification::NotifyAllJob.perform_later([@author_user, @user], @comment)
|
15
|
+
}.to have_enqueued_job
|
16
|
+
end
|
17
|
+
|
18
|
+
it "generates notifications once" do
|
19
|
+
ActivityNotification::NotifyAllJob.perform_later([@author_user, @user], @comment)
|
20
|
+
expect(ActivityNotification::NotifyAllJob).to have_been_enqueued.exactly(:once)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe ActivityNotification::NotifyJob, type: :job do
|
2
|
+
before do
|
3
|
+
ActiveJob::Base.queue_adapter = :test
|
4
|
+
ActiveJob::Base.queue_adapter.enqueued_jobs.clear
|
5
|
+
@author_user = create(:confirmed_user)
|
6
|
+
@user = create(:confirmed_user)
|
7
|
+
@article = create(:article, user: @author_user)
|
8
|
+
@comment = create(:comment, article: @article, user: @user)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#perform_later" do
|
12
|
+
it "generates notifications" do
|
13
|
+
expect {
|
14
|
+
ActivityNotification::NotifyJob.perform_later('users', @comment)
|
15
|
+
}.to have_enqueued_job
|
16
|
+
end
|
17
|
+
|
18
|
+
it "generates notifications once" do
|
19
|
+
ActivityNotification::NotifyJob.perform_later('users', @comment)
|
20
|
+
expect(ActivityNotification::NotifyJob).to have_been_enqueued.exactly(:once)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe ActivityNotification::NotifyToJob, type: :job do
|
2
|
+
before do
|
3
|
+
ActiveJob::Base.queue_adapter = :test
|
4
|
+
ActiveJob::Base.queue_adapter.enqueued_jobs.clear
|
5
|
+
@author_user = create(:confirmed_user)
|
6
|
+
@user = create(:confirmed_user)
|
7
|
+
@article = create(:article, user: @author_user)
|
8
|
+
@comment = create(:comment, article: @article, user: @user)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#perform_later" do
|
12
|
+
it "generates notification" do
|
13
|
+
expect {
|
14
|
+
ActivityNotification::NotifyToJob.perform_later(@user, @comment)
|
15
|
+
}.to have_enqueued_job
|
16
|
+
end
|
17
|
+
|
18
|
+
it "generates notification once" do
|
19
|
+
ActivityNotification::NotifyToJob.perform_later(@user, @comment)
|
20
|
+
expect(ActivityNotification::NotifyToJob).to have_been_enqueued.exactly(:once)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -7,7 +7,10 @@ class CommentsController < ApplicationController
|
|
7
7
|
@comment.user = current_user
|
8
8
|
|
9
9
|
if @comment.save
|
10
|
-
@comment.
|
10
|
+
@comment.notify_later :users, key: 'comment.create.later'
|
11
|
+
# @comment.notify :users, key: 'comment.create.later', notify_later: true
|
12
|
+
@comment.notify_now :users, key: 'comment.create.now'
|
13
|
+
# @comment.notify :users, key: 'comment.create.now'
|
11
14
|
redirect_to @comment.article, notice: 'Comment was successfully created.'
|
12
15
|
else
|
13
16
|
redirect_to @comment.article
|
@@ -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
|
@@ -41,6 +41,9 @@ ActivityNotification.configure do |config|
|
|
41
41
|
# Configure the parent class responsible to send e-mails.
|
42
42
|
# config.parent_mailer = 'ActionMailer::Base'
|
43
43
|
|
44
|
+
# Configure the parent job class for delayed notifications.
|
45
|
+
# config.parent_job = 'ActiveJob::Base'
|
46
|
+
|
44
47
|
# Configure the parent class for activity_notification controllers.
|
45
48
|
# config.parent_controller = 'ApplicationController'
|
46
49
|
|
@@ -50,4 +53,7 @@ ActivityNotification.configure do |config|
|
|
50
53
|
# Configure default limit number of opened notifications you can get from opened* scope
|
51
54
|
config.opened_index_limit = 10
|
52
55
|
|
56
|
+
# Configure ActiveJob queue name for delayed notifications.
|
57
|
+
config.active_job_queue = :activity_notification
|
58
|
+
|
53
59
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Migration responsible for creating a table with notifications
|
2
|
-
class CreateActivityNotificationTables < ActiveRecord::Migration[5.
|
2
|
+
class CreateActivityNotificationTables < ActiveRecord::Migration[5.2]
|
3
3
|
# Create tables
|
4
4
|
def change
|
5
5
|
create_table :notifications do |t|
|
@@ -12,7 +12,7 @@ class CreateActivityNotificationTables < ActiveRecord::Migration[5.1]
|
|
12
12
|
t.text :parameters
|
13
13
|
t.datetime :opened_at
|
14
14
|
|
15
|
-
t.timestamps
|
15
|
+
t.timestamps null: false
|
16
16
|
end
|
17
17
|
|
18
18
|
create_table :subscriptions do |t|
|
@@ -26,7 +26,7 @@ class CreateActivityNotificationTables < ActiveRecord::Migration[5.1]
|
|
26
26
|
t.datetime :unsubscribed_to_email_at
|
27
27
|
t.text :optional_targets
|
28
28
|
|
29
|
-
t.timestamps
|
29
|
+
t.timestamps null: false
|
30
30
|
end
|
31
31
|
add_index :subscriptions, [:target_type, :target_id, :key], unique: true
|
32
32
|
end
|
data/spec/rails_app/db/schema.rb
CHANGED
@@ -10,51 +10,51 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 2018_12_09_000000) do
|
14
14
|
|
15
15
|
create_table "admins", force: :cascade do |t|
|
16
|
-
t.integer
|
17
|
-
t.string
|
18
|
-
t.string
|
19
|
-
t.datetime "created_at"
|
20
|
-
t.datetime "updated_at"
|
16
|
+
t.integer "user_id"
|
17
|
+
t.string "phone_number"
|
18
|
+
t.string "slack_username"
|
19
|
+
t.datetime "created_at", null: false
|
20
|
+
t.datetime "updated_at", null: false
|
21
21
|
t.index ["user_id"], name: "index_admins_on_user_id"
|
22
22
|
end
|
23
23
|
|
24
24
|
create_table "articles", force: :cascade do |t|
|
25
|
-
t.integer
|
26
|
-
t.string
|
27
|
-
t.string
|
28
|
-
t.datetime "created_at"
|
29
|
-
t.datetime "updated_at"
|
25
|
+
t.integer "user_id"
|
26
|
+
t.string "title"
|
27
|
+
t.string "body"
|
28
|
+
t.datetime "created_at", null: false
|
29
|
+
t.datetime "updated_at", null: false
|
30
30
|
t.index ["user_id"], name: "index_articles_on_user_id"
|
31
31
|
end
|
32
32
|
|
33
33
|
create_table "comments", force: :cascade do |t|
|
34
|
-
t.integer
|
35
|
-
t.integer
|
36
|
-
t.string
|
37
|
-
t.datetime "created_at"
|
38
|
-
t.datetime "updated_at"
|
34
|
+
t.integer "user_id"
|
35
|
+
t.integer "article_id"
|
36
|
+
t.string "body"
|
37
|
+
t.datetime "created_at", null: false
|
38
|
+
t.datetime "updated_at", null: false
|
39
39
|
t.index ["article_id"], name: "index_comments_on_article_id"
|
40
40
|
t.index ["user_id"], name: "index_comments_on_user_id"
|
41
41
|
end
|
42
42
|
|
43
43
|
create_table "notifications", force: :cascade do |t|
|
44
|
-
t.string
|
45
|
-
t.integer
|
46
|
-
t.string
|
47
|
-
t.integer
|
48
|
-
t.string
|
49
|
-
t.string
|
50
|
-
t.integer
|
51
|
-
t.integer
|
52
|
-
t.string
|
53
|
-
t.integer
|
54
|
-
t.text
|
44
|
+
t.string "target_type", null: false
|
45
|
+
t.integer "target_id", null: false
|
46
|
+
t.string "notifiable_type", null: false
|
47
|
+
t.integer "notifiable_id", null: false
|
48
|
+
t.string "key", null: false
|
49
|
+
t.string "group_type"
|
50
|
+
t.integer "group_id"
|
51
|
+
t.integer "group_owner_id"
|
52
|
+
t.string "notifier_type"
|
53
|
+
t.integer "notifier_id"
|
54
|
+
t.text "parameters"
|
55
55
|
t.datetime "opened_at"
|
56
|
-
t.datetime "created_at"
|
57
|
-
t.datetime "updated_at"
|
56
|
+
t.datetime "created_at", null: false
|
57
|
+
t.datetime "updated_at", null: false
|
58
58
|
t.index ["group_owner_id"], name: "index_notifications_on_group_owner_id"
|
59
59
|
t.index ["group_type", "group_id"], name: "index_notifications_on_group_type_and_group_id"
|
60
60
|
t.index ["notifiable_type", "notifiable_id"], name: "index_notifications_on_notifiable_type_and_notifiable_id"
|
@@ -63,32 +63,32 @@ ActiveRecord::Schema.define(version: 20160715050433) do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
create_table "subscriptions", force: :cascade do |t|
|
66
|
-
t.string
|
67
|
-
t.integer
|
68
|
-
t.string
|
69
|
-
t.boolean
|
70
|
-
t.boolean
|
66
|
+
t.string "target_type", null: false
|
67
|
+
t.integer "target_id", null: false
|
68
|
+
t.string "key", null: false
|
69
|
+
t.boolean "subscribing", default: true, null: false
|
70
|
+
t.boolean "subscribing_to_email", default: true, null: false
|
71
71
|
t.datetime "subscribed_at"
|
72
72
|
t.datetime "unsubscribed_at"
|
73
73
|
t.datetime "subscribed_to_email_at"
|
74
74
|
t.datetime "unsubscribed_to_email_at"
|
75
|
-
t.text
|
76
|
-
t.datetime "created_at"
|
77
|
-
t.datetime "updated_at"
|
75
|
+
t.text "optional_targets"
|
76
|
+
t.datetime "created_at", null: false
|
77
|
+
t.datetime "updated_at", null: false
|
78
78
|
t.index ["key"], name: "index_subscriptions_on_key"
|
79
79
|
t.index ["target_type", "target_id", "key"], name: "index_subscriptions_on_target_type_and_target_id_and_key", unique: true
|
80
80
|
t.index ["target_type", "target_id"], name: "index_subscriptions_on_target_type_and_target_id"
|
81
81
|
end
|
82
82
|
|
83
83
|
create_table "users", force: :cascade do |t|
|
84
|
-
t.string
|
85
|
-
t.string
|
86
|
-
t.string
|
84
|
+
t.string "email", default: "", null: false
|
85
|
+
t.string "encrypted_password", default: "", null: false
|
86
|
+
t.string "confirmation_token"
|
87
87
|
t.datetime "confirmed_at"
|
88
88
|
t.datetime "confirmation_sent_at"
|
89
|
-
t.string
|
90
|
-
t.datetime "created_at"
|
91
|
-
t.datetime "updated_at"
|
89
|
+
t.string "name"
|
90
|
+
t.datetime "created_at", null: false
|
91
|
+
t.datetime "updated_at", null: false
|
92
92
|
t.index ["email"], name: "index_users_on_email"
|
93
93
|
end
|
94
94
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
describe ActivityNotification::ActsAsNotifiable do
|
2
|
+
include ActiveJob::TestHelper
|
2
3
|
let(:dummy_model_class) { Dummy::DummyBase }
|
3
4
|
let(:dummy_notifiable_class) { Dummy::DummyNotifiable }
|
4
5
|
let(:user_target) { create(:confirmed_user) }
|
@@ -193,6 +194,50 @@ describe ActivityNotification::ActsAsNotifiable do
|
|
193
194
|
end
|
194
195
|
end
|
195
196
|
end
|
197
|
+
|
198
|
+
context "with :notify_later option" do
|
199
|
+
before do
|
200
|
+
ActiveJob::Base.queue_adapter = :test
|
201
|
+
dummy_notifiable_class.acts_as_notifiable :users, targets: [user_target], tracked: { notify_later: true }
|
202
|
+
@created_notifiable = dummy_notifiable_class.create
|
203
|
+
end
|
204
|
+
|
205
|
+
context "creation" do
|
206
|
+
it "generates notifications later when notifiable is created" do
|
207
|
+
expect {
|
208
|
+
@created_notifiable = dummy_notifiable_class.create
|
209
|
+
}.to have_enqueued_job(ActivityNotification::NotifyJob)
|
210
|
+
end
|
211
|
+
|
212
|
+
it "creates notification records later when notifiable is created" do
|
213
|
+
perform_enqueued_jobs do
|
214
|
+
@created_notifiable = dummy_notifiable_class.create
|
215
|
+
end
|
216
|
+
expect(user_target.notifications.filtered_by_instance(@created_notifiable).count).to eq(1)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
context "update" do
|
221
|
+
before do
|
222
|
+
user_target.notifications.delete_all
|
223
|
+
expect(user_target.notifications.count).to eq(0)
|
224
|
+
@notifiable.update(created_at: @notifiable.updated_at)
|
225
|
+
end
|
226
|
+
|
227
|
+
it "generates notifications later when notifiable is created" do
|
228
|
+
expect {
|
229
|
+
@notifiable.update(created_at: @notifiable.updated_at)
|
230
|
+
}.to have_enqueued_job(ActivityNotification::NotifyJob)
|
231
|
+
end
|
232
|
+
|
233
|
+
it "creates notification records later when notifiable is created" do
|
234
|
+
perform_enqueued_jobs do
|
235
|
+
@notifiable.update(created_at: @notifiable.updated_at)
|
236
|
+
end
|
237
|
+
expect(user_target.notifications.filtered_by_instance(@notifiable).count).to eq(1)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
196
241
|
end
|
197
242
|
|
198
243
|
context "with :dependent_notifications option" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activity_notification
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shota Yamazaki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -258,6 +258,9 @@ files:
|
|
258
258
|
- app/controllers/activity_notification/notifications_with_devise_controller.rb
|
259
259
|
- app/controllers/activity_notification/subscriptions_controller.rb
|
260
260
|
- app/controllers/activity_notification/subscriptions_with_devise_controller.rb
|
261
|
+
- app/jobs/activity_notification/notify_all_job.rb
|
262
|
+
- app/jobs/activity_notification/notify_job.rb
|
263
|
+
- app/jobs/activity_notification/notify_to_job.rb
|
261
264
|
- app/mailers/activity_notification/mailer.rb
|
262
265
|
- app/views/activity_notification/mailer/default/batch_default.html.erb
|
263
266
|
- app/views/activity_notification/mailer/default/batch_default.text.erb
|
@@ -383,6 +386,9 @@ files:
|
|
383
386
|
- spec/generators/views_generator_spec.rb
|
384
387
|
- spec/helpers/polymorphic_helpers_spec.rb
|
385
388
|
- spec/helpers/view_helpers_spec.rb
|
389
|
+
- spec/jobs/notify_all_job_spec.rb
|
390
|
+
- spec/jobs/notify_job_spec.rb
|
391
|
+
- spec/jobs/notify_to_job_spec.rb
|
386
392
|
- spec/mailers/mailer_spec.rb
|
387
393
|
- spec/models/dummy/dummy_group_spec.rb
|
388
394
|
- spec/models/dummy/dummy_notifiable_spec.rb
|
@@ -463,8 +469,8 @@ files:
|
|
463
469
|
- spec/rails_app/config/mongoid.yml
|
464
470
|
- spec/rails_app/config/routes.rb
|
465
471
|
- spec/rails_app/config/secrets.yml
|
466
|
-
- spec/rails_app/db/migrate/
|
467
|
-
- spec/rails_app/db/migrate/
|
472
|
+
- spec/rails_app/db/migrate/20160716000000_create_test_tables.rb
|
473
|
+
- spec/rails_app/db/migrate/20181209000000_create_activity_notification_tables.rb
|
468
474
|
- spec/rails_app/db/schema.rb
|
469
475
|
- spec/rails_app/db/seeds.rb
|
470
476
|
- spec/rails_app/lib/custom_optional_targets/console_output.rb
|
@@ -540,6 +546,9 @@ test_files:
|
|
540
546
|
- spec/generators/views_generator_spec.rb
|
541
547
|
- spec/helpers/polymorphic_helpers_spec.rb
|
542
548
|
- spec/helpers/view_helpers_spec.rb
|
549
|
+
- spec/jobs/notify_all_job_spec.rb
|
550
|
+
- spec/jobs/notify_job_spec.rb
|
551
|
+
- spec/jobs/notify_to_job_spec.rb
|
543
552
|
- spec/mailers/mailer_spec.rb
|
544
553
|
- spec/models/dummy/dummy_group_spec.rb
|
545
554
|
- spec/models/dummy/dummy_notifiable_spec.rb
|
@@ -620,8 +629,8 @@ test_files:
|
|
620
629
|
- spec/rails_app/config/mongoid.yml
|
621
630
|
- spec/rails_app/config/routes.rb
|
622
631
|
- spec/rails_app/config/secrets.yml
|
623
|
-
- spec/rails_app/db/migrate/
|
624
|
-
- spec/rails_app/db/migrate/
|
632
|
+
- spec/rails_app/db/migrate/20160716000000_create_test_tables.rb
|
633
|
+
- spec/rails_app/db/migrate/20181209000000_create_activity_notification_tables.rb
|
625
634
|
- spec/rails_app/db/schema.rb
|
626
635
|
- spec/rails_app/db/seeds.rb
|
627
636
|
- spec/rails_app/lib/custom_optional_targets/console_output.rb
|