diff --git a/apps/hub/app/(app)/admin/event/_components/ParticipantForm.tsx b/apps/hub/app/(app)/admin/event/_components/ParticipantForm.tsx
new file mode 100644
index 00000000..0b69f86e
--- /dev/null
+++ b/apps/hub/app/(app)/admin/event/_components/ParticipantForm.tsx
@@ -0,0 +1,213 @@
+"use client";
+import { Participant, Event, ParticipantLog, Prisma } from "@repo/db";
+import { Users, Activity, Bug } from "lucide-react";
+import toast from "react-hot-toast";
+import { InputJsonValueType, ParticipantOptionalDefaultsSchema } from "@repo/db/zod";
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { Switch } from "_components/ui/Switch";
+import { useState } from "react";
+import { Button } from "_components/ui/Button";
+import { useMutation, useQueryClient } from "@tanstack/react-query";
+import { upsertParticipant } from "(app)/events/actions";
+import { deleteParticipant } from "../action";
+import { redirect } from "next/navigation";
+
+interface ParticipantFormProps {
+ event: Event;
+ participant: Participant;
+}
+
+const checkEventCompleted = (participant: Participant, event: Event): boolean => {
+ return event.finisherMoodleCourseId ? participant.finisherMoodleCurseCompleted : false;
+};
+
+export const ParticipantForm = ({ event, participant }: ParticipantFormProps) => {
+ const [isLoading, setIsLoading] = useState(false);
+ const queryClient = useQueryClient();
+
+ const upsertParticipantMutation = useMutation({
+ mutationKey: ["upsertParticipant"],
+ mutationFn: async (newData: Prisma.ParticipantUncheckedCreateInput) => {
+ const data = await upsertParticipant(newData);
+ await queryClient.invalidateQueries({ queryKey: ["participants", event.id] });
+ return data;
+ },
+ });
+
+ const deleteParticipantMutation = useMutation({
+ mutationKey: ["deleteParticipant"],
+ mutationFn: async (participantId: number) => {
+ await deleteParticipant(participantId);
+ await queryClient.invalidateQueries({ queryKey: ["participants", event.id] });
+ },
+ });
+
+ const eventCompleted = checkEventCompleted(participant, event);
+
+ const form = useForm({
+ resolver: zodResolver(ParticipantOptionalDefaultsSchema),
+ defaultValues: participant,
+ });
+
+ const handleEventFinished = async () => {
+ setIsLoading(true);
+ try {
+ await upsertParticipantMutation.mutateAsync({
+ eventId: event.id,
+ userId: participant.userId,
+ });
+ toast.success("Event als beendet markiert");
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleCheckMoodle = async () => {
+ setIsLoading(true);
+ try {
+ toast.success("Moodle-Check durchgeführt");
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+ );
+};
diff --git a/apps/hub/app/(app)/admin/event/action.ts b/apps/hub/app/(app)/admin/event/action.ts
index 0a3c6a3e..438135ce 100644
--- a/apps/hub/app/(app)/admin/event/action.ts
+++ b/apps/hub/app/(app)/admin/event/action.ts
@@ -2,6 +2,7 @@
import { prisma, Prisma, Event, Participant } from "@repo/db";
+//############# Event //#############
export const upsertEvent = async (event: Prisma.EventCreateInput, id?: Event["id"]) => {
const newEvent = id
? await prisma.event.update({
@@ -11,34 +12,22 @@ export const upsertEvent = async (event: Prisma.EventCreateInput, id?: Event["id
: await prisma.event.create({ data: event });
return newEvent;
};
-
export const deleteEvent = async (id: Event["id"]) => {
await prisma.event.delete({ where: { id: id } });
};
-export const upsertAppointment = async (
- eventAppointment: Prisma.EventAppointmentUncheckedCreateInput,
-) => {
- const newEventAppointment = eventAppointment.id
- ? await prisma.eventAppointment.update({
- where: { id: eventAppointment.id },
- data: eventAppointment,
+//############# Participant //#############
+
+export const upsertParticipant = async (participant: Prisma.ParticipantUncheckedCreateInput) => {
+ const newParticipant = participant.id
+ ? await prisma.participant.update({
+ where: { id: participant.id },
+ data: participant,
})
- : await prisma.eventAppointment.create({ data: eventAppointment });
- return newEventAppointment;
+ : await prisma.participant.create({ data: participant });
+ return newParticipant;
};
-export const deleteAppoinement = async (id: Event["id"]) => {
- await prisma.eventAppointment.delete({ where: { id: id } });
- prisma.eventAppointment.findMany({
- where: {
- eventId: id,
- },
- orderBy: {
- // TODO: add order by in relation to table selected column
- },
- });
-};
export const deleteParticipant = async (id: Participant["id"]) => {
await prisma.participant.delete({ where: { id: id } });
};
diff --git a/apps/hub/app/(app)/events/_components/EventCard.tsx b/apps/hub/app/(app)/events/_components/EventCard.tsx
index 0f66e28f..a64465c2 100644
--- a/apps/hub/app/(app)/events/_components/EventCard.tsx
+++ b/apps/hub/app/(app)/events/_components/EventCard.tsx
@@ -1,6 +1,6 @@
"use client";
import { DrawingPinFilledIcon } from "@radix-ui/react-icons";
-import { Event, Participant, EventAppointment, User } from "@repo/db";
+import { Event, Participant, User } from "@repo/db";
import ModalBtn from "./Modal";
import MDEditor from "@uiw/react-md-editor";
import { Badge } from "@repo/shared-components";
@@ -8,25 +8,18 @@ import { Badge } from "@repo/shared-components";
export const EventCard = ({
user,
event,
- selectedAppointments,
- appointments,
}: {
user: User;
event: Event & {
- Appointments: EventAppointment[];
Participants: Participant[];
};
- selectedAppointments: EventAppointment[];
- appointments: (EventAppointment & {
- Participants: { userId: string }[];
- })[];
}) => {
return (
-
+
{event.name}
-
+
{event.type === "COURSE" && (
Zusatzqualifikation
)}
@@ -36,7 +29,7 @@ export const EventCard = ({
-
-
+
{event.finishedBadges.map((b) => {
return ;
})}
-
+
-
+
Teilnahmevoraussetzungen:
{!event.requiredBadges.length && "Keine"}
{!!event.requiredBadges.length && (
-
-
Abzeichen:
+
+
Abzeichen:
{event.requiredBadges.map((badge) => (
@@ -71,11 +64,9 @@ export const EventCard = ({
)}
diff --git a/apps/hub/app/(app)/events/_components/Modal.tsx b/apps/hub/app/(app)/events/_components/Modal.tsx
index bcf0e910..74b45364 100644
--- a/apps/hub/app/(app)/events/_components/Modal.tsx
+++ b/apps/hub/app/(app)/events/_components/Modal.tsx
@@ -1,56 +1,30 @@
"use client";
import { useEffect } from "react";
import { CheckCircledIcon, EnterIcon, DrawingPinFilledIcon } from "@radix-ui/react-icons";
-import { Event, EventAppointment, Participant, User } from "@repo/db";
+import { Event, Participant, User } from "@repo/db";
import { cn } from "@repo/shared-components";
import { inscribeToMoodleCourse, upsertParticipant } from "../actions";
import {
BookCheck,
- Calendar,
Check,
CirclePlay,
- Clock10Icon,
ExternalLink,
EyeIcon,
Info,
TriangleAlert,
} from "lucide-react";
-import { useForm } from "react-hook-form";
-import {
- InputJsonValueType,
- ParticipantOptionalDefaults,
- ParticipantOptionalDefaultsSchema,
-} from "@repo/db/zod";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Select } from "../../../_components/ui/Select";
-import { useRouter } from "next/navigation";
-import { handleParticipantEnrolled } from "../../../../helper/events";
import { eventCompleted } from "@repo/shared-components";
import MDEditor from "@uiw/react-md-editor";
-import toast from "react-hot-toast";
-import { formatDate } from "date-fns";
interface ModalBtnProps {
title: string;
event: Event;
- dates: (EventAppointment & {
- Participants: { userId: string }[];
- })[];
- selectedAppointments: EventAppointment[];
participant?: Participant;
user: User;
modalId: string;
}
-const ModalBtn = ({
- title,
- dates,
- modalId,
- participant,
- selectedAppointments,
- event,
- user,
-}: ModalBtnProps) => {
+const ModalBtn = ({ title, modalId, participant, event, user }: ModalBtnProps) => {
useEffect(() => {
const modal = document.getElementById(modalId) as HTMLDialogElement;
const handleOpen = () => {
@@ -66,12 +40,6 @@ const ModalBtn = ({
modal?.removeEventListener("close", handleClose);
};
}, [modalId]);
- const router = useRouter();
-
- const canSelectDate =
- event.hasPresenceEvents &&
- !participant?.attended &&
- (selectedAppointments.length === 0 || participant?.appointmentCancelled);
const openModal = () => {
const modal = document.getElementById(modalId) as HTMLDialogElement;
@@ -82,29 +50,6 @@ const ModalBtn = ({
const modal = document.getElementById(modalId) as HTMLDialogElement;
modal?.close();
};
- const selectAppointmentForm = useForm
({
- resolver: zodResolver(ParticipantOptionalDefaultsSchema),
- defaultValues: {
- eventId: event.id,
- userId: user.id,
- ...participant,
- },
- });
- const selectedAppointment = selectedAppointments[0];
- const selectedDate = dates.find(
- (date) =>
- date.id === selectAppointmentForm.watch("eventAppointmentId") || selectedAppointment?.id,
- );
- const ownIndexInParticipantList = selectedDate?.Participants?.findIndex(
- (p) => p.userId === user.id,
- );
-
- const ownPlaceInParticipantList =
- typeof ownIndexInParticipantList === "number"
- ? ownIndexInParticipantList === -1
- ? (selectedDate?.Participants?.length ?? 0) + 1
- : ownIndexInParticipantList + 1
- : undefined;
const missingRequirements =
event.requiredBadges?.length > 0 &&
@@ -163,79 +108,6 @@ const ModalBtn = ({
/>
- {event.hasPresenceEvents && (
-
-
- Termine
-
-
- {!!dates.length && !selectedDate && (
- <>
-
Melde dich zu einem Termin an
-
({
- label: `${formatDate(date.appointmentDate, "dd.MM.yyyy HH:mm")} - (${date.Participants.length}/${event.maxParticipants})`,
- value: date.id,
- }))}
- name="eventAppointmentId"
- label={""}
- placeholder="Wähle einen Termin"
- className="min-w-[250px]"
- />
- >
- )}
- {selectedAppointment && !participant?.appointmentCancelled && (
-
-
Dein ausgewählter Termin (Deutsche Zeit)
-
-
- {new Date(selectedAppointment.appointmentDate).toLocaleString("de-DE", {
- year: "numeric",
- month: "2-digit",
- day: "2-digit",
- hour: "2-digit",
- minute: "2-digit",
- })}
-
-
- {participant?.attended ? (
-
-
- Du hast an dem Presenztermin teilgenommen
-
- ) : (
-
- Bitte erscheine ~5 minuten vor dem Termin im Discord
-
- )}
-
- )}
-
- {!dates.length && (
- Aktuell sind keine Termine verfügbar
- )}
-
- {!!selectedDate &&
- !!event.maxParticipants &&
- !!ownPlaceInParticipantList &&
- !!(ownPlaceInParticipantList > event.maxParticipants) && (
-
-
- Dieser Termin ist ausgebucht, wahrscheinlich wirst du nicht teilnehmen
- können. (Listenplatz: {ownPlaceInParticipantList} , max.{" "}
- {event.maxParticipants})
-
- )}
-
-
- )}
{event.finisherMoodleCourseId && (
@@ -261,64 +133,6 @@ const ModalBtn = ({
{!event.requiredBadges.length && "Keine"}
-
- {!!canSelectDate && (
- {
- const data = selectAppointmentForm.getValues();
- if (!data.eventAppointmentId) return;
-
- const participant = await upsertParticipant({
- ...data,
- enscriptionDate: new Date(),
- statusLog: data.statusLog?.filter((log) => log !== null),
- appointmentCancelled: false,
- });
- await handleParticipantEnrolled(participant.id.toString());
-
- router.refresh();
- closeModal();
- }}
- disabled={!selectAppointmentForm.watch("eventAppointmentId")}
- >
- Anmelden
-
- )}
- {selectedAppointment &&
- !participant?.appointmentCancelled &&
- !participant?.attended && (
- {
- await upsertParticipant({
- eventId: event.id,
- userId: participant!.userId,
- appointmentCancelled: true,
- statusLog: [
- ...(participant?.statusLog as unknown as InputJsonValueType[]),
- {
- data: {
- appointmentId: selectedAppointment.id,
- appointmentDate: selectedAppointment.appointmentDate,
- },
- user: `${user?.firstname} ${user?.lastname} - ${user?.publicId}`,
- event: "Termin abgesagt",
- timestamp: new Date(),
- },
- ],
- });
- toast.success("Termin abgesagt");
- router.refresh();
- }}
- className="btn btn-error btn-outline btn-wide"
- >
- Termin Absagen
-
- )}
-
@@ -335,7 +149,6 @@ const MoodleCourseIndicator = ({
completed,
moodleCourseId,
event,
- participant,
user,
}: {
user: User;
@@ -345,13 +158,6 @@ const MoodleCourseIndicator = ({
event: Event;
}) => {
const courseUrl = `${process.env.NEXT_PUBLIC_MOODLE_URL}/course/view.php?id=${moodleCourseId}`;
- if (event.hasPresenceEvents && !participant?.attended)
- return (
-
-
- Abschlusstest erst nach Teilnahme verfügbar
-
- );
if (completed)
return (
diff --git a/apps/hub/app/(app)/events/page.tsx b/apps/hub/app/(app)/events/page.tsx
index be2e660e..cdfbd3d4 100644
--- a/apps/hub/app/(app)/events/page.tsx
+++ b/apps/hub/app/(app)/events/page.tsx
@@ -14,13 +14,6 @@ const page = async () => {
hidden: false,
},
include: {
- Appointments: {
- where: {
- appointmentDate: {
- gte: new Date(),
- },
- },
- },
Participants: {
where: {
userId: user.id,
@@ -32,42 +25,6 @@ const page = async () => {
id: "desc",
},
});
- const appointments = await prisma.eventAppointment.findMany({
- where: {
- appointmentDate: {
- gte: new Date(),
- },
- },
- include: {
- Participants: {
- select: {
- enscriptionDate: true,
- id: true,
- userId: true,
- },
- where: {
- appointmentCancelled: false,
- },
- orderBy: {
- enscriptionDate: "asc",
- },
- },
- _count: {
- select: {
- Participants: true,
- },
- },
- },
- });
- const userAppointments = await prisma.eventAppointment.findMany({
- where: {
- Participants: {
- some: {
- userId: user.id,
- },
- },
- },
- });
return (
@@ -78,15 +35,7 @@ const page = async () => {
{events.map((event) => {
- return (
-
- );
+ return ;
})}
);
diff --git a/apps/hub/app/api/event/route.ts b/apps/hub/app/api/event/route.ts
index 704842e6..3c3a216c 100644
--- a/apps/hub/app/api/event/route.ts
+++ b/apps/hub/app/api/event/route.ts
@@ -24,15 +24,6 @@ export async function GET(request: Request): Promise
{
userId: session.user.id,
},
},
- Appointments: {
- include: {
- Participants: {
- where: {
- appointmentCancelled: false,
- },
- },
- },
- },
},
});
diff --git a/apps/hub/helper/events.ts b/apps/hub/helper/events.ts
index 4bc8827c..9c664c5a 100644
--- a/apps/hub/helper/events.ts
+++ b/apps/hub/helper/events.ts
@@ -1,13 +1,9 @@
-import { Event, EventAppointment, Participant, Prisma } from "@repo/db";
+import { Event, Participant, Prisma } from "@repo/db";
import axios from "axios";
export const getEvents = async (filter: Prisma.EventWhereInput) => {
const { data } = await axios.get<
(Event & {
- Appointments: (EventAppointment & {
- Appointments: EventAppointment[];
- Participants: Participant[];
- })[];
Participants: Participant[];
})[]
>(`/api/event`, {
diff --git a/package.json b/package.json
index da08da6d..a7352403 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
"node": ">=18",
"pnpm": ">=10"
},
- "packageManager": "pnpm@10.28.0",
+ "packageManager": "pnpm@10.28.2",
"workspaces": [
"apps/*",
"packages/*"
diff --git a/packages/database/package.json b/packages/database/package.json
index c197f985..a7eb3e99 100644
--- a/packages/database/package.json
+++ b/packages/database/package.json
@@ -25,6 +25,7 @@
"zod-prisma-types": "^3.2.4"
},
"devDependencies": {
+ "@types/node": "^25.1.0",
"prisma": "^6.12.0"
}
}
diff --git a/packages/database/prisma/schema/event.prisma b/packages/database/prisma/schema/event.prisma
index 34872a14..b4c75c9a 100644
--- a/packages/database/prisma/schema/event.prisma
+++ b/packages/database/prisma/schema/event.prisma
@@ -5,33 +5,17 @@ enum EVENT_TYPE {
EVENT
}
-model EventAppointment {
- id Int @id @default(autoincrement())
- eventId Int
- appointmentDate DateTime
- presenterId String
- // relations:
- Users User[] @relation("EventAppointmentUser")
- Participants Participant[]
- Event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
- Presenter User @relation(fields: [presenterId], references: [id])
-}
-
model Participant {
id Int @id @default(autoincrement())
userId String @map(name: "user_id")
finisherMoodleCurseCompleted Boolean @default(false)
- attended Boolean @default(false)
- appointmentCancelled Boolean @default(false)
- eventAppointmentId Int?
enscriptionDate DateTime @default(now())
- statusLog Json[] @default([])
- eventId Int
+ statusLog Json[] @default([])
+ eventId Int
// relations:
- User User @relation(fields: [userId], references: [id], onDelete: Cascade)
- Event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
- EventAppointment EventAppointment? @relation(fields: [eventAppointmentId], references: [id])
+ User User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ Event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
}
model Event {
@@ -41,8 +25,6 @@ model Event {
description String
type EVENT_TYPE @default(EVENT)
discordRoleId String? @default("")
- hasPresenceEvents Boolean @default(false)
- maxParticipants Int? @default(0)
finisherMoodleCourseId String? @default("")
finishedBadges BADGES[] @default([])
requiredBadges BADGES[] @default([])
@@ -51,7 +33,6 @@ model Event {
// relations:
Participants Participant[]
- Appointments EventAppointment[]
}
model File {
diff --git a/packages/database/prisma/schema/migrations/20260117233913_remove_event_appointments/migration.sql b/packages/database/prisma/schema/migrations/20260117233913_remove_event_appointments/migration.sql
new file mode 100644
index 00000000..2f79843d
--- /dev/null
+++ b/packages/database/prisma/schema/migrations/20260117233913_remove_event_appointments/migration.sql
@@ -0,0 +1,35 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `appointmentCancelled` on the `Participant` table. All the data in the column will be lost.
+ - You are about to drop the column `attended` on the `Participant` table. All the data in the column will be lost.
+ - You are about to drop the column `eventAppointmentId` on the `Participant` table. All the data in the column will be lost.
+ - You are about to drop the `EventAppointment` table. If the table is not empty, all the data it contains will be lost.
+ - You are about to drop the `_EventAppointmentUser` table. If the table is not empty, all the data it contains will be lost.
+
+*/
+-- DropForeignKey
+ALTER TABLE "EventAppointment" DROP CONSTRAINT "EventAppointment_eventId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "EventAppointment" DROP CONSTRAINT "EventAppointment_presenterId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "Participant" DROP CONSTRAINT "Participant_eventAppointmentId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "_EventAppointmentUser" DROP CONSTRAINT "_EventAppointmentUser_A_fkey";
+
+-- DropForeignKey
+ALTER TABLE "_EventAppointmentUser" DROP CONSTRAINT "_EventAppointmentUser_B_fkey";
+
+-- AlterTable
+ALTER TABLE "Participant" DROP COLUMN "appointmentCancelled",
+DROP COLUMN "attended",
+DROP COLUMN "eventAppointmentId";
+
+-- DropTable
+DROP TABLE "EventAppointment";
+
+-- DropTable
+DROP TABLE "_EventAppointmentUser";
diff --git a/packages/database/prisma/schema/migrations/20260117235335_remove_event_appointment/migration.sql b/packages/database/prisma/schema/migrations/20260117235335_remove_event_appointment/migration.sql
new file mode 100644
index 00000000..1f859ff9
--- /dev/null
+++ b/packages/database/prisma/schema/migrations/20260117235335_remove_event_appointment/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `hasPresenceEvents` on the `Event` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "Event" DROP COLUMN "hasPresenceEvents";
diff --git a/packages/database/prisma/schema/migrations/20260117235623_remove_max_permissions/migration.sql b/packages/database/prisma/schema/migrations/20260117235623_remove_max_permissions/migration.sql
new file mode 100644
index 00000000..01a33dec
--- /dev/null
+++ b/packages/database/prisma/schema/migrations/20260117235623_remove_max_permissions/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `maxParticipants` on the `Event` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "Event" DROP COLUMN "maxParticipants";
diff --git a/packages/database/prisma/schema/user.prisma b/packages/database/prisma/schema/user.prisma
index 80b9bc9f..244b0c62 100644
--- a/packages/database/prisma/schema/user.prisma
+++ b/packages/database/prisma/schema/user.prisma
@@ -69,8 +69,6 @@ model User {
// relations:
oauthTokens OAuthToken[]
participants Participant[]
- EventAppointmentUser EventAppointment[] @relation("EventAppointmentUser")
- EventAppointment EventAppointment[]
SentMessages ChatMessage[] @relation("SentMessages")
ReceivedMessages ChatMessage[] @relation("ReceivedMessages")
SentReports Report[] @relation("SentReports")
diff --git a/packages/shared-components/helper/event.ts b/packages/shared-components/helper/event.ts
index ba456620..07d8491a 100644
--- a/packages/shared-components/helper/event.ts
+++ b/packages/shared-components/helper/event.ts
@@ -3,6 +3,5 @@ import { Event, Participant } from "@repo/db";
export const eventCompleted = (event: Event, participant?: Participant) => {
if (!participant) return false;
if (event.finisherMoodleCourseId && !participant.finisherMoodleCurseCompleted) return false;
- if (event.hasPresenceEvents && !participant.attended) return false;
return true;
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9a37750f..14d8004b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -130,7 +130,7 @@ importers:
version: 0.5.8(@types/dom-mediacapture-transform@0.1.11)(livekit-client@2.15.3(@types/dom-mediacapture-record@1.0.22))
'@next-auth/prisma-adapter':
specifier: ^1.0.7
- version: 1.0.7(@prisma/client@6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.13(next@16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
+ version: 1.0.7(@prisma/client@6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.13(next@16.1.1(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
'@radix-ui/react-icons':
specifier: ^1.3.2
version: 1.3.2(react@19.1.0)
@@ -211,10 +211,10 @@ importers:
version: 0.525.0(react@19.1.0)
next:
specifier: '>=15.4.9'
- version: 16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 16.1.1(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
next-auth:
specifier: '>=4.24.12'
- version: 4.24.13(next@16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 4.24.13(next@16.1.1(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
npm:
specifier: ^11.4.2
version: 11.4.2
@@ -588,6 +588,9 @@ importers:
specifier: ^3.2.4
version: 3.2.4(@prisma/client@6.12.0(prisma@6.12.0(typescript@5.9.3))(typescript@5.9.3))(prisma@6.12.0(typescript@5.9.3))
devDependencies:
+ '@types/node':
+ specifier: ^25.1.0
+ version: 25.1.0
prisma:
specifier: ^6.12.0
version: 6.12.0(typescript@5.9.3)
@@ -2161,6 +2164,9 @@ packages:
'@types/node@22.15.34':
resolution: {integrity: sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==}
+ '@types/node@25.1.0':
+ resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==}
+
'@types/nodemailer@6.4.17':
resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==}
@@ -5290,6 +5296,9 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
undici@6.21.3:
resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==}
engines: {node: '>=18.17'}
@@ -5603,7 +5612,7 @@ snapshots:
'@babel/parser': 7.27.7
'@babel/template': 7.27.2
'@babel/types': 7.27.7
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -5852,7 +5861,7 @@ snapshots:
'@eslint/eslintrc@3.3.1':
dependencies:
ajv: 6.12.6
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
espree: 10.4.0
globals: 14.0.0
ignore: 5.3.2
@@ -6091,11 +6100,6 @@ snapshots:
'@prisma/client': 6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3)
next-auth: 4.24.13(next@16.1.1(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.13(next@16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))':
- dependencies:
- '@prisma/client': 6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3)
- next-auth: 4.24.13(next@16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-
'@next/env@16.1.1': {}
'@next/eslint-plugin-next@15.4.2':
@@ -7678,9 +7682,13 @@ snapshots:
dependencies:
undici-types: 6.21.0
+ '@types/node@25.1.0':
+ dependencies:
+ undici-types: 7.16.0
+
'@types/nodemailer@6.4.17':
dependencies:
- '@types/node': 22.15.29
+ '@types/node': 22.15.34
'@types/parse-json@4.0.2': {}
@@ -7749,7 +7757,7 @@ snapshots:
'@typescript-eslint/types': 8.37.0
'@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.37.0
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
eslint: 9.31.0(jiti@2.4.2)
typescript: 5.8.3
transitivePeerDependencies:
@@ -7759,7 +7767,7 @@ snapshots:
dependencies:
'@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3)
'@typescript-eslint/types': 8.37.0
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@@ -7778,7 +7786,7 @@ snapshots:
'@typescript-eslint/types': 8.37.0
'@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3)
'@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
eslint: 9.31.0(jiti@2.4.2)
ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3
@@ -7793,7 +7801,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3)
'@typescript-eslint/types': 8.37.0
'@typescript-eslint/visitor-keys': 8.37.0
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -8424,10 +8432,6 @@ snapshots:
dependencies:
ms: 2.1.3
- debug@4.4.1:
- dependencies:
- ms: 2.1.3
-
debug@4.4.1(supports-color@5.5.0):
dependencies:
ms: 2.1.3
@@ -8770,7 +8774,7 @@ snapshots:
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
- debug: 4.4.1
+ debug: 4.4.1(supports-color@5.5.0)
eslint: 9.31.0(jiti@2.4.2)
get-tsconfig: 4.10.1
is-bun-module: 2.0.0
@@ -10223,23 +10227,6 @@ snapshots:
optionalDependencies:
nodemailer: 7.0.11
- next-auth@4.24.13(next@16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
- dependencies:
- '@babel/runtime': 7.27.6
- '@panva/hkdf': 1.2.1
- cookie: 0.7.2
- jose: 4.15.9
- next: 16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- oauth: 0.9.15
- openid-client: 5.7.1
- preact: 10.28.2
- preact-render-to-string: 5.2.6(preact@10.28.2)
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- uuid: 8.3.2
- optionalDependencies:
- nodemailer: 7.0.11
-
next-remove-imports@1.0.12(webpack@5.99.9):
dependencies:
'@babel/core': 7.27.7
@@ -10275,32 +10262,6 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
- next@16.1.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
- dependencies:
- '@next/env': 16.1.1
- '@swc/helpers': 0.5.15
- baseline-browser-mapping: 2.9.14
- caniuse-lite: 1.0.30001726
- postcss: 8.4.31
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- styled-jsx: 5.1.6(react@19.1.0)
- optionalDependencies:
- '@next/swc-darwin-arm64': 16.1.1
- '@next/swc-darwin-x64': 16.1.1
- '@next/swc-linux-arm64-gnu': 16.1.1
- '@next/swc-linux-arm64-musl': 16.1.1
- '@next/swc-linux-x64-gnu': 16.1.1
- '@next/swc-linux-x64-musl': 16.1.1
- '@next/swc-win32-arm64-msvc': 16.1.1
- '@next/swc-win32-x64-msvc': 16.1.1
- '@opentelemetry/api': 1.9.0
- '@playwright/test': 1.52.0
- sharp: 0.34.5
- transitivePeerDependencies:
- - '@babel/core'
- - babel-plugin-macros
-
node-cron@4.2.1: {}
node-releases@2.0.19: {}
@@ -11238,11 +11199,6 @@ snapshots:
optionalDependencies:
'@babel/core': 7.27.7
- styled-jsx@5.1.6(react@19.1.0):
- dependencies:
- client-only: 0.0.1
- react: 19.1.0
-
stylis@4.2.0: {}
supports-color@5.5.0:
@@ -11463,6 +11419,8 @@ snapshots:
undici-types@6.21.0: {}
+ undici-types@7.16.0: {}
+
undici@6.21.3: {}
unified@11.0.5: