Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 77 additions & 27 deletions src/controllers/bookings.cr
Original file line number Diff line number Diff line change
Expand Up @@ -578,17 +578,29 @@ class Bookings < Application
changes.instance = booking.instance
existing_booking = booking

original_host_email = existing_booking.user_email
original_start = existing_booking.booking_start
original_end = existing_booking.booking_end
original_assets = existing_booking.asset_ids
original_zones = existing_booking.zones.dup

{% 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] %}
{% 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] %}
begin
existing_booking.{{key.id}} = changes.{{key.id}} if changes.{{key.id}}_present?
rescue NilAssertionError
end
{% end %}

# When the host changes, resolve the new user's id and name from the user_email
if existing_booking.user_email_changed?
if new_user_email = existing_booking.user_email.presence
new_user = client.get_user_by_email(new_user_email)
raise Error::NotFound.new("user #{new_user_email} not found") unless new_user
existing_booking.user_id = new_user.id.presence || new_user_email
existing_booking.user_name = new_user.name.presence || new_user_email
end
end

extension_data = changes.extension_data unless changes.extension_data.nil?
if extension_data
booking_ext_data = existing_booking.extension_data
Expand Down Expand Up @@ -716,7 +728,36 @@ class Bookings < Application
end
end

update_booking(existing_booking, reset_state ? "changed" : "metadata_changed")
result = update_booking(
existing_booking,
reset_state ? "changed" : "metadata_changed",
previous_booking_start: original_start,
previous_booking_end: original_end,
previous_zones: original_zones,
)

if original_host_email.to_s.downcase != existing_booking.user_email.to_s.downcase
spawn do
begin
get_placeos_client.root.signal("staff/booking/host_changed", {
action: :host_changed,
booking_id: existing_booking.id,
resource_id: existing_booking.asset_id,
resource_ids: existing_booking.asset_ids,
event_title: existing_booking.title,
event_summary: existing_booking.description.presence || existing_booking.title,
event_starting: existing_booking.booking_start,
previous_host_email: original_host_email,
new_host_email: existing_booking.user_email,
zones: existing_booking.zones,
})
rescue error
Log.error(exception: error) { "while signaling booking host changed" }
end
end
end

result
end

# patches an existing booking extension data with the changes provided
Expand Down Expand Up @@ -1116,36 +1157,45 @@ class Bookings < Application
end
end

private def update_booking(booking, signal = "changed")
private def update_booking(
booking,
signal = "changed",
previous_booking_start : Int64? = nil,
previous_booking_end : Int64? = nil,
previous_zones : Array(String)? = nil,
)
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")

spawn do
begin
get_placeos_client.root.signal("staff/booking/changed", {
action: signal,
id: booking.id,
instance: booking.instance,
booking_type: booking.booking_type,
booking_start: booking.booking_start,
booking_end: booking.booking_end,
timezone: booking.timezone,
resource_id: booking.asset_id,
resource_ids: booking.asset_ids,
user_id: booking.user_id,
user_email: booking.user_email,
user_name: booking.user_name,
zones: booking.zones,
process_state: booking.process_state,
last_changed: booking.last_changed,
approver_name: booking.approver_name,
approver_email: booking.approver_email,
title: booking.title,
checked_in: booking.checked_in,
description: booking.description,
extension_data: booking.extension_data,
booked_by_email: booking.booked_by_email,
booked_by_name: booking.booked_by_name,
induction: booking.induction,
action: signal,
id: booking.id,
instance: booking.instance,
booking_type: booking.booking_type,
booking_start: booking.booking_start,
booking_end: booking.booking_end,
timezone: booking.timezone,
resource_id: booking.asset_id,
resource_ids: booking.asset_ids,
previous_booking_start: previous_booking_start,
previous_booking_end: previous_booking_end,
previous_zones: previous_zones,
user_id: booking.user_id,
user_email: booking.user_email,
user_name: booking.user_name,
zones: booking.zones,
process_state: booking.process_state,
last_changed: booking.last_changed,
approver_name: booking.approver_name,
approver_email: booking.approver_email,
title: booking.title,
checked_in: booking.checked_in,
description: booking.description,
extension_data: booking.extension_data,
booked_by_email: booking.booked_by_email,
booked_by_name: booking.booked_by_name,
induction: booking.induction,
})
rescue error
Log.error(exception: error) { "while signaling booking #{signal}" }
Expand Down
Loading