feat: prevent rescheduling past bookings (#18003)

* feat: prevent rescheduling past bookings

* hide reschedule option on frontend

* fix

* addd null check for booking.endTime

---------

Co-authored-by: Prashant Varma <prashantvarma5083@gmail.com>
This commit is contained in:
Kartik Saini
2024-12-05 16:36:00 +01:00
committed by GitHub
co-authored by Prashant Varma
parent 5d88858995
commit e2de28b933
3 changed files with 44 additions and 30 deletions
+21 -17
View File
@@ -212,23 +212,27 @@ function BookingListItem(booking: BookingItemProps) {
];
const editBookingActions: ActionType[] = [
{
id: "reschedule",
icon: "clock" as const,
label: t("reschedule_booking"),
href: `/reschedule/${booking.uid}${
booking.seatsReferences.length ? `?seatReferenceUid=${getSeatReferenceUid()}` : ""
}`,
},
{
id: "reschedule_request",
icon: "send" as const,
iconClassName: "rotate-45 w-[16px] -translate-x-0.5 ",
label: t("send_reschedule_request"),
onClick: () => {
setIsOpenRescheduleDialog(true);
},
},
...(isBookingInPast
? []
: [
{
id: "reschedule",
icon: "clock" as const,
label: t("reschedule_booking"),
href: `/reschedule/${booking.uid}${
booking.seatsReferences.length ? `?seatReferenceUid=${getSeatReferenceUid()}` : ""
}`,
},
{
id: "reschedule_request",
icon: "send" as const,
iconClassName: "rotate-45 w-[16px] -translate-x-0.5 ",
label: t("send_reschedule_request"),
onClick: () => {
setIsOpenRescheduleDialog(true);
},
},
]),
...(isBookingReroutable(parsedBooking)
? [
{
@@ -115,6 +115,28 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
};
}
const eventType = booking.eventType ? booking.eventType : getDefaultEvent(dynamicEventSlugRef);
const enrichedBookingUser = booking.user
? await UserRepository.enrichUserWithItsProfile({ user: booking.user })
: null;
const eventUrl = await buildEventUrlFromBooking({
eventType,
dynamicGroupSlugRef: booking.dynamicGroupSlugRef ?? null,
profileEnrichedBookingUser: enrichedBookingUser,
});
const isBookingInPast = booking.endTime && new Date(booking.endTime) < new Date();
if (isBookingInPast) {
return {
redirect: {
destination: eventUrl,
permanent: false,
},
};
}
// if booking event type is for a seated event and no seat reference uid is provided, throw not found
if (booking?.eventType?.seatsPerTimeSlot && !maybeSeatReferenceUid) {
const userId = session?.user?.id;
@@ -142,18 +164,6 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
}
}
const eventType = booking.eventType ? booking.eventType : getDefaultEvent(dynamicEventSlugRef);
const enrichedBookingUser = booking.user
? await UserRepository.enrichUserWithItsProfile({ user: booking.user })
: null;
const eventUrl = await buildEventUrlFromBooking({
eventType,
dynamicGroupSlugRef: booking.dynamicGroupSlugRef ?? null,
profileEnrichedBookingUser: enrichedBookingUser,
});
const destinationUrlSearchParams = new URLSearchParams();
destinationUrlSearchParams.set("rescheduleUid", seatReferenceUid || bookingUid);
@@ -729,7 +729,7 @@ export default function Success(props: PageProps) {
</span>
<>
{!props.recurringBookings && (
{!props.recurringBookings && !isBookingInPast && (
<span className="text-default inline">
<span className="underline" data-testid="reschedule-link">
<Link