214 lines
5.7 KiB
JavaScript
214 lines
5.7 KiB
JavaScript
const express = require("express");
|
|
const path = require("path");
|
|
const fs = require("fs");
|
|
|
|
const app = express();
|
|
|
|
app.use(express.static("public"));
|
|
|
|
// Set up EJS as the templating engine
|
|
app.set("view engine", "ejs");
|
|
app.set("views", path.join(__dirname, "views"));
|
|
|
|
// Utility to get directories sorted by datetime
|
|
function getSortedReportDirectories(reportDir, env) {
|
|
const dirents = fs
|
|
.readdirSync(reportDir, { withFileTypes: true })
|
|
.filter((dirent) => dirent.isDirectory())
|
|
.map((dirent) => {
|
|
const folderName = dirent.name;
|
|
const parts = folderName.split("-");
|
|
if (parts.length >= 6) {
|
|
const metadata = extractMetadata(folderName);
|
|
const datetime = new Date(`${metadata.date} ${metadata.time}`);
|
|
const link = path.join(env, folderName, "index.html");
|
|
return {
|
|
folderName,
|
|
date: metadata.date,
|
|
time: metadata.time,
|
|
datetime,
|
|
buildId: metadata.buildId,
|
|
link,
|
|
};
|
|
}
|
|
return null;
|
|
})
|
|
|
|
.filter(Boolean)
|
|
.sort((a, b) => b.datetime - a.datetime); // Sort in descending order of datetime
|
|
|
|
return dirents;
|
|
}
|
|
|
|
|
|
// Utility to extract metadata from folder names
|
|
function extractMetadata(str) {
|
|
const regex =
|
|
/^([a-z]+)-([a-z]+-[a-z0-9]+)-(\d+)-(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})$/;
|
|
const match = str.match(regex);
|
|
|
|
if (!match) {
|
|
return "Invalid string format";
|
|
}
|
|
|
|
const [_, env, region, buildId, year, month, day, hours, minutes, seconds] =
|
|
match;
|
|
|
|
// Create a date object in UTC
|
|
const utcDate = new Date(
|
|
Date.UTC(year, month - 1, day, hours, minutes, seconds)
|
|
);
|
|
|
|
// Convert to IST using toLocaleString with the appropriate timezone
|
|
const istDate = utcDate.toLocaleString("en-IN", { timeZone: "Asia/Kolkata" });
|
|
|
|
// Separate the date and time from the IST conversion
|
|
const [istDateOnly, istTimeOnly] = istDate.split(", ");
|
|
|
|
return {
|
|
env,
|
|
region,
|
|
buildId: parseInt(buildId),
|
|
date: istDateOnly,
|
|
time: istTimeOnly,
|
|
datetime: utcDate,
|
|
};
|
|
}
|
|
|
|
// Route to serve the main index.html
|
|
app.get("/", (req, res) => {
|
|
res.sendFile(path.join(__dirname, "public", "index.html"), (err) => {
|
|
if (err) {
|
|
res.status(err.status).end();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Dynamic route to serve specific folder's index.html for PROD-ASIA-SOUTH1
|
|
app.get("/prod-asia-south1/:folderId/index.html", async (req, res) => {
|
|
const folderId = req.params.folderId;
|
|
const reportDir = path.join(
|
|
__dirname,
|
|
"public",
|
|
"prod-asia-south1",
|
|
folderId,
|
|
"index.html"
|
|
);
|
|
|
|
// Serve the index.html from the specific folder
|
|
fs.readFile(reportDir, "utf8", (err, data) => {
|
|
if (err) {
|
|
return res
|
|
.status(404)
|
|
.send("Index file not found for the requested folder.");
|
|
}
|
|
res.send(data);
|
|
});
|
|
});
|
|
|
|
// Dynamic route to serve specific folder's index.html for PROD-US-CENTRAL1
|
|
app.get("/prod-us-central1/:folderId/index.html", (req, res) => {
|
|
const folderId = req.params.folderId;
|
|
const reportDir = path.join(
|
|
__dirname,
|
|
"public",
|
|
"prod-us-central1",
|
|
folderId,
|
|
"index.html"
|
|
);
|
|
|
|
// Serve the index.html from the specific folder
|
|
fs.readFile(reportDir, "utf8", (err, data) => {
|
|
if (err) {
|
|
return res
|
|
.status(404)
|
|
.send("Index file not found for the requested folder.");
|
|
}
|
|
res.send(data);
|
|
});
|
|
});
|
|
|
|
// Dynamic route to serve specific folder's index.html for DEV-ASIA-SOUTH1
|
|
app.get("/dev-asia-south1/:folderId/index.html", (req, res) => {
|
|
const folderId = req.params.folderId;
|
|
const reportDir = path.join(
|
|
__dirname,
|
|
"public",
|
|
"dev-asia-south1",
|
|
folderId,
|
|
"index.html"
|
|
);
|
|
|
|
// Serve the index.html from the specific folder
|
|
fs.readFile(reportDir, "utf8", (err, data) => {
|
|
if (err) {
|
|
return res
|
|
.status(404)
|
|
.send("Index file not found for the requested folder.");
|
|
}
|
|
res.send(data);
|
|
});
|
|
});
|
|
|
|
// Dynamic route to serve specific folder's index.html for DEV-US-CENTRAL1
|
|
app.get("/dev-us-central1/:folderId/index.html", (req, res) => {
|
|
const folderId = req.params.folderId;
|
|
const reportDir = path.join(
|
|
__dirname,
|
|
"public",
|
|
"dev-us-central1",
|
|
folderId,
|
|
"index.html"
|
|
);
|
|
|
|
// Serve the index.html from the specific folder
|
|
fs.readFile(reportDir, "utf8", (err, data) => {
|
|
if (err) {
|
|
return res
|
|
.status(404)
|
|
.send("Index file not found for the requested folder.");
|
|
}
|
|
res.send(data);
|
|
});
|
|
});
|
|
|
|
// Dynamic route for PROD-ASIA-SOUTH1
|
|
app.get("/prod-asia", (req, res) => {
|
|
console.log("came here");
|
|
|
|
const reportDir = path.join(__dirname, "public", "prod-asia-south1");
|
|
const reportDirs = getSortedReportDirectories(reportDir, "prod-asia-south1");
|
|
res.render("reportPage", { reportDirs });
|
|
});
|
|
|
|
// Dynamic route for PROD-US-CENTRAL1 (for all subfolders)
|
|
app.get("/prod-us", (req, res) => {
|
|
const reportDir = path.join(__dirname, "public", "prod-us-central1");
|
|
const reportDirs = getSortedReportDirectories(reportDir, "prod-us-central1");
|
|
res.render("reportPage", { reportDirs });
|
|
});
|
|
|
|
// Dynamic route for DEV-ASIA-SOUTH1
|
|
app.get("/dev-asia", (req, res) => {
|
|
const reportDir = path.join(__dirname, "public", "dev-asia-south1");
|
|
const reportDirs = getSortedReportDirectories(reportDir, "dev-asia-south1");
|
|
res.render("reportPage", { reportDirs });
|
|
});
|
|
|
|
// Dynamic route for DEV-US-CENTRAL1
|
|
app.get("/dev-us", (req, res) => {
|
|
const reportDir = path.join(__dirname, "public", "dev-us-central1");
|
|
const reportDirs = getSortedReportDirectories(reportDir, "dev-us-central1");
|
|
res.render("reportPage", { reportDirs });
|
|
});
|
|
|
|
// Handle 404 errors
|
|
app.use((req, res) => {
|
|
res.status(404).send("404 Not Found");
|
|
});
|
|
|
|
const PORT = process.env.PORT || 8080;
|
|
app.listen(PORT, () => {
|
|
console.log(`Server is running on http://localhost:${PORT}`);
|
|
});
|