Add validation endpoint for meeting reports and enhance frontend functionality

This commit introduces a new API endpoint in the backend for validating meeting reports, allowing for improved error handling and cookie management. The frontend has been updated to include a validation function that checks the report data before submission, providing users with feedback on validation warnings and errors. These changes enhance the overall user experience by ensuring data integrity and improving interaction with the meeting report feature.
This commit is contained in:
Torsten Schulz (local)
2025-11-12 16:13:04 +01:00
parent da351b40b2
commit e295657621
2 changed files with 127 additions and 2 deletions

View File

@@ -271,4 +271,80 @@ router.put('/submit/:uuid', async (req, res) => {
}
});
// Validate Meeting Report API-Endpunkt (für Zwischenspeicherung)
router.put('/validate/:uuid', async (req, res) => {
const { uuid } = req.params;
const reportData = req.body;
try {
// Hole Cookies für diese UUID (falls vorhanden)
// Versuche zuerst UUID, dann Code als Fallback
let cookies = cookieStore.get(uuid) || {};
// Falls keine Cookies für UUID vorhanden, versuche Code zu finden
if (Object.keys(cookies).length === 0 && reportData.gameCode) {
cookies = cookieStore.get(reportData.gameCode) || {};
}
const url = `https://ttde-apps.liga.nu/nuliga/rs/tt/2022/meetingentry/reports/${uuid}/validate`;
const response = await fetch(url, {
method: 'PUT',
headers: {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:141.0) Gecko/20100101 Firefox/141.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Content-Type': 'application/json',
'Referer': `https://ttde-apps.liga.nu/nuliga/nuscore-tt/meeting/${uuid}/report-clearance/review`,
'Origin': 'https://ttde-apps.liga.nu',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'Connection': 'keep-alive',
...(Object.keys(cookies).length > 0 && { 'Cookie': formatCookies(cookies) })
},
body: JSON.stringify(reportData)
});
const responseText = await response.text();
let responseData;
try {
responseData = JSON.parse(responseText);
} catch (e) {
// Falls keine JSON-Antwort, verwende Text
responseData = { message: responseText };
}
// Speichere neue Cookies falls vorhanden
const newCookies = extractCookies(response.headers.raw()['set-cookie']);
if (Object.keys(newCookies).length > 0) {
cookieStore.set(uuid, { ...cookies, ...newCookies });
if (reportData.gameCode) {
cookieStore.set(reportData.gameCode, { ...cookies, ...newCookies });
}
}
// CORS-Header setzen
res.set({
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
'Cache-Control': 'no-cache, no-store, must-revalidate'
});
// Validiere auch bei Fehlern (für Validierungsfehler)
res.status(response.status).json(responseData);
} catch (error) {
console.error(`❌ Fehler beim Validieren des Spielberichts für UUID ${uuid}:`, error);
res.status(500).json({
error: 'Fehler beim Validieren des Spielberichts',
details: error.message
});
}
});
export default router;