Skip to content

Commit c3dee2e

Browse files
authored
feat(bookings): [PPT-2375] notify of changes after edit (#364)
1 parent 133d449 commit c3dee2e

1 file changed

Lines changed: 77 additions & 27 deletions

File tree

src/controllers/bookings.cr

Lines changed: 77 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -578,17 +578,29 @@ class Bookings < Application
578578
changes.instance = booking.instance
579579
existing_booking = booking
580580

581+
original_host_email = existing_booking.user_email
581582
original_start = existing_booking.booking_start
582583
original_end = existing_booking.booking_end
583584
original_assets = existing_booking.asset_ids
585+
original_zones = existing_booking.zones.dup
584586

585-
{% for key in [:asset_id, :asset_ids, :zones, :booking_start, :booking_end, :all_day, :title, :description, :images, :induction, :recurrence_end, :recurrence_interval, :recurrence_nth_of_month, :recurrence_days, :recurrence_type, :permission] %}
587+
{% for key in [:asset_id, :asset_ids, :zones, :booking_start, :booking_end, :all_day, :title, :description, :images, :induction, :recurrence_end, :recurrence_interval, :recurrence_nth_of_month, :recurrence_days, :recurrence_type, :permission, :user_email] %}
586588
begin
587589
existing_booking.{{key.id}} = changes.{{key.id}} if changes.{{key.id}}_present?
588590
rescue NilAssertionError
589591
end
590592
{% end %}
591593

594+
# When the host changes, resolve the new user's id and name from the user_email
595+
if existing_booking.user_email_changed?
596+
if new_user_email = existing_booking.user_email.presence
597+
new_user = client.get_user_by_email(new_user_email)
598+
raise Error::NotFound.new("user #{new_user_email} not found") unless new_user
599+
existing_booking.user_id = new_user.id.presence || new_user_email
600+
existing_booking.user_name = new_user.name.presence || new_user_email
601+
end
602+
end
603+
592604
extension_data = changes.extension_data unless changes.extension_data.nil?
593605
if extension_data
594606
booking_ext_data = existing_booking.extension_data
@@ -716,7 +728,36 @@ class Bookings < Application
716728
end
717729
end
718730

719-
update_booking(existing_booking, reset_state ? "changed" : "metadata_changed")
731+
result = update_booking(
732+
existing_booking,
733+
reset_state ? "changed" : "metadata_changed",
734+
previous_booking_start: original_start,
735+
previous_booking_end: original_end,
736+
previous_zones: original_zones,
737+
)
738+
739+
if original_host_email.to_s.downcase != existing_booking.user_email.to_s.downcase
740+
spawn do
741+
begin
742+
get_placeos_client.root.signal("staff/booking/host_changed", {
743+
action: :host_changed,
744+
booking_id: existing_booking.id,
745+
resource_id: existing_booking.asset_id,
746+
resource_ids: existing_booking.asset_ids,
747+
event_title: existing_booking.title,
748+
event_summary: existing_booking.description.presence || existing_booking.title,
749+
event_starting: existing_booking.booking_start,
750+
previous_host_email: original_host_email,
751+
new_host_email: existing_booking.user_email,
752+
zones: existing_booking.zones,
753+
})
754+
rescue error
755+
Log.error(exception: error) { "while signaling booking host changed" }
756+
end
757+
end
758+
end
759+
760+
result
720761
end
721762

722763
# patches an existing booking extension data with the changes provided
@@ -1116,36 +1157,45 @@ class Bookings < Application
11161157
end
11171158
end
11181159

1119-
private def update_booking(booking, signal = "changed")
1160+
private def update_booking(
1161+
booking,
1162+
signal = "changed",
1163+
previous_booking_start : Int64? = nil,
1164+
previous_booking_end : Int64? = nil,
1165+
previous_zones : Array(String)? = nil,
1166+
)
11201167
booking.save! rescue raise Error::ModelValidation.new(booking.errors.map { |error| {field: error.field.to_s, reason: error.message}.as({field: String?, reason: String}) }, "error validating booking data")
11211168

11221169
spawn do
11231170
begin
11241171
get_placeos_client.root.signal("staff/booking/changed", {
1125-
action: signal,
1126-
id: booking.id,
1127-
instance: booking.instance,
1128-
booking_type: booking.booking_type,
1129-
booking_start: booking.booking_start,
1130-
booking_end: booking.booking_end,
1131-
timezone: booking.timezone,
1132-
resource_id: booking.asset_id,
1133-
resource_ids: booking.asset_ids,
1134-
user_id: booking.user_id,
1135-
user_email: booking.user_email,
1136-
user_name: booking.user_name,
1137-
zones: booking.zones,
1138-
process_state: booking.process_state,
1139-
last_changed: booking.last_changed,
1140-
approver_name: booking.approver_name,
1141-
approver_email: booking.approver_email,
1142-
title: booking.title,
1143-
checked_in: booking.checked_in,
1144-
description: booking.description,
1145-
extension_data: booking.extension_data,
1146-
booked_by_email: booking.booked_by_email,
1147-
booked_by_name: booking.booked_by_name,
1148-
induction: booking.induction,
1172+
action: signal,
1173+
id: booking.id,
1174+
instance: booking.instance,
1175+
booking_type: booking.booking_type,
1176+
booking_start: booking.booking_start,
1177+
booking_end: booking.booking_end,
1178+
timezone: booking.timezone,
1179+
resource_id: booking.asset_id,
1180+
resource_ids: booking.asset_ids,
1181+
previous_booking_start: previous_booking_start,
1182+
previous_booking_end: previous_booking_end,
1183+
previous_zones: previous_zones,
1184+
user_id: booking.user_id,
1185+
user_email: booking.user_email,
1186+
user_name: booking.user_name,
1187+
zones: booking.zones,
1188+
process_state: booking.process_state,
1189+
last_changed: booking.last_changed,
1190+
approver_name: booking.approver_name,
1191+
approver_email: booking.approver_email,
1192+
title: booking.title,
1193+
checked_in: booking.checked_in,
1194+
description: booking.description,
1195+
extension_data: booking.extension_data,
1196+
booked_by_email: booking.booked_by_email,
1197+
booked_by_name: booking.booked_by_name,
1198+
induction: booking.induction,
11491199
})
11501200
rescue error
11511201
Log.error(exception: error) { "while signaling booking #{signal}" }

0 commit comments

Comments
 (0)