Änderungen: - Umbenennung des API-Endpunkts für Highscores von `/api/taxi/highscore` zu `/api/taxi/highscores`. - Anpassung der Highscore-Datenstruktur zur Verwendung von `hashedUserId` anstelle von `userId`. - Erweiterung der Router-Logik zur besseren Organisation der Highscore-Abfragen. - Implementierung einer neuen Highscore-Anzeige im Spiel, die die Top 20 Spieler und den aktuellen Spieler anzeigt. Diese Anpassungen verbessern die API-Konsistenz und erweitern die Benutzeroberfläche für die Highscore-Anzeige im Spiel.
196 lines
5.1 KiB
JavaScript
196 lines
5.1 KiB
JavaScript
import taxiHighscoreService from '../services/taxiHighscoreService.js';
|
|
|
|
class TaxiHighscoreController {
|
|
/**
|
|
* Erstellt oder aktualisiert einen Highscore-Eintrag
|
|
*/
|
|
async createHighscore(req, res) {
|
|
try {
|
|
const { userId, nickname, passengersDelivered, playtime, points, mapId, mapName } = req.body;
|
|
|
|
// Validierung der erforderlichen Felder
|
|
if (!userId || !nickname || passengersDelivered === undefined || playtime === undefined || points === undefined || !mapId || !mapName) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: 'Alle Felder sind erforderlich: userId, nickname, passengersDelivered, playtime, points, mapId, mapName'
|
|
});
|
|
}
|
|
|
|
const highscoreData = {
|
|
hashedUserId: userId, // userId ist bereits ein String (Hash)
|
|
nickname,
|
|
passengersDelivered: parseInt(passengersDelivered),
|
|
playtime: parseInt(playtime),
|
|
points: parseInt(points),
|
|
mapId: parseInt(mapId),
|
|
mapName
|
|
};
|
|
|
|
const highscore = await taxiHighscoreService.createHighscore(highscoreData);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: highscore,
|
|
message: 'Highscore erfolgreich gespeichert'
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Erstellen des Highscores:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Fehler beim Speichern des Highscores',
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Holt die Top-Highscores
|
|
*/
|
|
async getTopHighscores(req, res) {
|
|
try {
|
|
const { mapId, limit = 10, orderBy = 'points' } = req.query;
|
|
|
|
const highscores = await taxiHighscoreService.getTopHighscores(
|
|
mapId ? parseInt(mapId) : null,
|
|
parseInt(limit),
|
|
orderBy
|
|
);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: highscores
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Laden der Top-Highscores:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Fehler beim Laden der Highscores',
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Holt die persönlichen Bestleistungen eines Users
|
|
*/
|
|
async getUserBestScores(req, res) {
|
|
try {
|
|
const { userId, mapId } = req.query;
|
|
|
|
if (!userId) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: 'userId ist erforderlich'
|
|
});
|
|
}
|
|
|
|
const bestScores = await taxiHighscoreService.getUserBestScores(
|
|
userId, // userId ist bereits ein String (Hash)
|
|
mapId ? parseInt(mapId) : null
|
|
);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: bestScores
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Laden der User-Bestleistungen:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Fehler beim Laden der Bestleistungen',
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Holt alle Highscores eines Users
|
|
*/
|
|
async getUserHighscores(req, res) {
|
|
try {
|
|
const { userId, limit = 20 } = req.query;
|
|
|
|
if (!userId) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: 'userId ist erforderlich'
|
|
});
|
|
}
|
|
|
|
const highscores = await taxiHighscoreService.getUserHighscores(
|
|
userId, // userId ist bereits ein String (Hash)
|
|
parseInt(limit)
|
|
);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: highscores
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Laden der User-Highscores:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Fehler beim Laden der User-Highscores',
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Holt die Rangliste-Position eines Users
|
|
*/
|
|
async getUserRank(req, res) {
|
|
try {
|
|
const { userId, mapId, orderBy = 'points' } = req.query;
|
|
|
|
if (!userId) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: 'userId ist erforderlich'
|
|
});
|
|
}
|
|
|
|
const rank = await taxiHighscoreService.getUserRank(
|
|
userId, // userId ist bereits ein String (Hash)
|
|
mapId ? parseInt(mapId) : null,
|
|
orderBy
|
|
);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: { rank }
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Berechnen der User-Rangliste:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Fehler beim Berechnen der Rangliste',
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Holt Statistiken über die Highscores
|
|
*/
|
|
async getHighscoreStats(req, res) {
|
|
try {
|
|
const stats = await taxiHighscoreService.getHighscoreStats();
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: stats
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Laden der Highscore-Statistiken:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Fehler beim Laden der Statistiken',
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
export default new TaxiHighscoreController();
|