77 lines
No EOL
3.1 KiB
TypeScript
77 lines
No EOL
3.1 KiB
TypeScript
import express from 'express';
|
|
import {query, validationResult} from 'express-validator';
|
|
import {TimeLeaderboardRepository} from "./repositories/TimeLeaderboardRepository.js";
|
|
import {TimeLeaderboardPgPromiseRepository} from "./repositories/pgPromise/TimeLeaderboardPgPromiseRepository.js";
|
|
import {HighscoreLeaderboardPgPromiseRepository} from "./repositories/pgPromise/HighscoreLeaderboardPgPromiseRepository.js";
|
|
import {HighscoreLeaderboardRepository} from "./repositories/HighscoreLeaderboardRepository.js";
|
|
import {HighscoreLeaderboard, TimeLeaderboard} from "./model/Leaderboard.js";
|
|
|
|
export const leaderboardRoute = express.Router()
|
|
|
|
leaderboardRoute.get('/highscore',
|
|
query('pagination').toBoolean(),
|
|
query('entriesPerPage').optional().isInt({min: 1}).toInt(),
|
|
query('page').optional().isInt({min: 0}).toInt(),
|
|
/**
|
|
* Returns the highscore leaderboard as JSON response, fetched from DB
|
|
* @param req
|
|
* @param res json: HighscoreLeaderboard
|
|
*/
|
|
async (req, res) => {
|
|
try {
|
|
//region validate parameters
|
|
const errors = validationResult(req);
|
|
if (!errors.isEmpty()) {
|
|
return res.status(400).json({ errors: errors.array() });
|
|
}
|
|
//endregion
|
|
const highscoreLeaderboardRepo: HighscoreLeaderboardRepository = new HighscoreLeaderboardPgPromiseRepository;
|
|
let highscoreLeaderboard: HighscoreLeaderboard;
|
|
if (req.query.pagination) {
|
|
const entriesPerPage = req.query.entriesPerPage;
|
|
const page = req.query.page;
|
|
highscoreLeaderboard = await highscoreLeaderboardRepo.getPage(entriesPerPage, page);
|
|
} else {
|
|
highscoreLeaderboard = await highscoreLeaderboardRepo.getAll();
|
|
}
|
|
res.send(highscoreLeaderboard);
|
|
} catch (error) {
|
|
// handle errors
|
|
console.log(error)
|
|
res.status(500).json({ errors: [{msg: "Internal server error"}]})
|
|
}
|
|
})
|
|
|
|
leaderboardRoute.get('/totalplaytime',
|
|
query('pagination').toBoolean(),
|
|
query('entriesPerPage').optional().isInt({min: 1}).toInt(),
|
|
query('page').optional().isInt({min: 0}).toInt(),
|
|
/**
|
|
* Returns the total playtime leaderboard as JSON response, fetched from DB
|
|
* @param req
|
|
* @param res json: TimeLeaderboard
|
|
*/
|
|
async (req, res) => {
|
|
try {
|
|
//region validate parameters
|
|
const errors = validationResult(req);
|
|
if (!errors.isEmpty()) {
|
|
return res.status(400).json({ errors: errors.array() });
|
|
}
|
|
//endregion
|
|
const timeLeaderboardRepo: TimeLeaderboardRepository = new TimeLeaderboardPgPromiseRepository;
|
|
let timeLeaderboard: TimeLeaderboard;
|
|
if (req.query.pagination) {
|
|
const entriesPerPage = req.query.entriesPerPage;
|
|
const page = req.query.page;
|
|
timeLeaderboard = await timeLeaderboardRepo.getPage(entriesPerPage, page);
|
|
} else {
|
|
timeLeaderboard = await timeLeaderboardRepo.getAll();
|
|
}
|
|
res.send(timeLeaderboard);
|
|
} catch (error) {
|
|
// handle errors
|
|
console.log(error)
|
|
res.status(500).json({ errors: [{msg: "Internal server error"}]})
|
|
}
|
|
}) |