@@ -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