import { prisma } from '@innungsapp/shared' import { auth, getSanitizedHeaders } from '@/lib/auth' import { headers } from 'next/headers' import { redirect } from 'next/navigation' import { StatsCards } from '@/components/stats/StatsCards' import Link from 'next/link' import { format } from 'date-fns' import { de } from 'date-fns/locale' import { NEWS_KATEGORIE_LABELS, TERMIN_TYP_LABELS } from '@innungsapp/shared' export default async function DashboardPage() { const sanitizedHeaders = await getSanitizedHeaders() const session = await auth.api.getSession({ headers: sanitizedHeaders }) if (!session?.user) redirect('/login') const userRole = await prisma.userRole.findFirst({ where: { userId: session.user.id }, include: { org: true }, }) if (!userRole) redirect('/login') const orgId = userRole.orgId const now = new Date() const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000) const [activeMembers, newsThisWeek, upcomingTermine, activeStellen, recentNews, nextTermine] = await Promise.all([ prisma.member.count({ where: { orgId, status: 'aktiv' } }), prisma.news.count({ where: { orgId, publishedAt: { gte: weekAgo, not: null } } }), prisma.termin.count({ where: { orgId, datum: { gte: now } } }), prisma.stelle.count({ where: { orgId, aktiv: true } }), prisma.news.findMany({ where: { orgId, publishedAt: { not: null } }, orderBy: { publishedAt: 'desc' }, take: 5, include: { author: { select: { name: true } } }, }), prisma.termin.findMany({ where: { orgId, datum: { gte: now } }, orderBy: { datum: 'asc' }, take: 3, }), ]) return (
{userRole.org.name}
{n.title}
{n.publishedAt ? format(n.publishedAt, 'dd. MMM yyyy', { locale: de }) : 'Entwurf'}{' '} · {n.author?.name ?? 'Unbekannt'}
Keine bevorstehenden Termine
)} {nextTermine.map((t: typeof nextTermine[number]) => ({format(t.datum, 'dd', { locale: de })}
{format(t.datum, 'MMM', { locale: de })}
{t.titel}
{t.ort ?? 'Kein Ort angegeben'}