Files
cal.diy/packages/features/bookings/Booker
8ad442f2be feat: Upgrade to Next 15 (#18834)
* wip

* update layoutHOC

* wip

* remove app router related code no longer used

* remove more

* await cookies, headers, params, serachparams

* update yarn.lock

* await cookies, headers, params, serachparams more

* update yarn lock again

* downgrade next-auth to 4.22.1

* update yarn lock

* fix

* update yarn lock

* fix type checks

* update yarn lock

* await headers and cookies

* restore pages folder

* restore yarn.lock

* update yarn.lock

* await headers and cookies

* remove

* await params in API routes

* updates

* restore next.config.js

* remove i18n from next.config.js

* Fixed tests

* Fixed types

* Removed duplicate favicon.ico

* Fixing more types

* ImageResponse moved to next/og

* Fixed prisma import issues

* dynamic import for @ewsjs/xhr

* remove deasync dep

* dynamic import for @tryvital/vital-node

* fix type checks

* add back turbopack command

* Type fix

* Removed unneeded file

* fix turbopack relative path errors

* add comments

* remove unneeded code

* Fixed build errors

* await apis

* use Promise<Params> type in defaultResponderForAppDir util

* refactor scim api route

* fix type checks

* separate app-routing.config into client-config and server-config

* wip

* refactor routing forms components

* revert unneeded changes for easier review

* fix

* fix

* use CustomTrans

* fix type

* fix unit tests

* fix type error

* fix build error

* fix build error

* fix build error

* fix warnings

* fix warnings

* upgrade @tremor/react and tailwindcss

* numCols -> numItems

* fix forgot-password e2e test

* fix 1 more e2e test

* fix login e2e test

* fix e2e tests

* fix e2e tests

* clean up

* remove error

* use tremor/react 2.11.0

* fix

* rename CustomTrans to ServerTrans

* address comment

* fix test

* fix ServerTrans

* fix

* fix type

* fix ServerTrans usages 1

* fix translations

* fix type checks

* fix type checks

* link styling

* fix

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
2025-03-20 21:30:51 -03:00
..

Strategies to prevent error during booking

  • The getSchedule call, fetches only those slots that are bookable including not showing the slots that are reserved by someone else.
    • The booking call and the get scheduled call share the same availability checking logic to avoid scenario where getSchedule considers a slot as available but Booking call doesn't consider it available.
  • Even though a slot might be available, multiple people might have opened the same booking page and might want to book the same slot.
    • We have a reservation system in place that avoid showing a slot that is reserved by someone to other people.
    • The getSchedule call itself considers the reservations and doesn't show those slots.
    • When two persons open the same booking page at the same time, they might will see the same slots.
      • If Person1 selects slot1, it will be reserved by Person1. Person2 still sees the slot(because getSchedule is refetched after a long time(in minutes)). But when Person2 selects the same slot1, he will go to "Slot no-longer available" state.
        • Also when the Person2, comes back to the slots listing page, he will see the slot as unavailable now. It works because getSchedule would have been fetched by that time which happened when he selected the slot earlier.
  • We don't check for reservation during the confirm booking call, because a reservation has lower priority then the actual booking.

"Slot no-longer available" state

  • When a slot is no longer available, we disable the "Confirm" button which does the booking.
  • We show a message to the user that he should select a different slot.
  • To ensure that we can go to this state, whenever applicable, we do the following:
    • getSchedule fetching. It prevents the unavailable slot to not appear in the list.
      • Fetched on window focus to handle the users who have the page opened for some time then come back to it
      • Fetched every 5 mins(configurable by .env) as well to handle users who are just there on the page for a long time.
      • Fetched on selecting a slot.
    • isReservation query. It prevents the unavailable slot to be not bookable by the User
      • Fetched on regular quick intervals(currently every 10s(configurable by .env)). Even though it doesn't detect actual busy/booked slots, it still avoids the attempted booking of a reserved slot.