Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a30eff7
fix(api): Remove hardcoded use of starting with script, Add config op…
DEVUCP Jun 25, 2025
a3ec5cd
chore: Merge pull request #2 from DEVUCP/api
DEVUCP Jun 25, 2025
fa00d9a
refactor(api): Partial refactor on `startServer` and `runCommand`
OmarSherif06 Jun 25, 2025
d326418
refactor(api): Full server routes refactor
OmarSherif06 Jun 25, 2025
0e27a80
refactor(api): Full installations routes refactor
OmarSherif06 Jun 25, 2025
d1eb581
style(api): Clean up `configUtils`
OmarSherif06 Jun 25, 2025
a51da60
style(api): Clean up `cleaner`
OmarSherif06 Jun 25, 2025
415f254
refactor(api): Full properties routes refactor
OmarSherif06 Jun 26, 2025
0fc0a8c
refactor(api): Full `app` and `middleware` refactor
OmarSherif06 Jun 26, 2025
632528b
refactor(api): Rename all routes to convention
OmarSherif06 Jun 26, 2025
fd3c09b
chore: Merge pull request #3 from DEVUCP/api-refactor
OmarSherif06 Jun 26, 2025
b6d5830
fix(api): General fixes `installations`
OmarSherif06 Jun 28, 2025
f39c663
chore(api): Add `adm-zip` and `pidusage` packages
OmarSherif06 Jun 28, 2025
5f4ddb5
feat(api): Create `info` route
OmarSherif06 Jun 28, 2025
96493a3
refactor(api): Rename all utils to convention
OmarSherif06 Jun 28, 2025
401b3d2
ci: Update the yml to test on their respective branches
OmarSherif06 Jun 28, 2025
50e4687
chore: Merge pull request #4 from DEVUCP/main
OmarSherif06 Jun 28, 2025
cd61903
fix(api): Rename include to actual file name
OmarSherif06 Jun 28, 2025
3775c93
feat(api): Create `getAllInfo` endpoint
OmarSherif06 Jun 28, 2025
03cbbe8
feat(api): Delete old files when
OmarSherif06 Jun 28, 2025
bcfeb76
fix(api): Correctly detect Minecraft version for Fabric servers
OmarSherif06 Jun 28, 2025
2482b59
chore: Merge pull request #6 from DEVUCP/api
DEVUCP Jul 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/node.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,19 @@ on:
branches:
- main
- 'ci*'
- 'front-end'
- 'api'
pull_request:
branches:
- main
- 'ci*'
- 'front-end'
- 'api'

jobs:
test-api-linux:
name: API Test (Linux)
if: github.ref_name == 'api' || (github.ref_name != 'api' && github.ref_name != 'front-end')
runs-on: ubuntu-latest

strategy:
Expand All @@ -35,6 +40,7 @@ jobs:

test-frontend-linux:
name: Frontend Test (Linux)
if: github.ref_name == 'front-end' || (github.ref_name != 'api' && github.ref_name != 'front-end')
runs-on: ubuntu-latest

strategy:
Expand All @@ -57,6 +63,7 @@ jobs:

test-api-windows:
name: API Test (Windows)
if: github.ref_name == 'api' || (github.ref_name != 'api' && github.ref_name != 'front-end')
runs-on: windows-latest

strategy:
Expand All @@ -79,6 +86,7 @@ jobs:

test-frontend-windows:
name: Frontend Test (Windows)
if: github.ref_name == 'front-end' || (github.ref_name != 'api' && github.ref_name != 'front-end')
runs-on: windows-latest

strategy:
Expand Down
29 changes: 29 additions & 0 deletions api/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const express = require('express');
const cors = require('cors');
const { limiter } = require('./middleware/limiter.middleware');

const app = express();

const adminRoutes = require('./routes/admin.routes');
const serverRoutes = require('./routes/server.routes');
const propertiesRoute = require('./routes/properties.routes');
const installationsRoutes = require('./routes/installations.routes');
const infoRoutes = require('./routes/info.routes');

app.use(cors());
app.use(limiter)
app.use(express.json());

app.use('/server', serverRoutes);
app.use('/installations', installationsRoutes);
app.use('/properties', propertiesRoute);
app.use('/info', infoRoutes);
app.use('/admin', adminRoutes);

