const app = require('express').Router(); const fs = require('fs'); const checkPermission = require("../middlewares/checkPermission"); const mediaValidation = require("../validation/mediaValidation"); const crypto = require('crypto'); const Media = require("../models/Media"); app.put("/", checkPermission("admin.media.upload"), async (req, res) => { // Validate request const {error} = mediaValidation.upload.validate(req.body); if (error) return res.status(400).json({message: error.details[0].message}); // Check if file was provided if (req.files && req.files.asset) { const asset = req.files.asset; const assetID = crypto.randomBytes(8).toString('hex'); const splittedAsset = asset.name.split("."); const assetEnding = splittedAsset[splittedAsset.length - 1]; // Check if the asset exists const {count: assetCount} = await Media.findAndCountAll({where: {assetID: assetID}}); if (assetCount === 1) return res.status(400).json({message: "This asset already exists"}); // Create the asset await Media.create({ assetID: assetID, assetCreator: req.token, assetEnding: assetEnding, assetName: asset.name, assetDescription: req.body.assetDescription }); // Move the asset to the upload directory await req.files.asset.mv(process.env.CDN_MEDIA_PATH + "/" + assetID); // Send response res.status(200).json({ message: "Asset successfully uploaded", id: assetID, url: "https://cdn.sheepstar.xyz/" + assetID + "." + assetEnding }); } else res.status(400).json({message: "You must provide an asset"}); }); app.delete("/:assetID", checkPermission("admin.media.delete"), async (req, res) => { // Validate request if (!req.params.assetID) return res.status(400).json({message: "You must provide an asset ID"}); // Check if asset exists const {count} = await Media.findAndCountAll({where: {assetID: req.params.assetID}}); if (count === 0) res.status(404).json({message: "The provided asset does not exist."}); // Delete asset try { fs.unlinkSync(process.env.CDN_MEDIA_PATH + "/" + req.params.assetID); await Media.destroy({where: {assetID: req.params.assetID}}); } catch (e) { return res.status(500).json({message: "The provided asset could not be deleted"}); } res.status(200).json({message: "Asset successfully deleted"}); }); app.get("/:assetID", checkPermission("admin.media.info"), async (req, res) => { // Validate request if (!req.params.assetID) return res.status(400).json({message: "You must provide an asset ID"}); // Check if asset exists const {count, rows} = await Media.findAndCountAll({where: {assetID: req.params.assetID}}); if (count === 0) res.status(404).json({message: "The provided asset does not exist."}); // Return response res.status(200).json(rows); }); module.exports = app;