diff --git a/JavaScript/rewritedServer/cache.js b/JavaScript/rewritedServer/cache.js new file mode 100644 index 0000000..42ec431 --- /dev/null +++ b/JavaScript/rewritedServer/cache.js @@ -0,0 +1,16 @@ +'use strict'; + +const cache = {}; + +const setCache = (url, cacheData) => { + cache[url] = cacheData; +} + +const getFromCache = (url) => { + return cache[url]; +} + +module.exports = { + setCache, + getFromCache +} diff --git a/JavaScript/rewritedServer/config.js b/JavaScript/rewritedServer/config.js new file mode 100644 index 0000000..497e6d9 --- /dev/null +++ b/JavaScript/rewritedServer/config.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + HOST_NAME: 'localhost', + PORT: 8000 +} diff --git a/JavaScript/rewritedServer/controllers.js b/JavaScript/rewritedServer/controllers.js new file mode 100644 index 0000000..80a38db --- /dev/null +++ b/JavaScript/rewritedServer/controllers.js @@ -0,0 +1,53 @@ +'use strict'; + +const { setCache } = require('./cache'); +const { parseCookies } = require('./cookies'); +const { personGetService, personPostService } = require('./services'); + +const defaultController = (req, res) => { + const cookies = parseCookies(req); + res.writeHead(200, { + 'Set-Cookie': 'mycookie=test', + 'Content-Type': 'text/html' + }); + const ip = req.connection.remoteAddress; + res.write(`
${JSON.stringify(cookies)}`);
+}
+
+const personGetController = async (req, res) => {
+ const result = await personGetService();
+ setCache(req.url, result);
+ if (result) {
+ res.writeHead(200);
+ res.end(result);
+ } else {
+ res.writeHead(500);
+ res.end('Read error');
+ }
+}
+
+const personPostController = (req, res) => {
+ const body = [];
+
+ req.on('data', (chunk) => {
+ body.push(chunk);
+ }).on('end', async () => {
+ let data = Buffer.concat(body).toString();
+ const obj = JSON.parse(data);
+ data = await personPostService(obj);
+ if (data) {
+ res.writeHead(200);
+ res.end('File saved');
+ } else {
+ res.writeHead(500);
+ res.end('Write error');
+ }
+ });
+}
+
+module.exports = {
+ defaultController,
+ personGetController,
+ personPostController
+}
diff --git a/JavaScript/rewritedServer/cookies.js b/JavaScript/rewritedServer/cookies.js
new file mode 100644
index 0000000..0e41149
--- /dev/null
+++ b/JavaScript/rewritedServer/cookies.js
@@ -0,0 +1,18 @@
+'use strict';
+
+const { logger } = require('./loger');
+
+const parseCookies = (req) => {
+ const cookie = req.headers.cookie;
+ logger.cookie(cookie);
+ const cookies = {};
+ if (cookie) cookie.split(';').forEach((item) => {
+ const parts = item.split('=');
+ cookies[(parts[0]).trim()] = (parts[1] || '').trim();
+ });
+ return cookies;
+}
+
+module.exports = {
+ parseCookies
+}
diff --git a/JavaScript/rewritedServer/loger.js b/JavaScript/rewritedServer/loger.js
new file mode 100644
index 0000000..ca4f1a2
--- /dev/null
+++ b/JavaScript/rewritedServer/loger.js
@@ -0,0 +1,34 @@
+'use strict';
+
+class Logger {
+ constructor(logColor = '\x1b[42m', errorColor = '\x1b[41m', cookieColor = '\x1b[45m') {
+ this.logColor = logColor;
+ this.errorColor = errorColor;
+ this.cookieColor = cookieColor;
+ }
+
+ setDefaultColor() {
+ console.log('\x1b[0m');
+ }
+
+ log(...messages) {
+ console.log(`${this.logColor}${new Date().toISOString()} : ${messages.join(' ')}`);
+ this.setDefaultColor();
+ }
+
+ error(...messages) {
+ console.log(`${this.errorColor}${new Date().toISOString()} : ${messages.join(' ')}`);
+ this.setDefaultColor();
+ }
+
+ cookie(cookie) {
+ console.log(`${this.cookieColor}${cookie}`);
+ this.setDefaultColor();
+ }
+}
+
+const logger = new Logger();
+
+module.exports = {
+ logger
+}
diff --git a/JavaScript/rewritedServer/person.json b/JavaScript/rewritedServer/person.json
new file mode 100644
index 0000000..b34a986
--- /dev/null
+++ b/JavaScript/rewritedServer/person.json
@@ -0,0 +1 @@
+{"name":"John","age":"23"}
\ No newline at end of file
diff --git a/JavaScript/rewritedServer/routing.js b/JavaScript/rewritedServer/routing.js
new file mode 100644
index 0000000..f868418
--- /dev/null
+++ b/JavaScript/rewritedServer/routing.js
@@ -0,0 +1,13 @@
+'use strict';
+
+const { defaultController, personGetController, personPostController } = require('./controllers');
+
+module.exports = {
+ GET: {
+ '/': defaultController,
+ '/person': personGetController
+ },
+ POST: {
+ '/person': personPostController
+ }
+};
diff --git a/JavaScript/rewritedServer/server.js b/JavaScript/rewritedServer/server.js
new file mode 100644
index 0000000..3c23f3b
--- /dev/null
+++ b/JavaScript/rewritedServer/server.js
@@ -0,0 +1,15 @@
+'use strict';
+
+const http = require('node:http');
+const { PORT } = require('./config');
+const routing = require('./routing');
+const { logger } = require('./loger');
+const { getFromCache } = require('./cache');
+
+http.createServer((req, res) => {
+ logger.log(req.method, req.url);
+ if (req.method === 'GET' && getFromCache(req.url)) {
+ return getFromCache(req.url);
+ }
+ routing[req.method][req.url](req, res);
+}).listen(PORT);
diff --git a/JavaScript/rewritedServer/services.js b/JavaScript/rewritedServer/services.js
new file mode 100644
index 0000000..12f43db
--- /dev/null
+++ b/JavaScript/rewritedServer/services.js
@@ -0,0 +1,35 @@
+'use strict';
+
+const fs = require('node:fs').promises;
+
+const personGetService = async () => {
+ try {
+ const data = await fs.readFile('./person.json');
+ const obj = JSON.parse(data);
+ obj.birth = new Date(obj.birth);
+ const difference = new Date() - obj.birth;
+ obj.age = Math.floor(difference / 31536000000);
+ delete obj.birth;
+ const sobj = JSON.stringify(obj);
+ return sobj;
+ } catch (e) {
+ return false;
+ }
+}
+
+const personPostService = async (obj) => {
+ try {
+ if (obj.name) obj.name = obj.name.trim();
+ const data = JSON.stringify(obj);
+ await fs.writeFile('./person.json', data);
+ return data;
+ } catch (e) {
+ console.error(e);
+ return false;
+ }
+}
+
+module.exports = {
+ personGetService,
+ personPostService
+}