2024-08-16 15:04:52 -04:00
|
|
|
import fs from "fs";
|
|
|
|
import http from "http";
|
|
|
|
import dotenv from "dotenv";
|
2024-08-19 01:46:06 -04:00
|
|
|
import { serverReviewSchema, ServerSideReview, userReviewSchema } from "./types";
|
|
|
|
import { appendId, bold, checkFile, emp, Logger, Responder } from "./utils";
|
2024-08-16 15:04:52 -04:00
|
|
|
dotenv.config();
|
|
|
|
|
2024-08-18 17:17:59 -04:00
|
|
|
const logger = new Logger("Simple Review Server");
|
2024-08-18 17:11:15 -04:00
|
|
|
const response = new Responder();
|
|
|
|
// @ts-ignore
|
2024-08-16 15:04:52 -04:00
|
|
|
const port = +process.env.PORT ?? 8080;
|
2024-08-18 17:11:15 -04:00
|
|
|
const host = emp(`http://localhost:${port}`);
|
2024-08-16 15:04:52 -04:00
|
|
|
const contentType = { "Content-Type": "application/json" };
|
|
|
|
|
|
|
|
http
|
|
|
|
.createServer((req, res) => {
|
|
|
|
const isPost = req.method === "POST";
|
2024-08-18 23:44:22 -04:00
|
|
|
const sender = `${bold(emp("Client:"))} ${emp(req.headers["user-agent"])}`;
|
2024-08-16 15:04:52 -04:00
|
|
|
|
|
|
|
req.on("data", async (chunk) => {
|
2024-08-18 19:22:50 -04:00
|
|
|
if (req.url === "/post") {
|
2024-08-19 01:46:06 -04:00
|
|
|
let data: ServerSideReview[] = checkFile("data.json", "utf8");
|
2024-08-18 19:22:50 -04:00
|
|
|
let temp: any;
|
|
|
|
|
|
|
|
try {
|
|
|
|
temp = JSON.parse(chunk);
|
|
|
|
} catch (err) {
|
2024-08-18 23:44:22 -04:00
|
|
|
logger.error(`${sender} <~ Recieved chunk was not valid JSON!`);
|
2024-08-18 23:17:31 -04:00
|
|
|
|
|
|
|
res.writeHead(400, contentType);
|
|
|
|
res.write(response.JsonError("recieved chunk was not valid JSON"));
|
|
|
|
res.end();
|
2024-08-18 19:22:50 -04:00
|
|
|
return;
|
|
|
|
}
|
2024-08-16 15:04:52 -04:00
|
|
|
|
2024-08-19 01:46:06 -04:00
|
|
|
await userReviewSchema
|
2024-08-18 19:22:50 -04:00
|
|
|
.validate(temp)
|
|
|
|
.then((valid) => {
|
|
|
|
req.on("end", () => {
|
2024-08-18 23:44:22 -04:00
|
|
|
logger.log(`${sender} ~>`, valid);
|
2024-08-16 15:04:52 -04:00
|
|
|
|
2024-08-19 01:46:06 -04:00
|
|
|
serverReviewSchema
|
|
|
|
.validate(appendId(valid))
|
|
|
|
.then((valid) => {
|
|
|
|
data.push(valid);
|
|
|
|
fs.writeFileSync(
|
|
|
|
"./persist/data.json",
|
|
|
|
JSON.stringify(data, null, 2),
|
|
|
|
);
|
|
|
|
|
|
|
|
res.writeHead(201, contentType);
|
|
|
|
res.write(response.success("review was sent"));
|
|
|
|
res.end();
|
|
|
|
})
|
|
|
|
.catch((err) => {
|
|
|
|
logger.error("Failed to assign ID to review:", err);
|
|
|
|
|
|
|
|
res.writeHead(500, contentType);
|
|
|
|
res.write(response.serverError("could not assign ID to review"));
|
|
|
|
res.end();
|
|
|
|
});
|
2024-08-16 15:04:52 -04:00
|
|
|
|
2024-08-18 19:22:50 -04:00
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch((err) => {
|
2024-08-18 23:44:22 -04:00
|
|
|
logger.error(`${sender} <~ ${err}`);
|
2024-08-18 19:22:50 -04:00
|
|
|
|
|
|
|
res.writeHead(400, contentType);
|
2024-08-18 22:45:02 -04:00
|
|
|
res.write(response.error(err));
|
2024-08-16 15:04:52 -04:00
|
|
|
res.end();
|
|
|
|
});
|
2024-08-18 19:22:50 -04:00
|
|
|
} else {
|
|
|
|
logger.log(`${sender} cannot ${req.method} to ${req.url}`);
|
2024-08-16 15:04:52 -04:00
|
|
|
|
2024-08-18 19:22:50 -04:00
|
|
|
res.writeHead(400, contentType);
|
2024-08-18 23:17:31 -04:00
|
|
|
res.write(response.requestError(`Cannot ${req.method} to ${req.url}`));
|
2024-08-18 19:22:50 -04:00
|
|
|
res.end();
|
|
|
|
}
|
2024-08-16 15:04:52 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
req.on("end", () => {
|
|
|
|
if (!isPost) {
|
2024-08-18 23:45:00 -04:00
|
|
|
res.writeHead(404, { "Content-Type": "text/plain" });
|
2024-08-18 19:22:50 -04:00
|
|
|
res.write(`Cannot ${req.method} ${req.url}`);
|
2024-08-16 15:04:52 -04:00
|
|
|
res.end();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})
|
2024-08-18 22:45:26 -04:00
|
|
|
.listen(port);
|
2024-08-16 15:04:52 -04:00
|
|
|
|
2024-08-18 17:11:15 -04:00
|
|
|
logger.log(`Server started on ${host}`);
|