|
const express = require("express"); |
|
const bodyParser = require("body-parser"); |
|
const cors = require("cors"); |
|
const path = require("path"); |
|
const { exec } = require("child_process"); |
|
const fs = require("fs-extra"); |
|
const { handleTerminal } = require("./terminalManager"); |
|
const { |
|
isValidDirectoryName, |
|
createUserDirectory, |
|
deleteUserDirectory, |
|
logMessage |
|
} = require("./utils"); |
|
|
|
const app = express(); |
|
|
|
|
|
app.use(bodyParser.json()); |
|
app.use(cors({ |
|
origin: "*", |
|
methods: ["GET", "POST"], |
|
})); |
|
app.use(express.static(path.join(__dirname, "../frontend"))); |
|
|
|
const userDirectories = "./userDirectories"; |
|
|
|
|
|
if (!fs.existsSync(userDirectories)) { |
|
fs.mkdirSync(userDirectories); |
|
} |
|
|
|
const runningProcesses = new Map(); |
|
|
|
|
|
app.get("/", (req, res) => { |
|
res.sendFile(path.join(__dirname, "../frontend/index.html")); |
|
}); |
|
|
|
|
|
app.post("/start", async (req, res) => { |
|
const { directoryName, password, repoURL } = req.body; |
|
|
|
try { |
|
|
|
if (!directoryName || !password || !repoURL) { |
|
return res.status(400).send("Invalid inputs"); |
|
} |
|
|
|
if (!isValidDirectoryName(directoryName)) { |
|
return res.status(400).send("Invalid directory name format"); |
|
} |
|
|
|
if (runningProcesses.has(directoryName)) { |
|
return res.status(400).send("A process is already running for this directory."); |
|
} |
|
|
|
const userDir = path.join(userDirectories, directoryName); |
|
|
|
|
|
try { |
|
createUserDirectory(userDirectories, directoryName, password); |
|
} catch (err) { |
|
logMessage(`Failed to create directory: ${err.message}`); |
|
return res.status(500).send("Failed to create user directory"); |
|
} |
|
|
|
|
|
exec(`git clone ${repoURL} ${userDir}`, (cloneError, stdout, stderr) => { |
|
if (cloneError) { |
|
logMessage(`Error cloning repo: ${cloneError.message}`); |
|
logMessage(`STDERR: ${stderr}`); |
|
return res.status(500).send(`Error cloning repository: ${stderr}`); |
|
} |
|
|
|
logMessage(`Repository cloned successfully for ${directoryName}`); |
|
|
|
|
|
exec(`yarn install --cwd ${userDir}`, (installError, installStdout, installStderr) => { |
|
if (installError) { |
|
logMessage(`Error installing dependencies: ${installError.message}`); |
|
logMessage(`STDERR: ${installStderr}`); |
|
return res.status(500).send(`Error installing dependencies: ${installStderr}`); |
|
} |
|
|
|
|
|
handleTerminal(directoryName, userDir); |
|
|
|
|
|
runningProcesses.set(directoryName, true); |
|
|
|
logMessage(`Successfully initialized directory: ${directoryName}`); |
|
res.send("Directory and terminal started successfully"); |
|
}); |
|
}); |
|
|
|
} catch (error) { |
|
logMessage(`Error: ${error.message}`); |
|
res.status(500).send("Internal Server Error"); |
|
} |
|
}); |
|
|
|
|
|
app.post("/delete", async (req, res) => { |
|
const { directoryName, password } = req.body; |
|
|
|
try { |
|
if (!directoryName || !password) { |
|
return res.status(400).send("Invalid inputs"); |
|
} |
|
|
|
if (runningProcesses.has(directoryName)) { |
|
handleTerminal(directoryName, null, true); |
|
runningProcesses.delete(directoryName); |
|
} |
|
|
|
deleteUserDirectory(userDirectories, directoryName, password); |
|
logMessage(`Directory ${directoryName} deleted successfully`); |
|
res.send("Directory deleted successfully"); |
|
} catch (error) { |
|
logMessage(`Error deleting directory: ${error.message}`); |
|
res.status(500).send(error.message); |
|
} |
|
}); |
|
|
|
|
|
app.post("/stop", (req, res) => { |
|
const { directoryName } = req.body; |
|
|
|
if (!directoryName) { |
|
return res.status(400).send("Invalid directory name"); |
|
} |
|
|
|
if (!runningProcesses.has(directoryName)) { |
|
return res.status(400).send("No process is running for this directory."); |
|
} |
|
|
|
handleTerminal(directoryName, null, true); |
|
runningProcesses.delete(directoryName); |
|
|
|
logMessage(`Terminal for ${directoryName} stopped`); |
|
res.send("Terminal stopped successfully"); |
|
}); |
|
|
|
|
|
app.listen(7860, () => console.log("Server is running on port 7860")); |