From c39e5de29fc7d19ba94dd64f617034299248f88a Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 19 Jan 2026 08:28:43 +0100 Subject: [PATCH] Update CSV data fetching to use API endpoint in Mannschaften components This commit modifies the loadMannschaften function across multiple components to fetch CSV data from the new API endpoint '/api/mannschaften' instead of the previous static file path '/data/mannschaften.csv'. This change enhances data retrieval consistency and aligns with the updated data management strategy in the application. --- components/MannschaftenUebersicht.vue | 2 +- components/Navigation.vue | 2 +- pages/cms/mannschaften.vue | 2 +- pages/mannschaften/[slug].vue | 2 +- pages/mannschaften/spielplaene.vue | 2 +- server/api/mannschaften.get.js | 58 +++++++++++++++++++++++++++ 6 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 server/api/mannschaften.get.js diff --git a/components/MannschaftenUebersicht.vue b/components/MannschaftenUebersicht.vue index 9b9f055..c7c716e 100644 --- a/components/MannschaftenUebersicht.vue +++ b/components/MannschaftenUebersicht.vue @@ -125,7 +125,7 @@ async function fetchCsvText(url) { const loadMannschaften = async () => { try { - const csv = await fetchCsvText('/data/mannschaften.csv') + const csv = await fetchCsvText('/api/mannschaften') // Vereinfachter CSV-Parser const lines = csv.split('\n').filter(line => line.trim() !== '') diff --git a/components/Navigation.vue b/components/Navigation.vue index cbbf493..bf4111f 100644 --- a/components/Navigation.vue +++ b/components/Navigation.vue @@ -924,7 +924,7 @@ const toggleMobileSubmenu = (menu) => { const loadMannschaften = async () => { try { const attempt = async () => { - const url = `/data/mannschaften.csv?_t=${Date.now()}` + const url = `/api/mannschaften?_t=${Date.now()}` const response = await fetch(url, { cache: 'no-store' }) if (!response.ok) return null return await response.text() diff --git a/pages/cms/mannschaften.vue b/pages/cms/mannschaften.vue index b22250e..0971692 100644 --- a/pages/cms/mannschaften.vue +++ b/pages/cms/mannschaften.vue @@ -508,7 +508,7 @@ function getPendingSpielerNamesForTeamIndex(teamIndex) { const loadMannschaften = async () => { isLoading.value = true try { - const csv = await fetchCsvText('/data/mannschaften.csv') + const csv = await fetchCsvText('/api/mannschaften') const lines = csv.split('\n').filter(line => line.trim() !== '') if (lines.length < 2) { diff --git a/pages/mannschaften/[slug].vue b/pages/mannschaften/[slug].vue index 7b2c113..41887b5 100644 --- a/pages/mannschaften/[slug].vue +++ b/pages/mannschaften/[slug].vue @@ -158,7 +158,7 @@ async function fetchCsvText(url) { const loadMannschaften = async () => { try { - const csv = await fetchCsvText('/data/mannschaften.csv') + const csv = await fetchCsvText('/api/mannschaften') if (!csv) return const lines = csv.split('\n').filter(line => line.trim() !== '') diff --git a/pages/mannschaften/spielplaene.vue b/pages/mannschaften/spielplaene.vue index 2a9c8b7..0cd9220 100644 --- a/pages/mannschaften/spielplaene.vue +++ b/pages/mannschaften/spielplaene.vue @@ -324,7 +324,7 @@ const loadData = async () => { // Lade Spielplandaten und Mannschaften parallel const [spielplanResponse, mannschaftenResponse] = await Promise.all([ fetch('/api/spielplan'), - fetchCsvText('/data/mannschaften.csv') + fetchCsvText('/api/mannschaften') ]) // Spielplandaten verarbeiten diff --git a/server/api/mannschaften.get.js b/server/api/mannschaften.get.js new file mode 100644 index 0000000..5a307f8 --- /dev/null +++ b/server/api/mannschaften.get.js @@ -0,0 +1,58 @@ +import { promises as fs } from 'fs' +import path from 'path' + +async function exists(p) { + try { + await fs.access(p) + return true + } catch { + return false + } +} + +export default defineEventHandler(async (event) => { + try { + const cwd = process.cwd() + const filename = 'mannschaften.csv' + + const candidates = [ + path.join(cwd, '.output/public/data', filename), + path.join(cwd, 'public/data', filename), + path.join(cwd, '../.output/public/data', filename), + path.join(cwd, '../public/data', filename) + ] + + let csvPath = null + for (const p of candidates) { + // eslint-disable-next-line no-await-in-loop + if (await exists(p)) { + csvPath = p + break + } + } + + if (!csvPath) { + throw createError({ + statusCode: 404, + statusMessage: 'Mannschaften-Datei nicht gefunden' + }) + } + + const csv = await fs.readFile(csvPath, 'utf-8') + + setHeader(event, 'Content-Type', 'text/csv; charset=utf-8') + setHeader(event, 'Cache-Control', 'no-cache, no-store, must-revalidate') + setHeader(event, 'Pragma', 'no-cache') + setHeader(event, 'Expires', '0') + + return csv + } catch (error) { + if (error?.statusCode) throw error + console.error('Fehler beim Laden der Mannschaften:', error) + throw createError({ + statusCode: 500, + statusMessage: 'Fehler beim Laden der Mannschaften' + }) + } +}) +