From cca37704b1eb6a207ce8be904e49c0e8051fc583 Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Sun, 26 Jun 2022 17:10:40 +0200 Subject: [PATCH] Created the /release route --- routes/release.js | 85 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 routes/release.js diff --git a/routes/release.js b/routes/release.js new file mode 100644 index 0000000..73c9e9c --- /dev/null +++ b/routes/release.js @@ -0,0 +1,85 @@ +const app = require('express').Router(); +const semver = require('semver'); +const fs = require('fs'); +const fileUpload = require('express-fileupload'); +const {isAuthenticatedUser} = require('../middlewares/authenticate'); +const {getAddonById} = require('../controller/addon'); +const {validateSchema} = require('../util/validate'); +const {addRelease} = require('../validations/release'); +const { + createRelease, + getLatestReleaseByAddonId, + getReleaseById, isValidReleaseFile, getReleasesByAddonId, getReleaseByAddonId +} = require('../controller/release'); + +// Sets the file size limit +const releaseUpload = fileUpload({limits: {fileSize: 20000000}, abortOnLimit: true}); + +// Gets all releases from an addon by id +app.get("/:addonId/list", async (req, res) => { + const releases = await getReleasesByAddonId(req.params.addonId); + if (!releases) return res.status(404).json({message: "The provided addon could not be found"}); + + res.json(releases); +}); + +// Creates a new release of an addon +app.put("/:addonId", isAuthenticatedUser, async (req, res) => { + const validation = await validateSchema(addRelease, req.body); + if (validation) return res.status(400).json({message: validation}); + + const addon = await getAddonById(req.params.addonId); + if (addon === null) return res.status(404).json({message: "The provided addon does not exist"}); + + if (!req.user._id.equals(addon.user_id)) return res.status(404).json({message: "The provided addon does not exist"}); + + const release = await getReleaseByAddonId(req.params.addonId, req.body.version); + if (release) return res.status(409).json({message: "The provided release already exists"}); + + const latestRelease = await getLatestReleaseByAddonId(req.params.addonId); + if (latestRelease !== null && semver.gt(latestRelease.version, req.body.version)) + return res.status(409).json({message: "You cannot create releases with a lower version than the previous one"}); + + const createdRelease = await createRelease(req.params.addonId, req.body.version, req.body.mc_versions, req.body.description); + if (!createdRelease) return res.status(500).json({message: "An internal error occurred"}); + + res.json({message: "The release has been created", id: createdRelease._id}); +}); + +// Uploads the file of an addon by id +app.post("/:id/upload", isAuthenticatedUser, releaseUpload, async (req, res) => { + if (!req.files || Object.keys(req.files).length === 0 || !req.files.upload) return res.status(400).json({message: "No file has been provided"}); + let file = req.files.upload; + + const release = await getReleaseById(req.params.id); + if (release === null) return res.status(409).json({message: "The provided release does not exist"}); + + const addon = await getAddonById(release.addon_id); + if (addon === null) return res.status(404).json({message: "The provided release does not exist"}); + + if (!req.user._id.equals(addon.user_id)) return res.status(404).json({message: "The provided release does not exist"}); + + if (!await isValidReleaseFile(addon.type, file)) return res.status(415).json({message: "The provided file format is not supported"}); + + await file.mv(process.env.RELEASE_PATH + "/" + release._id, (err) => { + if (err) return res.status(500).json({message: "The file could no be processed, please try again later"}); + + res.json({message: "The file has been uploaded successfully"}); + }); +}); + +// Deletes a release of an addon by id +app.delete("/:id", isAuthenticatedUser, async (req, res) => { + const release = await getReleaseById(req.params.id); + if (release === null) return res.status(409).json({message: "The provided release does not exist"}); + + const addon = await getAddonById(release.addon_id); + if (addon === null) return res.status(404).json({message: "The provided release does not exist"}); + + if (!req.user._id.equals(addon.user_id)) return res.status(404).json({message: "The provided release does not exist"}); + + await release.delete(); + fs.unlink(process.env.RELEASE_PATH + "/" + release._id, () => res.json({message: "Successfully deleted the release"})); +}); + +module.exports = app; \ No newline at end of file