import fs from "fs"; import http from "http"; import dotenv from "dotenv"; import { Review, reviewSchema } from "./types"; import { 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"; req.on("data", async (chunk) => { const sender = emp(req.headers["user-agent"]); let data: Review[] = checkFile("data.json", "utf8"); let temp: any; try { temp = JSON.parse(chunk); } catch (err) { console.error(origin + "Chunk is not valid JSON"); return; } await reviewSchema .validate(temp) .then((valid) => { req.on("end", () => { logger.log(`${sender} sent:`, 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(err); res.writeHead(415, contentType); res.write(JSON.stringify({ response: "error", message: "Invalid content-type." })); res.end(); }); }); req.on("end", () => { const sender = emp(req.headers["user-agent"]); if (!isPost) { logger.log(`${sender} sent no data.`) res.writeHead(400, contentType); res.write(response.error("Invalid content-type")); res.end(); } }); }) .listen(port || 8080); logger.log(`Server started on ${host}`);