api/routes/ranking.js
const Router = require('express-promise-router');
const router = Router();
const Stages = require('../models/stage');
const Submissions = require('../models/submission');
const sequelize = require('../models');
router.get('/', async (req, res) => {
const since = new Date(req.query.since || 0);
if (Number.isNaN(since.getTime())) {
res.status(400).send('since parameter is invalid');
return;
}
const limit = req.query.limit ? parseInt(req.query.limit) : 20;
const submissions = await Submissions.findAll({
attributes: [
'name',
[sequelize.fn('sum', sequelize.col('score')), 'totalScore'],
],
include: [{
model: Stages,
attributes: [],
where: {
migratedVersion: {
$col: 'submissions.version',
},
},
}],
group: ['submissions.name'],
order: [
[sequelize.fn('sum', sequelize.col('score')), 'DESC'],
],
where: {
updatedAt: {
$gte: since,
},
},
limit,
raw: true,
});
res.json(submissions.map((submission) => ({
name: submission.name,
score: submission.totalScore,
})));
});
module.exports = router;