diff --git a/app/features/calendar/calendar-utils.ts b/app/features/calendar/calendar-utils.ts
new file mode 100644
index 000000000..b0d0ffb2c
--- /dev/null
+++ b/app/features/calendar/calendar-utils.ts
@@ -0,0 +1,4 @@
+import { userDiscordIdIsAged } from "~/utils/users";
+
+export const canAddNewEvent = (user: { discordId: string }) =>
+ userDiscordIdIsAged(user);
diff --git a/app/features/calendar/routes/calendar.new.tsx b/app/features/calendar/routes/calendar.new.tsx
index e15c49e3d..ac49670cc 100644
--- a/app/features/calendar/routes/calendar.new.tsx
+++ b/app/features/calendar/routes/calendar.new.tsx
@@ -34,7 +34,7 @@ import type {
import { useIsMounted } from "~/hooks/useIsMounted";
import { useTranslation } from "~/hooks/useTranslation";
import { useUser } from "~/features/auth/core";
-import { requireUserId } from "~/features/auth/core/user.server";
+import { requireUser } from "~/features/auth/core/user.server";
import { i18next } from "~/modules/i18n";
import { MapPool } from "~/features/map-list-generator/core/map-pool";
import { canEditCalendarEvent, canEnableTOTools } from "~/permissions";
@@ -71,6 +71,7 @@ import type { RankedModeShort } from "~/modules/in-game-lists";
import { rankedModesShort } from "~/modules/in-game-lists/modes";
import * as BadgeRepository from "~/features/badges/BadgeRepository.server";
import * as CalendarRepository from "~/features/calendar/CalendarRepository.server";
+import { canAddNewEvent } from "../calendar-utils";
const MIN_DATE = new Date(Date.UTC(2015, 4, 28));
@@ -136,12 +137,14 @@ const newCalendarEventActionSchema = z.object({
});
export const action: ActionFunction = async ({ request }) => {
- const user = await requireUserId(request);
+ const user = await requireUser(request);
const data = await parseRequestFormData({
request,
schema: newCalendarEventActionSchema,
});
+ validate(canAddNewEvent(user), "Not authorized", 401);
+
const commonArgs = {
name: data.name,
description: data.description,
@@ -207,9 +210,11 @@ export const handle: SendouRouteHandle = {
export const loader = async ({ request }: LoaderArgs) => {
const t = await i18next.getFixedT(request);
- const user = await requireUserId(request);
+ const user = await requireUser(request);
const url = new URL(request.url);
+ validate(canAddNewEvent(user), "Not authorized", 401);
+
const eventId = Number(url.searchParams.get("eventId"));
const eventToEdit = Number.isNaN(eventId)
? undefined
diff --git a/app/features/calendar/routes/calendar.tsx b/app/features/calendar/routes/calendar.tsx
index 0ed4cf0b8..19c5ba687 100644
--- a/app/features/calendar/routes/calendar.tsx
+++ b/app/features/calendar/routes/calendar.tsx
@@ -44,6 +44,7 @@ import { Tags } from "../components/Tags";
import { Divider } from "~/components/Divider";
import { UsersIcon } from "~/components/icons/Users";
import * as CalendarRepository from "../CalendarRepository.server";
+import { canAddNewEvent } from "../calendar-utils";
export const links: LinksFunction = () => {
return [{ rel: "stylesheet", href: styles }];
@@ -176,7 +177,7 @@ export default function CalendarPage() {