From 11a0bb00e3f945881dbc0703c9e8b5834ea9379f Mon Sep 17 00:00:00 2001 From: Brian Nelson Date: Sun, 29 Jun 2025 11:00:52 -0400 Subject: [PATCH] added event todo list --- app/(auth)/events/page.tsx | 63 +++++----- .../events/[eventId]/todo/[todoId]/route.ts | 49 ++++++++ app/api/events/[eventId]/todo/route.ts | 33 +++++ components/EditGuestBookEntryModal.tsx | 4 + components/EventInfoDisplay.tsx | 52 ++++---- components/ToDoList.tsx | 117 ++++++++++++++++++ lib/helper/fetchTodos.ts | 5 + lib/mutations.ts | 33 +++++ lib/queries.ts | 3 + .../migration.sql | 15 +++ prisma/schema.prisma | 31 +++-- 11 files changed, 342 insertions(+), 63 deletions(-) create mode 100644 app/api/events/[eventId]/todo/[todoId]/route.ts create mode 100644 app/api/events/[eventId]/todo/route.ts create mode 100644 components/ToDoList.tsx create mode 100644 lib/helper/fetchTodos.ts create mode 100644 prisma/migrations/20250629141739_add_event_todo/migration.sql diff --git a/app/(auth)/events/page.tsx b/app/(auth)/events/page.tsx index c257ba4..7de53d5 100644 --- a/app/(auth)/events/page.tsx +++ b/app/(auth)/events/page.tsx @@ -7,37 +7,40 @@ export default async function EventsPage() { console.log(allEvents) return ( -
- Events -
- {allEvents.length == 0 ? ( - <> - You don't have any events yet. Create One! - - ) : ( - - - - - - - - - - {allEvents.map((item) => ( - - - - - - ))} - -
Event NameEvent DateCreated by
{item.name}{item.date?.toDateString()}{item.creatorId}
- )} +
+
+

Your Events

+ + Create Event +
+ + {allEvents.length === 0 ? ( +

+ You don't have any events yet.{' '} + + Create one! + +

+ ) : ( +
+ {allEvents.map(event => ( + +

{event.name}

+

+ {event.date ? new Date(event.date).toLocaleDateString() : 'No date set'} +

+

+ Created by: {event.creator?.username || 'Unknown'} +

+ + ))} +
+ )}
) } diff --git a/app/api/events/[eventId]/todo/[todoId]/route.ts b/app/api/events/[eventId]/todo/[todoId]/route.ts new file mode 100644 index 0000000..2c5c440 --- /dev/null +++ b/app/api/events/[eventId]/todo/[todoId]/route.ts @@ -0,0 +1,49 @@ +// app/api/events/[eventId]/todos/[todoId]/route.ts +import { NextRequest, NextResponse } from 'next/server'; +import { mutations } from '@/lib/mutations'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route'; + +export async function PATCH( + req: NextRequest, + { params }: { params: { todoId: string; eventId: string } } +) { + const session = await getServerSession(authOptions); + if (!session?.user) { + return new NextResponse('Unauthorized', { status: 401 }); + } + + const { name, dueDate, complete } = await req.json(); + + try { + const updated = await mutations.updateEventTodo(params.todoId, { + name, + dueDate, + complete, + }); + + return NextResponse.json(updated); + } catch (error) { + console.error('[UPDATE_TODO]', error); + return new NextResponse('Failed to update todo', { status: 500 }); + } +} + +export async function DELETE( + _req: NextRequest, + { params }: { params: { todoId: string; eventId: string } } +) { + const session = await getServerSession(authOptions); + if (!session?.user) { + return new NextResponse('Unauthorized', { status: 401 }); + } + + try { + await mutations.deleteEventTodo(params.todoId); + return new NextResponse(null, { status: 204 }); + } catch (error) { + console.error('[DELETE_TODO]', error); + return new NextResponse('Failed to delete todo', { status: 500 }); + } +} + diff --git a/app/api/events/[eventId]/todo/route.ts b/app/api/events/[eventId]/todo/route.ts new file mode 100644 index 0000000..81f951a --- /dev/null +++ b/app/api/events/[eventId]/todo/route.ts @@ -0,0 +1,33 @@ +// app/api/events/[eventId]/todos/route.ts +import { NextRequest, NextResponse } from 'next/server'; +import { mutations } from '@/lib/mutations'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route'; + +export async function POST( + req: NextRequest, + { params }: { params: { eventId: string } } +) { + const session = await getServerSession(authOptions); + if (!session?.user) { + return new NextResponse('Unauthorized', { status: 401 }); + } + + const { name, dueDate } = await req.json(); + + if (!name) { + return NextResponse.json({ message: 'Name is required' }, { status: 400 }); + } + + try { + const todo = await mutations.addTodoToEvent({ + eventId: params.eventId, + name, + dueDate, + }); + return NextResponse.json(todo); + } catch (error) { + console.error('[CREATE_TODO]', error); + return new NextResponse('Failed to create todo', { status: 500 }); + } +} diff --git a/components/EditGuestBookEntryModal.tsx b/components/EditGuestBookEntryModal.tsx index 8b8ad94..ac55203 100644 --- a/components/EditGuestBookEntryModal.tsx +++ b/components/EditGuestBookEntryModal.tsx @@ -97,6 +97,7 @@ export default function EditGuestBookEntryModal({ isOpen, onClose, initialData, className="input input-bordered w-full" type="tel" name="phone" + placeholder="phone" value={formData.phone || ''} onChange={handleChange} /> @@ -104,6 +105,7 @@ export default function EditGuestBookEntryModal({ isOpen, onClose, initialData, className="input input-bordered w-full" type="text" name="address" + placeholder="address" value={formData.address || ''} onChange={handleChange} /> @@ -111,12 +113,14 @@ export default function EditGuestBookEntryModal({ isOpen, onClose, initialData, className="input input-bordered w-full" type="text" name="side" + placeholder="Bride/Groom" value={formData.side || ''} onChange={handleChange} />