From eba5d6aa4ce6afed05bacdca9efe3ab2d5afe72c Mon Sep 17 00:00:00 2001 From: Bradan Schwanke Date: Fri, 13 Mar 2026 12:20:29 -0600 Subject: [PATCH 1/3] Live events for dicussion reply edit/delete trigger. Verified with Kinesis server. --- lib/canvas/live_events.rb | 7 ++++++- lib/canvas/live_events_callbacks.rb | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/canvas/live_events.rb b/lib/canvas/live_events.rb index b3c4c6592bdca..05ae26852fe03 100644 --- a/lib/canvas/live_events.rb +++ b/lib/canvas/live_events.rb @@ -138,6 +138,10 @@ def self.discussion_entry_created(entry) post_event_stringified("discussion_entry_created", get_discussion_entry_data(entry)) end + def self.discussion_entry_updated(entry) + post_event_stringified("discussion_entry_updated", get_discussion_entry_data(entry)) + end + def self.discussion_entry_submitted(entry, assignment_id, submission_id) payload = get_discussion_entry_data(entry) payload[:assignment_id] = assignment_id unless assignment_id.nil? @@ -151,7 +155,8 @@ def self.get_discussion_entry_data(entry) created_at: entry.created_at, discussion_entry_id: entry.id, discussion_topic_id: entry.discussion_topic_id, - text: LiveEvents.truncate(entry.message) + text: LiveEvents.truncate(entry.message), + workflow_state: entry.workflow_state } payload[:parent_discussion_entry_id] = entry.parent_id if entry.parent_id diff --git a/lib/canvas/live_events_callbacks.rb b/lib/canvas/live_events_callbacks.rb index e531b773edbbc..36f20b359fd31 100644 --- a/lib/canvas/live_events_callbacks.rb +++ b/lib/canvas/live_events_callbacks.rb @@ -115,6 +115,8 @@ def self.after_update(obj, changes) Canvas::LiveEvents.course_syllabus_updated(obj, changes["syllabus_body"].first) end Canvas::LiveEvents.course_updated(obj) + when DiscussionEntry + Canvas::LiveEvents.discussion_entry_updated(obj) when DiscussionTopic Canvas::LiveEvents.discussion_topic_updated(obj) when Enrollment From 604e13821f41773cffe10cb4c16f129ca41596a2 Mon Sep 17 00:00:00 2001 From: Bradan Schwanke Date: Fri, 13 Mar 2026 12:31:00 -0600 Subject: [PATCH 2/3] Added tests. --- spec/lib/canvas/live_events_spec.rb | 53 ++++++++++++++++++++- spec/observers/live_events_observer_spec.rb | 17 +++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/spec/lib/canvas/live_events_spec.rb b/spec/lib/canvas/live_events_spec.rb index be5205990fa9b..4484c415a1270 100644 --- a/spec/lib/canvas/live_events_spec.rb +++ b/spec/lib/canvas/live_events_spec.rb @@ -1888,6 +1888,53 @@ def settings end end + describe ".discussion_entry_updated" do + it "triggers a discussion entry updated live event" do + course_with_student + topic = @course.discussion_topics.create!(title: "test title", message: "test body") + entry = topic.discussion_entries.create!(message: "

original

", user_id: @student.id) + + expect_event("discussion_entry_updated", { + user_id: entry.user_id.to_s, + created_at: entry.created_at, + discussion_entry_id: entry.id.to_s, + discussion_topic_id: entry.discussion_topic_id.to_s, + text: entry.message, + workflow_state: entry.workflow_state + }).once + + Canvas::LiveEvents.discussion_entry_updated(entry) + end + + it "includes workflow_state deleted when entry is soft deleted" do + course_with_student + topic = @course.discussion_topics.create!(title: "test title", message: "test body") + entry = topic.discussion_entries.create!(message: "

original

", user_id: @student.id) + entry.destroy + + expect_event("discussion_entry_updated", hash_including( + discussion_entry_id: entry.id.to_s, + workflow_state: "deleted" + )).once + + Canvas::LiveEvents.discussion_entry_updated(entry) + end + + it "includes parent_discussion_entry_id for nested replies" do + course_with_student + topic = @course.discussion_topics.create!(title: "test title", message: "test body") + parent = topic.discussion_entries.create!(message: "parent", user_id: @student.id) + reply = topic.discussion_entries.create!(message: "reply", user_id: @student.id, parent_id: parent.id) + + expect_event("discussion_entry_updated", hash_including( + discussion_entry_id: reply.id.to_s, + parent_discussion_entry_id: parent.id.to_s + )).once + + Canvas::LiveEvents.discussion_entry_updated(reply) + end + end + describe ".discussion_entry_submitted" do context "with non graded discussion" do it "creates a discussion entry created live event" do @@ -1906,7 +1953,8 @@ def settings created_at: entry.created_at, discussion_entry_id: entry.id.to_s, discussion_topic_id: entry.discussion_topic_id.to_s, - text: entry.message + text: entry.message, + workflow_state: entry.workflow_state }).once Canvas::LiveEvents.discussion_entry_submitted(entry, nil, nil) @@ -1935,7 +1983,8 @@ def settings created_at: entry.created_at, discussion_entry_id: entry.id.to_s, discussion_topic_id: entry.discussion_topic_id.to_s, - text: entry.message + text: entry.message, + workflow_state: entry.workflow_state }).once Canvas::LiveEvents.discussion_entry_submitted(entry, assignment.id, submission.id) diff --git a/spec/observers/live_events_observer_spec.rb b/spec/observers/live_events_observer_spec.rb index e69696ba42858..f5a3b1f5d6636 100644 --- a/spec/observers/live_events_observer_spec.rb +++ b/spec/observers/live_events_observer_spec.rb @@ -187,6 +187,23 @@ discussion_topic_model(context: @course) @topic.discussion_entries.create!(message: "entry") end + + it "posts update events" do + course_model + discussion_topic_model(context: @course) + entry = @topic.discussion_entries.create!(message: "entry") + expect(Canvas::LiveEvents).to receive(:discussion_entry_updated).once + entry.message = "edited" + entry.save + end + + it "posts update events when soft deleted" do + course_model + discussion_topic_model(context: @course) + entry = @topic.discussion_entries.create!(message: "entry") + expect(Canvas::LiveEvents).to receive(:discussion_entry_updated).once + entry.destroy + end end describe "group" do From 327284e756d2f302e50cf0f3ad94edc2fd2bccec Mon Sep 17 00:00:00 2001 From: Bradan Schwanke Date: Fri, 13 Mar 2026 12:44:05 -0600 Subject: [PATCH 3/3] Removed workflow_state from body of live event as it affected code beyond the scope of this project. --- lib/canvas/live_events.rb | 3 +-- spec/lib/canvas/live_events_spec.rb | 23 +++-------------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/lib/canvas/live_events.rb b/lib/canvas/live_events.rb index 05ae26852fe03..34bb28c2a82f2 100644 --- a/lib/canvas/live_events.rb +++ b/lib/canvas/live_events.rb @@ -155,8 +155,7 @@ def self.get_discussion_entry_data(entry) created_at: entry.created_at, discussion_entry_id: entry.id, discussion_topic_id: entry.discussion_topic_id, - text: LiveEvents.truncate(entry.message), - workflow_state: entry.workflow_state + text: LiveEvents.truncate(entry.message) } payload[:parent_discussion_entry_id] = entry.parent_id if entry.parent_id diff --git a/spec/lib/canvas/live_events_spec.rb b/spec/lib/canvas/live_events_spec.rb index 4484c415a1270..17cb006224db1 100644 --- a/spec/lib/canvas/live_events_spec.rb +++ b/spec/lib/canvas/live_events_spec.rb @@ -1899,27 +1899,12 @@ def settings created_at: entry.created_at, discussion_entry_id: entry.id.to_s, discussion_topic_id: entry.discussion_topic_id.to_s, - text: entry.message, - workflow_state: entry.workflow_state + text: entry.message }).once Canvas::LiveEvents.discussion_entry_updated(entry) end - it "includes workflow_state deleted when entry is soft deleted" do - course_with_student - topic = @course.discussion_topics.create!(title: "test title", message: "test body") - entry = topic.discussion_entries.create!(message: "

original

", user_id: @student.id) - entry.destroy - - expect_event("discussion_entry_updated", hash_including( - discussion_entry_id: entry.id.to_s, - workflow_state: "deleted" - )).once - - Canvas::LiveEvents.discussion_entry_updated(entry) - end - it "includes parent_discussion_entry_id for nested replies" do course_with_student topic = @course.discussion_topics.create!(title: "test title", message: "test body") @@ -1953,8 +1938,7 @@ def settings created_at: entry.created_at, discussion_entry_id: entry.id.to_s, discussion_topic_id: entry.discussion_topic_id.to_s, - text: entry.message, - workflow_state: entry.workflow_state + text: entry.message }).once Canvas::LiveEvents.discussion_entry_submitted(entry, nil, nil) @@ -1983,8 +1967,7 @@ def settings created_at: entry.created_at, discussion_entry_id: entry.id.to_s, discussion_topic_id: entry.discussion_topic_id.to_s, - text: entry.message, - workflow_state: entry.workflow_state + text: entry.message }).once Canvas::LiveEvents.discussion_entry_submitted(entry, assignment.id, submission.id)