This repository has been archived on 2024-12-31. You can view files and clone it, but cannot push or open issues or pull requests.

72 lines
2.9 KiB
JavaScript

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;