DEV: triggers DiscourseEvents when an event starts/ends

This commit is contained in:
jjaffeux 2020-08-04 14:25:00 +02:00
parent 6ef6585b43
commit bdf4942ee1
6 changed files with 151 additions and 0 deletions

View File

@ -3,3 +3,10 @@
Adds the ability to create a dynamic calendar in the first post of a topic.
Topic discussing the plugin itself can be found here: [https://meta.discourse.org/t/discourse-calendar/97376](https://meta.discourse.org/t/discourse-calendar/97376)
### Customisation
#### Plugins
- `discourse_post_event_event_started` this DiscourseEvent will be triggered when an event starts
- `discourse_post_event_event_ended` this DiscourseEvent will be triggered when an event ends

View File

@ -34,6 +34,28 @@ module DiscoursePostEvent
end
end
after_commit :setup_starts_at_handler, on: [:create, :update]
def setup_starts_at_handler
if !transaction_include_any_action?([:create])
Jobs.cancel_scheduled_job(:discourse_post_event_event_started, event_id: self.id)
end
if self.starts_at > Time.now
Jobs.enqueue_at(self.starts_at, :discourse_post_event_event_started, event_id: self.id)
end
end
after_commit :setup_ends_at_handler, on: [:create, :update]
def setup_ends_at_handler
if !transaction_include_any_action?([:create])
Jobs.cancel_scheduled_job(:discourse_post_event_event_ended, event_id: self.id)
end
if self.ends_at && self.ends_at > Time.now
Jobs.enqueue_at(self.ends_at, :discourse_post_event_event_ended, event_id: self.id)
end
end
has_many :invitees, foreign_key: :post_id, dependent: :delete_all
belongs_to :post, foreign_key: :id

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
module Jobs
class DiscoursePostEventEventEnded < ::Jobs::Base
sidekiq_options retry: false
def execute(args)
raise Discourse::InvalidParameters.new(:event_id) if args[:event_id].blank?
event = Event.find(args[:event_id])
DiscourseEvent.trigger(:discourse_post_event_event_ended, event)
end
end
end

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
module Jobs
class DiscoursePostEventEventStarted < ::Jobs::Base
sidekiq_options retry: false
def execute(args)
raise Discourse::InvalidParameters.new(:event_id) if args[:event_id].blank?
event = Event.find(args[:event_id])
DiscourseEvent.trigger(:discourse_post_event_event_started, event)
end
end
end

View File

@ -87,6 +87,8 @@ after_initialize do
"../lib/discourse_post_event/event_parser.rb",
"../lib/discourse_post_event/event_validator.rb",
"../jobs/regular/discourse_post_event/bulk_invite.rb",
"../jobs/regular/discourse_post_event/event_started.rb",
"../jobs/regular/discourse_post_event/event_ended.rb",
"../lib/discourse_post_event/event_finder.rb",
"../app/serializers/discourse_post_event/invitee_serializer.rb",
"../app/serializers/discourse_post_event/event_serializer.rb"

View File

@ -47,6 +47,100 @@ describe DiscoursePostEvent::Event do
expect(second_post.topic.custom_fields).to be_blank
end
end
context 'setting dates enqueues future jobs at date' do
before do
Jobs.run_later!
end
context 'starts_at' do
context 'is after current time' do
it 'queues a future discourse event trigger' do
expect_enqueued_with(job: :discourse_post_event_event_started, args: {
"event_id" => first_post.id
}) do
Event.create!(id: first_post.id, starts_at: starts_at)
end
end
end
context 'is before current time' do
it 'doesnt queues a future discourse event trigger' do
expect {
Event.create!(id: first_post.id, starts_at: Time.now - 1.day)
}.to change {
Jobs::DiscoursePostEventEventStarted.jobs.count
}.by(0)
end
end
context 'an event started job was already scheduled' do
it 'queues a future discourse event trigger' do
Jobs
.expects(:cancel_scheduled_job)
.with(:discourse_post_event_event_ended, event_id: first_post.id)
.once
Jobs
.expects(:cancel_scheduled_job)
.with(:discourse_post_event_event_started, event_id: first_post.id)
.once
Event.create!(id: first_post.id, starts_at: starts_at)
expect(Jobs::DiscoursePostEventEventStarted.jobs.count).to eq(1)
Event.find(first_post.id).update!(starts_at: Time.now + 2.hours)
expect(Jobs::DiscoursePostEventEventStarted.jobs.count).to eq(2)
end
end
end
context 'ends_at' do
context 'is after current time' do
it 'queues a future discourse event trigger' do
expect_enqueued_with(job: :discourse_post_event_event_ended, args: {
"event_id" => first_post.id
}) do
Event.create!(id: first_post.id, starts_at: Time.now - 1.day, ends_at: Time.now + 12.hours)
end
end
end
context 'is before current time' do
it 'doesnt queue a future discourse event trigger' do
expect {
Event.create!(id: first_post.id, starts_at: Time.now - 1.day, ends_at: Time.now - 12.hours)
}.to change {
Jobs::DiscoursePostEventEventEnded.jobs.count
}.by(0)
end
end
context 'an event ended job was already scheduled' do
it 'queues a future discourse event trigger' do
Jobs
.expects(:cancel_scheduled_job)
.with(:discourse_post_event_event_ended, event_id: first_post.id)
.once
Jobs
.expects(:cancel_scheduled_job)
.with(:discourse_post_event_event_started, event_id: first_post.id)
.once
Event.create!(id: first_post.id, starts_at: Time.now - 1.day, ends_at: Time.now + 12.hours)
expect(Jobs::DiscoursePostEventEventEnded.jobs.count).to eq(1)
Event.find(first_post.id).update!(starts_at: Time.now - 1.day, ends_at: Time.now + 13.hours)
expect(Jobs::DiscoursePostEventEventEnded.jobs.count).to eq(2)
end
end
end
end
end
context 'a post event has been updated' do