dsql-admin/dsql-app/webhook/index.js

169 lines
6.2 KiB
JavaScript
Raw Permalink Normal View History

2024-11-05 11:12:42 +00:00
// @ts-check
const http = require("http");
const fs = require("fs");
const path = require("path");
const { exec, execSync, execFile, spawn, spawnSync } = require("child_process");
const { createHmac } = require("crypto");
require("dotenv").config({
path: path.resolve(__dirname, ".env"),
});
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/**
* ==============================================================================
* Initialization
* ==============================================================================
*/
/** ********************* Create HTTP Server */
const server = http.createServer();
/** ********************* Load environment variables */
const key = process.env.DSQL_GITHUB_SECRET;
/** ********************* Set environment */
let environment = process.env.NODE_ENVIRONMENT;
/** ********************* Set global variables */
global.NODE_ENVIRONMENT = environment;
/** ********************* Set PORT */
const PORT = process.env.DSQL_PORT;
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
const workingDirectory = path.resolve(__dirname, "../");
console.log(workingDirectory);
let child = spawn("node", ["./server.js"], {
cwd: workingDirectory,
stdio: "inherit",
env: environment?.match(/prod/i) ? { NODE_ENV: "production" } : undefined,
});
child.on("exit", () => {
console.log("Child Process Exited");
});
/**
* Handle Server Requests
* ==============================================================================
*/
server.on("request", (req, res) => {
/** ********************* Handle response Headers */
if (!req.method?.match(/post/i)) {
return res.writeHead(401, "Unauthorized").end();
}
/** ********************* Initialize data */
let data = "";
try {
/** ********************* Handle Request Methods */
/** # Handle POST Requests
* =================================================
*/
req.on("data", (chunk) => {
data += chunk;
});
/** ********************************************** */
/** ********************************************** */
/** ********************************************** */
req.on("end", () => {
console.log("Request Recieved");
let parsedData = (() => {
try {
return JSON.parse(data.toString());
} catch (error) {
console.log(error.message);
return data.toString();
}
})();
console.log("Request Received", parsedData);
if (req.url == process.env.ENDPOINT) {
/** @type {import("child_process").SpawnSyncOptionsWithBufferEncoding} */
const options = {
cwd: workingDirectory,
stdio: "inherit",
};
if (process.platform?.match(/win/i)) {
options.shell = "bash.exe";
}
if (environment?.match(/prod/i)) {
spawnSync("git", ["checkout", "."], options);
spawnSync("git", ["pull"], options);
spawnSync("npm", ["install"], options);
spawnSync("npm", ["run", "build"], options);
child.kill();
child = spawn("node", ["./server.js"], {
cwd: workingDirectory,
stdio: "inherit",
env: { NODE_ENV: "production" },
});
} else {
spawnSync("git", ["status"], options);
spawnSync("npm", ["list", "next"], options);
console.log("Not in production, Continuing ...");
}
res.statusCode = 200;
res.end("Success");
} else {
res.statusCode = 400;
res.end("Failed");
}
});
/** ********************************************** */
/** ********************************************** */
/** ********************************************** */
} catch (error) {
console.log(error);
res.end(
JSON.stringify({
msg: "Not Handled Yet",
})
);
}
});
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/** ****************************************************************************** */
/**
* ==============================================================================
* Fire up server
* ==============================================================================
*/
// const numCpus = os.cpus().length;
server.listen(PORT, () => {
console.log(`Listening on PORT ${PORT} => env: ${environment}`);
});