Skip to content
Draft
Show file tree
Hide file tree
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
62 changes: 62 additions & 0 deletions spec/booking_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,68 @@ module PlaceOS::Model
list.map(&.id).should contain(bookings[4].id)
list.map(&.id).should contain(bookings[5].id)
end

it "returns bookings by_user_or_email including guest attendee" do
tenant_id = Generator.tenant.id

user_one_email = "[email protected]"
user_two_email = "[email protected]"

bookings = [] of Booking

bookings << Booking.new(
booking_type: "group-event",
asset_ids: ["room-1"],
booking_start: 1.hour.from_now.to_unix,
booking_end: 2.hours.from_now.to_unix,
user_email: PlaceOS::Model::Email.new(user_one_email),
user_name: "One",
booked_by_email: PlaceOS::Model::Email.new(user_one_email),
booked_by_name: "One",
tenant_id: tenant_id,
booked_by_id: "user-1",
history: [] of Booking::History,
permission: Booking::Permission::OPEN
).save!

user_two_guest = Guest.new(
email: user_two_email,
name: "Two",
tenant_id: tenant_id
).save!

user_two_attendee = Attendee.new(
booking_id: bookings[0].id,
guest_id: user_two_guest.id,
tenant_id: tenant_id,
checked_in: false,
visit_expected: true,
).save!

bookings << Booking.new(
booking_type: "group-event",
asset_ids: ["room-2"],
booking_start: 2.hour.from_now.to_unix,
booking_end: 3.hours.from_now.to_unix,
user_email: PlaceOS::Model::Email.new(user_one_email),
user_name: "One",
booked_by_email: PlaceOS::Model::Email.new(user_one_email),
booked_by_name: "One",
tenant_id: tenant_id,
booked_by_id: "user-1",
history: [] of Booking::History,
permission: Booking::Permission::OPEN
).save!

query = Booking
.by_tenant(tenant_id)
.by_user_or_email(nil, user_two_email, true, false, false, true)

list = query.to_a
list.size.should eq 1
list.map(&.id).should contain(bookings[0].id)
list.map(&.id).should_not contain(bookings[1].id)
end
end

it "successfully saves a booking" do
Expand Down
12 changes: 10 additions & 2 deletions src/placeos-models/booking.cr
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,10 @@ module PlaceOS::Model
end

scope :by_user_or_email do |user_id_value, user_email_value, include_booked_by, include_open_permission, include_public_permission|
by_user_or_email(user_id_value, user_email_value, include_booked_by, include_open_permission, include_public_permission, false)
end

scope :by_user_or_email do |user_id_value, user_email_value, include_booked_by, include_open_permission, include_public_permission, include_attendee|
# TODO: Construct `user_or_email` query correctly
booked_by = include_booked_by ? %( OR "booked_by_id" = '#{user_id_value}') : ""
open_permission = include_open_permission ? %( OR "permission" = 'OPEN') : ""
Expand All @@ -288,13 +292,17 @@ module PlaceOS::Model

user_email_digest = PlaceOS::Model::Email.new(user_email_value.to_s).digest if user_email_value

if include_attendee
attendee = %( OR "bookings"."id" IN (SELECT "bookings"."id" FROM "bookings" LEFT JOIN "attendees" ON "bookings"."id" = "attendees"."booking_id" LEFT JOIN "guests" ON "attendees"."guest_id" = "guests"."id" WHERE "guests"."email" = '#{user_email_value}') )
end

if user_id_value && user_email_digest
where("user_id = ? OR email_digest = ? #{booked_by} #{open_permission} #{public_permission}", user_id_value, user_email_digest)
where("user_id = ? OR email_digest = ? #{booked_by} #{open_permission} #{public_permission} #{attendee}", user_id_value, user_email_digest)
elsif user_id_value
where("user_id = ? #{booked_by} #{open_permission} #{public_permission}", user_id_value)
elsif user_email_digest
booked_by = include_booked_by ? %( OR "booked_by_email_digest" = '#{user_email_digest}') : ""
where("email_digest = ? #{booked_by} #{open_permission} #{public_permission}", user_email_digest)
where("email_digest = ? #{booked_by} #{open_permission} #{public_permission} #{attendee}", user_email_digest)
else
self
end
Expand Down