| 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")); |