import fs from "fs"; import http from "http"; import dotenv from "dotenv"; import { serverReviewSchema, ServerSideReview, userReviewSchema } from "./types"; import { appendId, 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: ServerSideReview[] = 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 userReviewSchema .validate(temp) .then((valid) => { req.on("end", () => { logger.log(`${sender} ~>`, valid); 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(); }); }); }) .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}`);