86 lines
2.9 KiB
JavaScript
86 lines
2.9 KiB
JavaScript
const express = require('express');
|
|
const fs = require('fs');
|
|
|
|
const {checkToken} = require('../middlewares/authenticate');
|
|
const {getUserByName, getUserById} = require("../controller/user");
|
|
const {getAddonFromUser, updateAddonById} = require("../controller/addon");
|
|
const {getReleaseByAddonId, getLatestReleaseByAddonId, updateReleaseById} = require("../controller/release");
|
|
const {ownsItem} = require("../controller/boughtItem");
|
|
|
|
// Create a new express app
|
|
const app = express();
|
|
let dl_folder;
|
|
|
|
// Register routes
|
|
app.get('/:author/:addon/:version.(addon|zip|jar)', async (req, res) => {
|
|
// Get author
|
|
const author = await getUserByName(req.params.author);
|
|
if (author === null) return res.status(404).json({code: 1, message: "The provided addon does not exist"});
|
|
|
|
// Get addon
|
|
const addon = await getAddonFromUser(author._id, req.params.addon);
|
|
if (addon === null) return res.status(404).json({code: 1, message: "The provided addon does not exist"});
|
|
|
|
// Get release
|
|
const release = req.params.version === "latest" ? await getLatestReleaseByAddonId(addon._id)
|
|
: await getReleaseByAddonId(addon._id, req.params.version);
|
|
if (release === null) return res.status(404).json({
|
|
code: 2, message: req.params.version === "latest"
|
|
? "Currently, there are no releases for this addon" : "The provided release version does not exist"
|
|
});
|
|
|
|
// Check price
|
|
if (addon.price !== undefined && addon.price !== 0) {
|
|
const token = await checkToken(req, res);
|
|
if (!token.token) return;
|
|
|
|
const user = await getUserById(token.user_id);
|
|
if (user === null) return res.status(500).json({code: 4, message: "An internal error occurred"});
|
|
|
|
if (!await ownsItem(user._id, addon._id)) return res.status(402).json({
|
|
code: 3,
|
|
message: "You don't own this addon"
|
|
});
|
|
}
|
|
|
|
let addonPath = dl_folder + "/" + release._id;
|
|
if (!fs.existsSync(addonPath)) return res.status(404).json({
|
|
code: 5,
|
|
message: "The author didn't upload the release file yet"
|
|
});
|
|
|
|
// Update download stats
|
|
await updateAddonById(addon._id, {$inc: {downloads: 1}});
|
|
await updateReleaseById(release._id, {$inc: {downloads: 1}});
|
|
|
|
try {
|
|
res.sendFile(addonPath);
|
|
} catch (e) {
|
|
res.status(500).json({message: "The file could not be delivered"});
|
|
}
|
|
});
|
|
|
|
// Register 404 route
|
|
app.use("*", (req, res) => {
|
|
res.status(400).json({message: "You need to use the correct url schema"});
|
|
});
|
|
|
|
|
|
// Start the express server
|
|
module.exports.startServer = (port = 8355, release_folder = "/mnt/data/download") => {
|
|
dl_folder = release_folder;
|
|
app.listen(port, () => log(`Listening to port ${port}`));
|
|
}
|
|
|
|
// Stop the express server
|
|
module.exports.stopServer = () => {
|
|
app.close();
|
|
console.log("Closed the server");
|
|
}
|
|
|
|
// Log something in the express server
|
|
const log = (msg) => {
|
|
console.log(`[Download] ${msg}`);
|
|
}
|
|
|
|
module.exports.server = app; |