// /utils/events.ts
export const getAllEvents = memoize(
async (userId: string) => {
await delay()
return db.query.events.findMany({
where: eq(events.createdById, userId),
orderBy: [asc(events.startOn)],
})
},
{
persist: true,
revalidateTags: () => ['events'],
suppressWarnings: true,
logid: 'events',
}
)
export const getOneEvent = memoize(
async (userId: string, eventId: string) => {
await delay()
return db.query.events.findFirst({
where: and(eq(events.createdById, userId), eq(events.id, eventId)),
})
},
{
persist: true,
revalidateTags: (userId, eventId) => ['event', eventId],
suppressWarnings: true,
logid: 'event',
}
)
// /app/dashboard/events/page.tsx
import { getAllEvents } from '@/utils/events'
import { getCurrentUser } from '@/utils/users'
import Link from 'next/link'
const Events = async () => {
const user = await getCurrentUser()
const events = await getAllEvents(user.id)
return (
<div>
{events.map((event) => (
<div key={event.id}>
<Link href={`/dashboard/events/${event.id}`}>{event.name}</Link>
</div>
))}
</div>
)
}
export default Events
// /app/dashboard/events/[id]/page.tsx
import { getOneEvent } from '@/utils/events'
import { getCurrentUser } from '@/utils/users'
import { redirect } from 'next/navigation'
const EventPage = async ({ params }) => {
const user = await getCurrentUser()
const event = await getOneEvent(user.id, params.id)
if (!event) redirect('/dashboard/events')
return <div>{event.name}</div>
}
export default EventPage
// /utils/attendees.ts
export const getGuestList = memoize(
async (userId: string) => {
await delay()
const uniqueAttendees = await db
.selectDistinct({
id: attendees.id,
name: attendees.name,
email: attendees.email,
})
.from(events)
.leftJoin(rsvps, eq(rsvps.eventId, events.id))
.leftJoin(attendees, eq(attendees.id, rsvps.attendeeId))
.where(eq(events.createdById, userId))
.execute()
return uniqueAttendees
},
{
persist: true,
revalidateTags: () => ['guests'],
suppressWarnings: true,
log: ['datacache', 'verbose'],
logid: 'guests',
}
)
// /app/dashboard/guests/page.tsx
import { getGuestList } from '@/utils/attendees'
import { getCurrentUser } from '@/utils/users'
const GuestsPage = async () => {
const user = await getCurrentUser()
const guests = await getGuestList(user.id)
return (
<div>
{guests.map((guest) => (
<div key={guest.id}>{guest.name}</div>
))}
</div>
)
}
export default GuestsPage