diff --git a/src/data/database.js b/src/data/database.js index fdb50999..c42e50a4 100644 --- a/src/data/database.js +++ b/src/data/database.js @@ -415,6 +415,32 @@ async function readUserSubmission(user_id, page, size, count) { }); } +/** + * Read Submission's source + * @param {String} sub_id Submission's ID + */ +function readSubmissionSrc(sub_id) { + return new Promise((resolve, reject) => { + db.submissions.findOne( + { _id: sub_id }, + { ext: 1, user_id: 1, source_code: 1 }, + (err, docs) => { + if (err) reject(err); + else if (docs === null) + reject(new Error(`Invalid Submission's ID: ${sub_id}`)); + else + readUserByID(docs.user_id) + .then((res) => { + docs.username = res.username; + }) + .finally(() => { + resolve(docs); + }); + } + ); + }); +} + /** * Add submission to database * @param {String} source_code Source Code @@ -579,6 +605,7 @@ module.exports = { readAllSubmissions, readSubmission, readUserSubmission, + readSubmissionSrc, newSubmission, updateSubmission, readLastSatisfy, diff --git a/src/routes/subs.js b/src/routes/subs.js index e9435892..6efcb5c1 100644 --- a/src/routes/subs.js +++ b/src/routes/subs.js @@ -1,12 +1,14 @@ "use strict"; const express = require("express"); +const { existsSync } = require("fs"); const { sendCode } = require("../controller/submitCode"); const { readSubmission, readAllSubmissions, - readUserSubmission + readUserSubmission, + readSubmissionSrc } = require("../data/database"); const auth = require("../middleware/auth"); const bruteForce = require("../middleware/bruteForce"); @@ -66,4 +68,21 @@ router.get("/:id", (req, res) => { ); }); +router.get("/:id/source", (req, res) => { + readSubmissionSrc(req.params.id) + .then((docs) => { + if (docs.user_id === req.user._id || req.user.isAdmin) { + if (!existsSync(docs.source_code)) res.sendStatus(404); + else + res.download( + docs.source_code, + "".concat(docs._id, docs.ext.toLowerCase()) + ); + } else res.sendStatus(401); + }) + .catch((err) => { + res.status(400).json(err.message); + }); +}); + module.exports = router; diff --git a/src/util/config/contestConfig.js b/src/util/config/contestConfig.js index 7aa425d4..b66301ff 100644 --- a/src/util/config/contestConfig.js +++ b/src/util/config/contestConfig.js @@ -23,7 +23,7 @@ function parseContainer(container) { if (!Array.isArray(container)) throw new Error("Invalid Container"); let parsedContainer = container .filter((x) => typeof x === "string") - .map((x) => x.trim().toUpperCase()) + .map((x) => x.replace(/\s/g, "").toUpperCase()) .sort((a, b) => a.localeCompare(b)); return [...new Set(parsedContainer)]; }