app.get('/ping', async (req, res) => {
res.send(`pong`);
});

module.exports = {
app
}
20 changes: 7 additions & 13 deletions api/cleaner.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@

let cleanup_done = false;
const networkingUtils = require('./utils/networkingUtils');
const configUtils = require('./utils/configUtils');
const networkingUtils = require('./utils/networking.util');
const configUtils = require('./utils/config.util');
const debug = configUtils.getConfigAttribute("debug");


async function cleanup() {

if(debug){
console.log("\nDebug mode is turned on\n Skipping cleanup tasks...\n if you don't intend this, change 'debug' from true to false in server-config.json");
console.log("====== API TERMINATED! ======");
Expand All @@ -27,20 +24,17 @@ async function cleanup() {
}

process.on('exit', () => {
if (!cleanup_done) {
if (!cleanup_done)
cleanup();
}
});

process.on('SIGINT', async () => {
async function handleExit() {
await cleanup();
process.exit(0);
});
}

process.on('SIGTERM', async () => {
await cleanup();
process.exit(0);
});
process.on('SIGINT', handleExit);
process.on('SIGTERM', handleExit);

process.on('uncaughtException', async (err) => {
console.error('Uncaught Exception:', err);
Expand Down
6 changes: 6 additions & 0 deletions api/consts.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ const configFilePath = "./server-config.json";
const eulaFilePath = `${serverDirectory}/eula.txt`;
const upnpcPath = '/upnpc';

const serverStatus = {
OFFLINE: 0,
RUNNING: 1,
STARTING: 2
};

module.exports = {
serverDirectory,
Expand All @@ -29,4 +34,5 @@ module.exports = {
serverBannedIPsPath,
keysJSONPath,
eulaFilePath,
serverStatus
};
86 changes: 86 additions & 0 deletions api/controllers/info.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
const propertiesService = require('../services/properties.service');
const infoService = require('../services/info.service');
const serverService = require('../services/server.service');
const consts = require('../consts');

async function playerCount(req, res) {
try {
const playerCount = await propertiesService.getOnlinePlayers();

res.status(200).send({ playerCount: playerCount });
} catch(error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

async function getUpTime(req, res) {
try {

res.status(200).send(await infoService.getUpTime());
} catch (error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

async function getMemoryUsage(req, res) {
try {
let serverProcess = serverService.getServerProcess();
res.status(200).send(await infoService.getMemoryUsage(serverProcess));
} catch (error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

async function getWorldSize(req, res) {
try {
let worldSize = await infoService.getDirectorySize(consts.serverDirectory + "/world");
res.status(200).send({ worldSize: `${worldSize.toFixed(2)}MB` });
} catch (error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

async function getVersion(req, res) {
try {
let version = infoService.getVersion(consts.serverDirectory + "/" + consts.serverName);
res.status(200).send({ version: version });
} catch (error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

async function getPlatform(req, res) {
try {
let platform = infoService.getPlatform(consts.serverDirectory + "/" + consts.serverName);
res.status(200).send({ platform: platform });
} catch (error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

async function getAllInfo(req, res) {
try {
let serverProcess = serverService.getServerProcess();
let jarPath = consts.serverDirectory + "/" + consts.serverName
res.status(200).send(await infoService.getInfo(serverProcess, jarPath, consts.serverDirectory));
} catch (error) {
console.error(error);
res.status(500).send("error.. " + error.message);
}
}

module.exports = {
playerCount,
getUpTime,
getMemoryUsage,
getWorldSize,
getVersion,
getPlatform,
getAllInfo
}
25 changes: 25 additions & 0 deletions api/controllers/installations.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const installationsService = require('../services/installations.service');
const { updateConfigAttribute } = require('../utils/config.util');
const { Sema } = require('async-sema');

const downloadSema = new Sema(1);

async function downloadServer(req, res) {
await downloadSema.acquire();

try {
await installationsService.downloadRouter(req.params.platform, req.params.version);
res.status(201).send('Downloaded Successfully');

updateConfigAttribute("platform", req.params.platform);
updateConfigAttribute("version", req.params.version);
} catch (error) {
res.status(500).send(`Error downloading server files: ${error}`);
} finally{
downloadSema.release();
}
}

module.exports = {
downloadServer
}
Loading