Files
logbuch/app/api/statistik/route.ts
T

71 lines
2.5 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { query } from '@/lib/db';
import { getSession } from '@/lib/session';
export async function GET(request: NextRequest) {
const session = await getSession();
if (!session) return NextResponse.json({ error: 'Nicht angemeldet' }, { status: 401 });
const { searchParams } = new URL(request.url);
const kuppel = searchParams.get('kuppel') || 'West';
const year = parseInt(searchParams.get('year') || String(new Date().getFullYear()), 10);
try {
// 1) Monatliche Besucherzahlen nach ArtFuehrung
const monthlyRows = await query(
`SELECT
MONTH(Beginn) AS monat,
ArtFuehrung,
SUM(Besucher) AS besucher,
COUNT(*) AS anzahl
FROM logbuch
WHERE Kuppel = ? AND YEAR(Beginn) = ?
GROUP BY MONTH(Beginn), ArtFuehrung
ORDER BY monat, ArtFuehrung`,
[kuppel, year]
) as { monat: number; ArtFuehrung: string; besucher: number; anzahl: number }[];
// 2) Kumulierte Besucher im Jahr
const cumulativeRows = await query(
`SELECT SUM(Besucher) AS total FROM logbuch WHERE Kuppel = ? AND YEAR(Beginn) = ?`,
[kuppel, year]
) as { total: number | null }[];
// 3) Anzahl Führungstage (distinct Datum)
const tageRows = await query(
`SELECT COUNT(DISTINCT DATE(Beginn)) AS tage FROM logbuch WHERE Kuppel = ? AND YEAR(Beginn) = ?`,
[kuppel, year]
) as { tage: number }[];
// 4) Kumulierte Besucher über alle Kuppeln
const allCumulativeRows = await query(
`SELECT SUM(Besucher) AS total FROM logbuch WHERE YEAR(Beginn) = ?`,
[year]
) as { total: number | null }[];
// 5) Führungstage über alle Kuppeln
const allTageRows = await query(
`SELECT COUNT(DISTINCT DATE(Beginn)) AS tage FROM logbuch WHERE YEAR(Beginn) = ?`,
[year]
) as { tage: number }[];
return NextResponse.json({
monthly: monthlyRows.map((r) => ({
monat: Number(r.monat),
ArtFuehrung: r.ArtFuehrung,
besucher: Number(r.besucher),
anzahl: Number(r.anzahl),
})),
cumulative: Number(cumulativeRows[0]?.total ?? 0),
tage: Number(tageRows[0]?.tage ?? 0),
allCumulative: Number(allCumulativeRows[0]?.total ?? 0),
allTage: Number(allTageRows[0]?.tage ?? 0),
year,
kuppel,
});
} catch (error) {
console.error('GET /api/statistik:', error);
return NextResponse.json({ error: 'Datenbankfehler' }, { status: 500 });
}
}