From 665bf1634731d60d6ef625a7ff5ee9ffe812b88e Mon Sep 17 00:00:00 2001 From: Mia Bennett Date: Thu, 14 May 2026 14:08:57 +0930 Subject: [PATCH 1/4] fix(visitor_mailer): not all signals have all fields, so make them nilable --- drivers/place/visitor_mailer.cr | 21 ++++++++++++++------- drivers/place/visitor_models.cr | 6 +++--- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/drivers/place/visitor_mailer.cr b/drivers/place/visitor_mailer.cr index 601c7c5a0a9..54c6da6593e 100644 --- a/drivers/place/visitor_mailer.cr +++ b/drivers/place/visitor_mailer.cr @@ -641,6 +641,13 @@ class Place::VisitorMailer < PlaceOS::Driver # only respond to updates, not creates or cancellations return unless details.action == "update" + # These fields may be missing from some payloads (e.g. cancelled events, + # metadata-only updates) so the model marks them nilable. + host = details.host + event_start = details.event_start + event_end = details.event_end + return unless host && event_start && event_end + # ensure the event is for this building if zones = details.zones check = [building_zone.id] + @parent_zone_ids @@ -653,13 +660,13 @@ class Place::VisitorMailer < PlaceOS::Driver # --- Host change notification if prev_host = details.previous_host_email - if prev_host.downcase != details.host.downcase + if prev_host.downcase != host.downcase send_original_host_email( @notify_original_host_template, prev_host, - details.host, + host, details.title, - details.event_start, + event_start, ) end end @@ -669,10 +676,10 @@ class Place::VisitorMailer < PlaceOS::Driver # Date or time changed if prev_start = details.previous_event_start - fields_changed = true if prev_start != details.event_start + fields_changed = true if prev_start != event_start end if prev_end = details.previous_event_end - fields_changed = true if prev_end != details.event_end + fields_changed = true if prev_end != event_end end # Location changed (system_id represents the room) @@ -716,8 +723,8 @@ class Place::VisitorMailer < PlaceOS::Driver guests = staff_api.event_guests(details.event_id, details.system_id).get.as_a send_booking_changed_emails( guests, - details.host, - details.event_start, + host, + event_start, details.title, details.previous_event_start, previous_building_name, diff --git a/drivers/place/visitor_models.cr b/drivers/place/visitor_models.cr index fb9cff831c0..6f60e2f01e3 100644 --- a/drivers/place/visitor_models.cr +++ b/drivers/place/visitor_models.cr @@ -136,11 +136,11 @@ module Place property system_id : String property event_id : String property event_ical_uid : String? - property host : String + property host : String? property resource : String? property title : String? - property event_start : Int64 - property event_end : Int64 + property event_start : Int64? + property event_end : Int64? property zones : Array(String)? # Previous values — only present when action is "update" and the meta was persisted. From b5c5e40c1aac704936c49f28717a17c26c3cc385 Mon Sep 17 00:00:00 2001 From: Mia Bennett Date: Thu, 14 May 2026 17:46:03 +0930 Subject: [PATCH 2/4] fix(staff_api): support #guest_list ical_uid lookup (PPT-2375) --- drivers/place/staff_api.cr | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/place/staff_api.cr b/drivers/place/staff_api.cr index 5f2cf29f19d..381f1274312 100644 --- a/drivers/place/staff_api.cr +++ b/drivers/place/staff_api.cr @@ -993,9 +993,13 @@ class Place::StaffAPI < PlaceOS::Driver JSON.parse(response.body) end - def event_guests(event_id : String, system_id : String) + def event_guests(event_id : String, system_id : String, ical_uid : String? = nil) logger.debug { "getting guests for event #{event_id} in system #{system_id}" } - response = get("/api/staff/v1/events/#{event_id}/guests?system_id=#{system_id}", headers: authentication) + params = URI::Params.build do |form| + form.add "system_id", system_id + form.add "ical_uid", ical_uid if ical_uid + end + response = get("/api/staff/v1/events/#{event_id}/guests?#{params}", headers: authentication) raise "issue getting guests for event #{event_id}: #{response.status_code}" unless response.success? JSON.parse(response.body) end From d02b95a586f3e5ae36b55fb589a8fe98d9f31ad8 Mon Sep 17 00:00:00 2001 From: Mia Bennett Date: Thu, 14 May 2026 17:46:25 +0930 Subject: [PATCH 3/4] fix(visitor_mailer): support #guest_list ical_uid lookup (PPT-2375) --- drivers/place/visitor_mailer.cr | 2 +- drivers/place/visitor_mailer_spec.cr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/place/visitor_mailer.cr b/drivers/place/visitor_mailer.cr index 54c6da6593e..02fec19102f 100644 --- a/drivers/place/visitor_mailer.cr +++ b/drivers/place/visitor_mailer.cr @@ -720,7 +720,7 @@ class Place::VisitorMailer < PlaceOS::Driver end end - guests = staff_api.event_guests(details.event_id, details.system_id).get.as_a + guests = staff_api.event_guests(details.event_id, details.system_id, details.event_ical_uid).get.as_a send_booking_changed_emails( guests, host, diff --git a/drivers/place/visitor_mailer_spec.cr b/drivers/place/visitor_mailer_spec.cr index 257da8c3cf1..33d34fa7ee8 100644 --- a/drivers/place/visitor_mailer_spec.cr +++ b/drivers/place/visitor_mailer_spec.cr @@ -131,7 +131,7 @@ class StaffAPIMock < DriverSpecs::MockDriver ] end - def event_guests(event_id : String, system_id : String) + def event_guests(event_id : String, system_id : String, ical_uid : String? = nil) [ { email: "visitor@external.com", From 6f73b270dfeaba2ccc96d04a1e6eb4f39a71b99d Mon Sep 17 00:00:00 2001 From: Mia Bennett Date: Thu, 14 May 2026 17:52:12 +0930 Subject: [PATCH 4/4] refactor(staff_api): match style of other ical_uid lookups --- drivers/place/staff_api.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/place/staff_api.cr b/drivers/place/staff_api.cr index 381f1274312..f7700616ac8 100644 --- a/drivers/place/staff_api.cr +++ b/drivers/place/staff_api.cr @@ -997,7 +997,7 @@ class Place::StaffAPI < PlaceOS::Driver logger.debug { "getting guests for event #{event_id} in system #{system_id}" } params = URI::Params.build do |form| form.add "system_id", system_id - form.add "ical_uid", ical_uid if ical_uid + form.add "ical_uid", ical_uid.to_s if ical_uid.presence end response = get("/api/staff/v1/events/#{event_id}/guests?#{params}", headers: authentication) raise "issue getting guests for event #{event_id}: #{response.status_code}" unless response.success?