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 +}