Backend/routes/server.js

108 lines
4.6 KiB
JavaScript

const app = require('express').Router();
const {validateSchema} = require('../util/validate');
const {isAuthenticatedUser} = require('../middlewares/authenticate');
const {valLinkServer, installAddon, statusResponse, uninstallAddon} = require('../validations/server');
const {linkServer, getServer, regenToken, listServer} = require('../controller/link');
const {broadcastToServer, closeServerConnectionById, getInformationFromServer} = require('../server/socket');
const {getAddonByName} = require('../controller/addon');
// Validates the server by the express request
const validateServer = async (req, res, mustBeOnline = false) => {
const server = await getServer(req.params.serverId);
if (!server) return res.status(404).json({message: "The provided server does not exist"});
if (!server.user_id.equals(req.user._id)) return res.status(404).json({message: "The provided server does not exist"});
if (mustBeOnline && !server.online) return res.status(504).json({message: "The provided server is not online"});
return server;
}
// Links & creates a new server
app.post("/link", isAuthenticatedUser, async (req, res) => {
const validation = await validateSchema(valLinkServer, req.body);
if (validation) return res.status(400).json({message: validation});
const token = await linkServer(req.user._id, req.body.name);
if (!token) return res.status(500).json({message: "An internal error occurred"});
res.status(201).json({message: "Successfully created the server", token});
});
// Unlinks & deletes a new server
app.post("/:serverId/unlink", isAuthenticatedUser, async (req, res) => {
const server = await validateServer(req, res);
if (!server._id) return;
await server.delete();
await closeServerConnectionById(req.params.serverId);
res.json({message: "Server successfully unlinked"});
});
// Regenerates the token of a server
app.post("/:serverId/regenerate", isAuthenticatedUser, async (req, res) => {
const server = await validateServer(req, res);
if (!server._id) return;
const token = await regenToken(req.params.serverId);
if (!token) return res.status(404).json({message: "The provided server does not exist"});
res.json({message: "Successfully regenerated the token", token});
});
// Lists all registered servers by the client
app.get("/list", isAuthenticatedUser, async (req, res) => {
res.json(await listServer(req.user._id));
});
/*
The following routes need to communicate with the server directly
*/
// Installs an addon the server
app.post("/:serverId/install", isAuthenticatedUser, async (req, res) => {
const validation = await validateSchema(installAddon, req.body);
if (validation) return res.status(400).json({message: validation});
const addon = await getAddonByName(req.body.author, req.body.addon);
if (addon === null) return res.status(404).json({message: "The provided addon does not exist"});
const server = await validateServer(req, res, true);
if (!server._id) return;
broadcastToServer(req.params.serverId, 10, req.body);
res.json({message: "The server now installs the provided addon"});
});
// Checks if a specific addon is installed on the server
app.get("/:serverId/status", isAuthenticatedUser, async (req, res) => {
const validation = await validateSchema(installAddon, req.body);
if (validation) return res.status(400).json({message: validation});
const addon = await getAddonByName(req.body.author, req.body.addon);
if (addon === null) return res.status(404).json({message: "The provided addon does not exist"});
const server = await validateServer(req, res, true);
if (!server._id) return;
const response = await getInformationFromServer(req.params.serverId, 7, req.body);
if (await validateSchema(statusResponse, response)) return res.status(500).json({message: "The server sent an incorrect response"});
res.json({installed: response.status});
});
// Uninstalls an addon from the server
app.post("/:serverId/uninstall", isAuthenticatedUser, async (req, res) => {
if (!req.body.keepFiles) req.body.keepFiles = true;
const validation = await validateSchema(uninstallAddon, req.body);
if (validation) return res.status(400).json({message: validation});
const addon = await getAddonByName(req.body.author, req.body.addon);
if (addon === null) return res.status(404).json({message: "The provided addon does not exist"});
const server = await validateServer(req, res, true);
if (!server._id) return;
broadcastToServer(req.params.serverId, 11, req.body);
res.json({message: "The server now uninstalls the provided addon"});
});
module.exports = app;