Skip to content

Commit 1a4d431

Browse files
authored
Fix: Handle incorrect event slugs (#835)
1 parent 25af7c7 commit 1a4d431

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

frontend/src/components/layouts/PublicEvent/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ export const PublicEvent = () => {
2323
);
2424
};
2525

26-
export default PublicEvent;
26+
export default PublicEvent;

frontend/src/routeLoaders/publicEventRouteLoader.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {LoaderFunctionArgs} from "react-router";
1+
import {LoaderFunctionArgs, redirect} from "react-router";
22
import {promoCodeClientPublic} from "../api/promo-code.client.ts";
33
import {getEventPublicQuery} from "../queries/useGetEventPublic.ts";
44
import {getQueryClient} from "../utilites/ssrQueryClient.ts";
@@ -21,10 +21,23 @@ export const publicEventRouteLoader = async ({params, request}: LoaderFunctionAr
2121
promoCode,
2222
promoCodeValid ?? false,
2323
);
24+
2425
const event = await getQueryClient().fetchQuery(eventQuery);
2526

27+
if (event && event.slug && params.eventSlug !== event.slug) {
28+
const searchString = queryParams.toString();
29+
throw redirect(
30+
`/event/${event.id}/${event.slug}${searchString ? `?${searchString}` : ''}`
31+
);
32+
}
33+
2634
return {event, promoCodeValid, promoCode};
2735
} catch (error: any) {
36+
// Re-throw redirect responses so React Router can handle them
37+
if (error instanceof Response) {
38+
throw error;
39+
}
40+
2841
if (error?.response?.status === 404) {
2942
return {event: null, promoCodeValid: undefined, promoCode: null};
3043
}

frontend/src/routeLoaders/publicOrganizerRouteLoader.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import {LoaderFunctionArgs} from "react-router";
1+
import {LoaderFunctionArgs, redirect} from "react-router";
22
import {getQueryClient} from "../utilites/ssrQueryClient.ts";
33
import {getOrganizerPublicQuery} from "../queries/useGetOrganizerPublic.ts";
44
import {getOrganizerPublicEventsQuery} from "../queries/useGetOrganizerEventsPublic.ts";
55
import {EventStatus, QueryFilterOperator} from "../types.ts";
66

77
export const publicOrganizerRouteLoader = async ({params, request}: LoaderFunctionArgs) => {
8-
const {organizerId} = params;
8+
const {organizerId, organizerSlug} = params;
99
const url = new URL(request.url);
10+
const queryParams = new URLSearchParams(url.search);
1011
const isPastEvents = url.pathname.endsWith('/past-events');
1112
const pageNumber = url.searchParams.get('page') ? parseInt(url.searchParams.get('page')!) : 1;
1213

@@ -17,6 +18,14 @@ export const publicOrganizerRouteLoader = async ({params, request}: LoaderFuncti
1718
try {
1819
const organizer = await getQueryClient().fetchQuery(getOrganizerPublicQuery(organizerId));
1920

21+
if (organizer && organizer.slug && organizerSlug !== organizer.slug) {
22+
const searchString = queryParams.toString();
23+
const pathSuffix = isPastEvents ? '/past-events' : '';
24+
throw redirect(
25+
`/events/${organizer.id}/${organizer.slug}${pathSuffix}${searchString ? `?${searchString}` : ''}`
26+
);
27+
}
28+
2029
let filter = {};
2130
if (!isPastEvents) {
2231
filter = {
@@ -50,6 +59,11 @@ export const publicOrganizerRouteLoader = async ({params, request}: LoaderFuncti
5059
isPastEvents
5160
};
5261
} catch (error: any) {
62+
// Re-throw redirect responses so React Router can handle them
63+
if (error instanceof Response) {
64+
throw error;
65+
}
66+
5367
if (error?.response?.status === 404) {
5468
return {organizer: null, eventsData: null, isPastEvents};
5569
}

0 commit comments

Comments
 (0)