feat: download test cases csv (#219)
This commit is contained in:
@@ -78,12 +78,14 @@ app.use('/folders', foldersEditRoute);
|
||||
app.use('/folders', foldersDeleteRoute);
|
||||
|
||||
// "/cases"
|
||||
const casesDownloadRoute = require('./routes/cases/download')(sequelize);
|
||||
const casesIndexRoute = require('./routes/cases/index')(sequelize);
|
||||
const casesIndexByProjectIdRoute = require('./routes/cases/indexByProjectId')(sequelize);
|
||||
const casesShowRoute = require('./routes/cases/show')(sequelize);
|
||||
const casesNewRoute = require('./routes/cases/new')(sequelize);
|
||||
const casesEditRoute = require('./routes/cases/edit')(sequelize);
|
||||
const casesDeleteRoute = require('./routes/cases/delete')(sequelize);
|
||||
app.use('/cases', casesDownloadRoute);
|
||||
app.use('/cases', casesIndexRoute);
|
||||
app.use('/cases', casesIndexByProjectIdRoute);
|
||||
app.use('/cases', casesShowRoute);
|
||||
|
||||
11
backend/package-lock.json
generated
11
backend/package-lock.json
generated
@@ -15,6 +15,7 @@
|
||||
"express-rate-limit": "^7.4.1",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"papaparse": "^5.5.2",
|
||||
"sequelize": "^6.37.5",
|
||||
"sequelize-cli": "^6.6.2",
|
||||
"sqlite3": "^5.1.7"
|
||||
@@ -2358,6 +2359,11 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/papaparse": {
|
||||
"version": "5.5.2",
|
||||
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.2.tgz",
|
||||
"integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA=="
|
||||
},
|
||||
"node_modules/parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
@@ -5265,6 +5271,11 @@
|
||||
"aggregate-error": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"papaparse": {
|
||||
"version": "5.5.2",
|
||||
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.2.tgz",
|
||||
"integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA=="
|
||||
},
|
||||
"parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"express-rate-limit": "^7.4.1",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"papaparse": "^5.5.2",
|
||||
"sequelize": "^6.37.5",
|
||||
"sequelize-cli": "^6.6.2",
|
||||
"sqlite3": "^5.1.7"
|
||||
|
||||
48
backend/routes/cases/download.js
Normal file
48
backend/routes/cases/download.js
Normal file
@@ -0,0 +1,48 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { DataTypes } = require('sequelize');
|
||||
const Papa = require('papaparse');
|
||||
const defineCase = require('../../models/cases');
|
||||
|
||||
module.exports = function (sequelize) {
|
||||
const Case = defineCase(sequelize, DataTypes);
|
||||
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
|
||||
const { verifyProjectVisibleFromFolderId } = require('../../middleware/verifyVisible')(sequelize);
|
||||
|
||||
router.get('/download', verifySignedIn, verifyProjectVisibleFromFolderId, async (req, res) => {
|
||||
const { folderId, type } = req.query;
|
||||
|
||||
if (!folderId) {
|
||||
return res.status(400).json({ error: 'folderId is required' });
|
||||
}
|
||||
|
||||
if (!type) {
|
||||
return res.status(400).json({ error: 'download type is required' });
|
||||
}
|
||||
|
||||
try {
|
||||
const cases = await Case.findAll({
|
||||
where: { folderId },
|
||||
raw: true,
|
||||
});
|
||||
|
||||
if (cases.length === 0) {
|
||||
return res.status(404).send('No cases found');
|
||||
}
|
||||
|
||||
const csv = Papa.unparse(cases, {
|
||||
quotes: true,
|
||||
skipEmptyLines: true,
|
||||
});
|
||||
|
||||
res.setHeader('Content-Type', 'text/csv; charset=utf-8');
|
||||
res.setHeader('Content-Disposition', `attachment; filename=cases_folder_${folderId}.csv`);
|
||||
res.send(csv);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).send('Internal Server Error');
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
Reference in New Issue
Block a user