/**
* @module leaderboard-route-controller
* @desc The leaderboard-api leaderboard controller module.
* @version 1.0.0
* @author Essam A. El-Sherif
*/
/* Import local dependencies */
import { LeaderBoard } from './model.js';
/**
* @func
* @async
* @static
* @param {object} req - The request object.
* @param {object} res - The response object.
* @return {Promise}
* @desc Router-level middleware function for the endpoint /leaderboard/:activity.
* @requires module:redis-leaderboard.LeaderBoard.getActivity
*/
export async function getActAllMiddleware(req, res){
res.setHeader('Server', req.app.get('serverName'));
const redisKeyA = req.app.get('redisKeyActivity');
const redisKeyT = req.app.get('redisKeyTimestamp');
const leaderboardObj = new LeaderBoard(req.app.get('clientRd'), redisKeyT, redisKeyA);
try{
let activities = await leaderboardObj.getActivity(req.params.activity);
res.status(200).send(activities);
}
catch(err){
res.status(401).send(`Retrieval Error: ${err.message}`);
}
}
/**
* @func
* @async
* @static
* @param {object} req - The request object.
* @param {object} res - The response object.
* @return {Promise}
* @desc Router-level middleware function for the endpoint /leaderboard/:activity/top[/:count].
* @requires module:redis-leaderboard.LeaderBoard.getActivityTopUsers
*/
export async function getActTopMiddleware(req, res){
res.setHeader('Server', req.app.get('serverName'));
let topCount = 5;
if('count' in req.params){
if(!(/^\d+$/.test(req.params.count) && Number(req.params.count))){
res.status(400).send(`Retrieval Error: invalid top count`);
return;
}
topCount = parseInt(req.params.count, 10);
}
const redisKeyA = req.app.get('redisKeyActivity');
const redisKeyT = req.app.get('redisKeyTimestamp');
const leaderboardObj = new LeaderBoard(req.app.get('clientRd'), redisKeyT, redisKeyA);
try{
let activities = await leaderboardObj.getActivityTopUsers(req.params.activity, topCount);
res.status(200).send(activities);
}
catch(err){
res.status(401).send(`Retrieval Error: ${err.message}`);
}
}
/**
* @func
* @async
* @static
* @param {object} req - The request object.
* @param {object} res - The response object.
* @return {Promise}
* @desc Router-level middleware function for the endpoint /leaderboard/:activity/user/:username.
* @requires module:redis-leaderboard.LeaderBoard.getUserScoreAndRank
*/
export async function getActUsrMiddleware(req, res){
res.setHeader('Server', req.app.get('serverName'));
const redisKeyA = req.app.get('redisKeyActivity');
const redisKeyT = req.app.get('redisKeyTimestamp');
const leaderboardObj = new LeaderBoard(req.app.get('clientRd'), redisKeyT, redisKeyA);
try{
let activities = await leaderboardObj.getUserScoreAndRank(req.params.activity, req.params.username);
res.status(200).send(activities);
}
catch(err){
res.status(401).send(`Retrieval Error: ${err.message}`);
}
}
/**
* @func
* @async
* @static
* @param {object} req - The request object.
* @param {object} res - The response object.
* @return {Promise}
* @desc Router-level middleware function for the endpoint /leaderboard/global.
* @requires module:redis-leaderboard.LeaderBoard.getActivities
*/
export async function getAllMiddleware(req, res){
res.setHeader('Server', req.app.get('serverName'));
const redisKeyA = req.app.get('redisKeyActivity');
const redisKeyT = req.app.get('redisKeyTimestamp');
const leaderboardObj = new LeaderBoard(req.app.get('clientRd'), redisKeyT, redisKeyA);
try{
let activities = await leaderboardObj.getActivities();
res.status(200).send(activities);
}
catch(err){
res.status(401).send(`Retrieval Error: ${err.message}`);
}
}
/**
* @func
* @async
* @static
* @param {object} req - The request object.
* @param {object} res - The response object.
* @return {Promise}
* @desc Router-level middleware function for the endpoint /leaderboard/global/top[/:count].
* @requires module:redis-leaderboard.LeaderBoard.getActivities
*/
export async function getTopMiddleware(req, res){
res.setHeader('Server', req.app.get('serverName'));
let topCount = 5;
if('count' in req.params){
if(!(/^\d+$/.test(req.params.count) && Number(req.params.count))){
res.status(400).send(`Retrieval Error: invalid top count`);
return;
}
topCount = parseInt(req.params.count, 10);
}
const redisKeyA = req.app.get('redisKeyActivity');
const redisKeyT = req.app.get('redisKeyTimestamp');
const leaderboardObj = new LeaderBoard(req.app.get('clientRd'), redisKeyT, redisKeyA);
try{
let activities = (await leaderboardObj.getActivities()).slice(0, topCount);
res.status(200).send(activities);
}
catch(err){
res.status(401).send(`Retrieval Error: ${err.message}`);
}
}
/**
* @func
* @async
* @static
* @param {object} req - The request object.
* @param {object} res - The response object.
* @return {Promise}
* @desc Router-level middleware function for the endpoint /leaderboard/global/user/:username.
* @requires module:redis-leaderboard.LeaderBoard.getUserActivities
*/
export async function getUsrMiddleware(req, res){
res.setHeader('Server', req.app.get('serverName'));
if(!('username' in req.params)){
res.status(400).send(`Retrieval Error: no username given`);
return;
}
const redisKeyA = req.app.get('redisKeyActivity');
const redisKeyT = req.app.get('redisKeyTimestamp');
const leaderboardObj = new LeaderBoard(req.app.get('clientRd'), redisKeyT, redisKeyA);
try{
let activities = await leaderboardObj.getUserActivities(req.params.username);
res.status(200).send(activities);
}
catch(err){
res.status(401).send(`Retrieval Error: ${err.message}`);
}
}