diff --git a/app/events/page.tsx b/app/events/page.tsx index cf47d9f..e853e9b 100644 --- a/app/events/page.tsx +++ b/app/events/page.tsx @@ -1,8 +1,59 @@ +import Link from 'next/link'; +import { getEventsInsecure } from '../../database/events'; + export const metadata = { title: 'Upcoming Events', description: 'Upcoming events around the city', }; -export default function EventsPage() { - return

Upcoming Events

; +function formatDuration(duration: number | null): string { + if (duration === null) { + return 'N/A'; + } + const hours = Math.floor(duration / 60); + const minutes = duration % 60; + return `${hours}h ${minutes}m`; +} + +export default async function EventsPage() { + const events = await getEventsInsecure(); + return ( +
+

These Are Our Currently Available Products

+
+
+ {events.map((event) => { + return ( +
+
+ {event.name} +
+ {event.type} +
+ {event.date.toLocaleDateString()} +
+ {event.location} +
+ {formatDuration(event.duration)} +
+ {event.image} +
+ {event.category} +
+ +
+
+
+
+
+ ); + })} +
+
+
+
+ Back to Home page +
+
+ ); } diff --git a/app/layout.tsx b/app/layout.tsx index 0f8af68..6618bc6 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -43,13 +43,14 @@ export default async function RootLayout({ children }: Props) {
Home Upcoming Events - Post Events +
{user ? ( <> {user.username} + Post Events ) : ( diff --git a/database/events.ts b/database/events.ts index c3d8e54..bdc2016 100644 --- a/database/events.ts +++ b/database/events.ts @@ -1,16 +1,60 @@ -export type Event = { - id: number; - user_id: number; - name: string; - type: string; - date: Date; - location: string; - duration: number | null; - entry_fee: number | null; - category: string; - description: string; - image: string; - organizer_url: string; - age_restriction: boolean | null; - archived: boolean | null; -}; +import { cache } from 'react'; +import { sql } from './connect'; + +export const getEventsInsecure = cache(async () => { + const events = await sql< + { + id: number; + userId: number; + name: string; + type: string; + date: Date; + location: string; + duration: number | null; + entryFee: number | null; + category: string; + description: string; + image: string; + organizerUrl: string; + ageRestriction: boolean | null; + archived: boolean; + }[] + >` + SELECT + * + FROM + events + `; + + return events; +}); + +export const getEventInsecure = cache(async (id: number) => { + const [event] = await sql< + { + id: number; + userId: number; + name: string; + type: string; + date: Date; + location: string; + duration: number | null; + entryFee: number | null; + category: string; + description: string; + image: string; + organizerUrl: string; + ageRestriction: boolean | null; + archived: boolean; + }[] + >` + SELECT + * + FROM + events + WHERE + id = ${id} + `; + + return event; +}); diff --git a/migrations/00002-createTableEvents.ts b/migrations/00002-createTableEvents.ts index a37de0e..758dfb9 100644 --- a/migrations/00002-createTableEvents.ts +++ b/migrations/00002-createTableEvents.ts @@ -1,5 +1,22 @@ import { Sql } from 'postgres'; +export type Event = { + id: number; + userId: number; + name: string; + type: string; + date: Date; + location: string; + duration: null | number; + entryFee: null | number; + category: string; + description: string; + image: string; + organizerUrl: string; + ageRestriction: null | false | true; + archived: boolean; +}; + export async function up(sql: Sql) { await sql` CREATE TABLE events ( diff --git a/migrations/00007-insertEvents.ts b/migrations/00007-insertEvents.ts index fdab3ed..6e3c5b4 100644 --- a/migrations/00007-insertEvents.ts +++ b/migrations/00007-insertEvents.ts @@ -188,7 +188,9 @@ export async function up(sql: Sql) { ${event.user_id}, ${event.name}, ${event.type}, - ${event.date}, + date ( + ${event.date} + ), ${event.location}, ${event.duration}, ${event.entry_fee},