simple-review-server/src/main.ts
powermaker450 6298fe8cfc Prettier
2024-08-18 23:45:00 -04:00

80 lines
2.2 KiB
TypeScript

import fs from "fs";
import http from "http";
import dotenv from "dotenv";
import { Review, reviewSchema } from "./types";
import { bold, checkFile, emp, Logger, Responder } from "./utils";
dotenv.config();
const logger = new Logger("Simple Review Server");
const response = new Responder();
// @ts-ignore
const port = +process.env.PORT ?? 8080;
const host = emp(`http://localhost:${port}`);
const contentType = { "Content-Type": "application/json" };
http
.createServer((req, res) => {
const isPost = req.method === "POST";
const sender = `${bold(emp("Client:"))} ${emp(req.headers["user-agent"])}`;
req.on("data", async (chunk) => {
if (req.url === "/post") {
let data: Review[] = checkFile("data.json", "utf8");
let temp: any;
try {
temp = JSON.parse(chunk);
} catch (err) {
logger.error(`${sender} <~ Recieved chunk was not valid JSON!`);
res.writeHead(400, contentType);
res.write(response.JsonError("recieved chunk was not valid JSON"));
res.end();
return;
}
await reviewSchema
.validate(temp)
.then((valid) => {
req.on("end", () => {
logger.log(`${sender} ~>`, 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(`${sender} <~ ${err}`);
res.writeHead(400, contentType);
res.write(response.error(err));
res.end();
});
} else {
logger.log(`${sender} cannot ${req.method} to ${req.url}`);
res.writeHead(400, contentType);
res.write(response.requestError(`Cannot ${req.method} to ${req.url}`));
res.end();
}
});
req.on("end", () => {
if (!isPost) {
res.writeHead(404, { "Content-Type": "text/plain" });
res.write(`Cannot ${req.method} ${req.url}`);
res.end();
}
});
})
.listen(port);
logger.log(`Server started on ${host}`);