Files
singlechat/server/routes.js

161 lines
5.9 KiB
JavaScript

import { readFileSync } from 'fs';
import { join } from 'path';
import { parse } from 'csv-parse/sync';
import axios from 'axios';
import { getSessionStatus, getClientsMap, getSessionIdForSocket } from './broadcast.js';
export function setupRoutes(app, __dirname) {
// Health-Check-Endpoint
app.get('/api/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
// Session-Status-Endpoint
app.get('/api/session', (req, res) => {
try {
const sessionId = req.sessionID;
console.log('Session-Check - SessionID:', sessionId);
console.log('Session-Check - Alle Clients:', Array.from(getClientsMap().keys()));
// Prüfe zuerst in der clients Map
const clientsMap = getClientsMap();
let client = clientsMap.get(sessionId);
// Wenn kein Client mit dieser Session-ID gefunden wurde, aber es gibt Clients,
// die bereits eingeloggt sind, könnte es sein, dass die Session-ID beim Reload geändert wurde.
// In diesem Fall sollten wir den Client mit der Express-Session-ID verknüpfen.
// Aber wir können nicht sicher sein, welcher Client zu welcher Session gehört,
// daher geben wir einfach die Session-ID zurück und lassen den Client beim setSessionId
// den richtigen Client finden.
if (client && client.userName) {
console.log('Session-Check - Client gefunden:', client.userName);
res.json({
loggedIn: true,
sessionId: sessionId, // Wichtig: Sende Session-ID zurück
user: {
sessionId: client.sessionId,
userName: client.userName,
gender: client.gender,
age: client.age,
country: client.country,
isoCountryCode: client.isoCountryCode
}
});
} else {
console.log('Session-Check - Kein Client gefunden für SessionID:', sessionId);
// Prüfe auch alle Clients, um zu sehen, ob es ein Mismatch gibt
for (const [sid, c] of clientsMap.entries()) {
if (c.userName) {
console.log('Session-Check - Gefundener Client:', sid, c.userName);
}
}
// Sende Session-ID zurück, auch wenn nicht eingeloggt (für Login)
res.json({ loggedIn: false, sessionId: sessionId });
}
} catch (error) {
console.error('Fehler beim Prüfen der Session:', error);
res.json({ loggedIn: false });
}
});
// Länderliste-Endpoint
app.get('/api/countries', async (req, res) => {
try {
// Versuche zuerst, die CSV-Datei zu laden
const csvPath = join(__dirname, '../docroot/countries.csv');
let countries = {};
try {
const fileContent = readFileSync(csvPath, 'utf-8');
const records = parse(fileContent, {
columns: true,
skip_empty_lines: true,
quote: '"',
trim: true,
relax_quotes: true,
relax_column_count: true
});
records.forEach(record => {
if (record.Name && record.Code) {
// Entferne alle Anführungszeichen (auch am Anfang/Ende)
const name = record.Name.replace(/^["']+|["']+$/g, '').replace(/["']/g, '').trim();
const code = record.Code.replace(/^["']+|["']+$/g, '').replace(/["']/g, '').trim();
if (name && code) {
countries[name] = code.toLowerCase();
}
}
});
} catch (fileError) {
// Wenn die Datei nicht existiert, lade von der URL
console.log('CSV-Datei nicht gefunden, lade von URL...');
const response = await axios.get('https://pkgstore.datahub.io/core/country-list/data_csv/data/d7c9d7cfb42cb69f4422dec222dbbaa8/data_csv.csv');
const lines = response.data.split('\n');
for (let i = 1; i < lines.length; i++) {
const line = lines[i].trim();
if (!line) continue;
// Parse CSV-Zeile mit Berücksichtigung von Anführungszeichen
const parseCSVLine = (line) => {
const result = [];
let current = '';
let inQuotes = false;
for (let i = 0; i < line.length; i++) {
const char = line[i];
if (char === '"') {
// Ignoriere Anführungszeichen, sie werden nicht zum Wert hinzugefügt
inQuotes = !inQuotes;
} else if (char === ',' && !inQuotes) {
result.push(current.trim());
current = '';
} else {
current += char;
}
}
result.push(current.trim());
return result;
};
const [name, code] = parseCSVLine(line);
if (name && code) {
// Entferne alle Anführungszeichen (auch am Anfang/Ende)
const cleanName = name.replace(/^["']+|["']+$/g, '').replace(/["']/g, '').trim();
const cleanCode = code.replace(/^["']+|["']+$/g, '').replace(/["']/g, '').trim();
if (cleanName && cleanCode) {
countries[cleanName] = cleanCode.toLowerCase();
}
}
}
}
res.json(countries);
} catch (error) {
console.error('Fehler beim Laden der Länderliste:', error);
res.status(500).json({ error: 'Fehler beim Laden der Länderliste' });
}
});
// Partners-Links
app.get('/api/partners', (req, res) => {
try {
const csvPath = join(__dirname, '../docroot/links.csv');
const fileContent = readFileSync(csvPath, 'utf-8');
const records = parse(fileContent, {
columns: true,
skip_empty_lines: true,
quote: '"'
});
res.json(records);
} catch (error) {
console.error('Fehler beim Laden der Partner-Links:', error);
res.status(500).json({ error: 'Fehler beim Laden der Partner-Links' });
}
});
}