diff --git a/routes/report.js b/routes/report.js index 8d040dc..07027ec 100644 --- a/routes/report.js +++ b/routes/report.js @@ -2,7 +2,11 @@ const express = require('express'); const router = express.Router(); +const { stringify } = require('csv-stringify'); +const Class = require('../lib/Class'); +const Student = require('../lib/Student'); +const Test = require('../lib/Test'); const User = require('../lib/User'); const validator = require('../lib/validator'); @@ -96,9 +100,94 @@ router.post('/report/generate', async (req, res) => { return res.status(400).json({ status: 'Invalid' }); } - fields.get('type'); + let data; + let filename; - return res.redirect('/admin/reports'); + switch (fields.get('type')) { + case 'student': { + const s = await new Student( + req.db, + fields.get('target')); + const trs = await s.getTestResults(); + + data = trs.map(tr => + ({ + 'Test Name': tr.test.template.name, + 'Class': tr.test.class.name, + 'Test Date': tr.test + .getDateString(false), + 'Max Mark': tr.test.template.maxMark, + 'Mark': tr.mark, + 'Percentage': `${tr.percentage}%`, + 'Grade': tr.grade + }) + ); + + filename = s.shortName; + + break; + } + case 'class': { + const c = await new Class(req.db, fields.get('target')); + const ts = await c.getTests({ range: 'before' }); + + data = await Promise.all(ts.map(async t => { + const [ + trs, + avgPer, + avgScore + ] = await Promise.all([ + t.getTestResults(), + t.getAveragePercentage(), + t.getAverageScore() + ]); + + return { + 'Test Name': t.template.name, + 'Test Date': t.getDateString(false), + 'Max Mark': t.template.maxMark, + 'Results Submitted': `${trs.length}/` + + t.class.studentIds.length + + '\t', + 'Average score': avgScore, + 'Average percentage': `${avgPer}%` + }; + })); + + filename = c.name; + + break; + } + case 'test': { + const t = await new Test(req.db, fields.get('target')); + const trs = await t.getTestResults(); + + data = trs.map(tr => + ({ + 'Student': tr.student.fullName, + 'Test Date': tr.test + .getDateString(false), + 'Max Mark': tr.test.template.maxMark, + 'Mark': tr.mark, + 'Percentage': `${tr.percentage}%`, + 'Grade': tr.grade + }) + ); + + filename = `${t.class.name}-${t.template.name}`; + + break; + } + } + + res.setHeader('Content-Type', 'text/csv'); + res.setHeader('Content-Disposition', + `attachment; filename="stratos-report-${filename}.csv"`); + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Pragma', 'no-cache'); + + stringify(data, { header: true }) + .pipe(res); }); module.exports = {