72 lines
2.9 KiB
JavaScript
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; |