From b737f0e1aae44c5b90c3038f0d181acb64ac87a0 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Fri, 11 Oct 2024 19:49:26 +0200 Subject: [PATCH 01/17] client --- .gitignore | 133 +------------------------------------------ Makefile | 2 + content/f1.txt | 0 content/f2.txt | 0 filesink_ex.js | 0 index.js | 9 +-- nasa/nasa.client.js | 28 +++++++++ nasa/nasa.options.js | 15 +++++ package.json | 24 ++++++++ 9 files changed, 74 insertions(+), 137 deletions(-) create mode 100644 Makefile delete mode 100644 content/f1.txt delete mode 100644 content/f2.txt delete mode 100644 filesink_ex.js create mode 100644 nasa/nasa.client.js create mode 100644 nasa/nasa.options.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore index c6bba59..5d63eff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,130 +1,3 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +.vscode +env +.env \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6dcb012 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +start: + node --env-file=.env index.js \ No newline at end of file diff --git a/content/f1.txt b/content/f1.txt deleted file mode 100644 index e69de29..0000000 diff --git a/content/f2.txt b/content/f2.txt deleted file mode 100644 index e69de29..0000000 diff --git a/filesink_ex.js b/filesink_ex.js deleted file mode 100644 index e69de29..0000000 diff --git a/index.js b/index.js index b43bb61..fe2ba2e 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,3 @@ -var http = require('http'); +const feed = require('./nasa/nasa.client.js') -console.log('Hello World!'); - -http.createServer(function (req, res) { - res.writeHead(200, {'Content-Type': 'text/html'}); - res.end('Hello World!'); -}).listen(8080); \ No newline at end of file +console.log(feed()) \ No newline at end of file diff --git a/nasa/nasa.client.js b/nasa/nasa.client.js new file mode 100644 index 0000000..943e3e6 --- /dev/null +++ b/nasa/nasa.client.js @@ -0,0 +1,28 @@ +const https = require('https') +const options = require('./nasa.options.js') + +const feed = (()=>{ + const req = https.request(options, (res) => { + console.log('statusCode:', res.statusCode); + console.log('headers:', res.headers); + + let rawData = ''; + res.on('data', (chunk) => { rawData += chunk; }); + + res.on('end', () => { + try { + const parsedData = JSON.parse(rawData); + console.log(parsedData); + } catch (e) { + console.error(e.message); + } + }); + }); + req.on('error', (e) => { + console.error(e); + }); + + req.end(); +}); + +module.exports = feed \ No newline at end of file diff --git a/nasa/nasa.options.js b/nasa/nasa.options.js new file mode 100644 index 0000000..1a8c438 --- /dev/null +++ b/nasa/nasa.options.js @@ -0,0 +1,15 @@ +process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; + +const api_key = process.env.nasa_api_key + +const feed_path = `/neo/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&api_key=${api_key}`; +console.log(feed_path) + +const options = { + hostname: 'api.nasa.gov', + port: 443, + path: feed_path, + method: 'GET' + }; + + module.exports = options \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..2430638 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "node-proxy-server", + "version": "1.0.0", + "description": "node proxy server", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/AntonHrbnts/node-proxy-server.git" + }, + "keywords": [ + "nodejs", + "proxy", + "server" + ], + "author": "Anton Hrabianets", + "license": "ISC", + "bugs": { + "url": "https://github.com/AntonHrbnts/node-proxy-server/issues" + }, + "homepage": "https://github.com/AntonHrbnts/node-proxy-server#readme" +} From 20dbcb787e83383dbc33856f53a16c598dee9761 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Mon, 14 Oct 2024 09:13:27 +0200 Subject: [PATCH 02/17] task-4-express --- .gitignore | 3 +- index.js | 7 +- package-lock.json | 773 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 +- 4 files changed, 785 insertions(+), 3 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 5d63eff..2861fd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .vscode env -.env \ No newline at end of file +.env +node_modules \ No newline at end of file diff --git a/index.js b/index.js index fe2ba2e..053134b 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,8 @@ +const express = require("express") const feed = require('./nasa/nasa.client.js') +const app = express(); -console.log(feed()) \ No newline at end of file +app.listen(8000, ()=> { + console.log("Server started, port: 8000") +}) +feed() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8ebbad6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,773 @@ +{ + "name": "node-proxy-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "node-proxy-server", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.21.1" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/package.json b/package.json index 2430638..e49703c 100644 --- a/package.json +++ b/package.json @@ -20,5 +20,8 @@ "bugs": { "url": "https://github.com/AntonHrbnts/node-proxy-server/issues" }, - "homepage": "https://github.com/AntonHrbnts/node-proxy-server#readme" + "homepage": "https://github.com/AntonHrbnts/node-proxy-server#readme", + "dependencies": { + "express": "^4.21.1" + } } From 922805ef763cdc43fb3ee7c9a8af76f1a0ba677f Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Mon, 14 Oct 2024 12:59:55 +0200 Subject: [PATCH 03/17] Task-5-endpoint --- index.js | 11 ++++++- nasa/nasa.client.js | 8 ++++- package-lock.json | 79 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 053134b..2f116b6 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,17 @@ const express = require("express") +const axios = require('axios') + const feed = require('./nasa/nasa.client.js') const app = express(); app.listen(8000, ()=> { console.log("Server started, port: 8000") }) -feed() \ No newline at end of file + +app.get('/meteors', (req, res) => { + axios.get('https://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&api_key=jdT7geV5iPWY5TJWt94rKcO7usE2JQuVWFsX2UkG') + .then(response => { + console.log(response) + res.send(response.data)}) + .catch(error => {console.log(error)}) +}) diff --git a/nasa/nasa.client.js b/nasa/nasa.client.js index 943e3e6..a217a80 100644 --- a/nasa/nasa.client.js +++ b/nasa/nasa.client.js @@ -1,8 +1,13 @@ const https = require('https') const options = require('./nasa.options.js') +function getMeteors(){ + return 'qwer'; +} + const feed = (()=>{ const req = https.request(options, (res) => { + console.log('statusCode:', res.statusCode); console.log('headers:', res.headers); @@ -17,6 +22,7 @@ const feed = (()=>{ console.error(e.message); } }); + return rawData; }); req.on('error', (e) => { console.error(e); @@ -25,4 +31,4 @@ const feed = (()=>{ req.end(); }); -module.exports = feed \ No newline at end of file +module.exports = { feed, getMeteors} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8ebbad6..d9ca358 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "axios": "^1.7.7", "express": "^4.21.1" } }, @@ -31,6 +32,23 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -83,6 +101,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -145,6 +175,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -275,6 +314,40 @@ "node": ">= 0.8" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -551,6 +624,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", diff --git a/package.json b/package.json index e49703c..97e9dbe 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "homepage": "https://github.com/AntonHrbnts/node-proxy-server#readme", "dependencies": { + "axios": "^1.7.7", "express": "^4.21.1" } } From 785a157aee5f0ade4a7b23f1689b1a5fc484a023 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Mon, 14 Oct 2024 14:51:42 +0200 Subject: [PATCH 04/17] Task-7: Add logic to your app --- index.js | 29 +++++++++++++++++++++-------- nasa/nasa.client.js | 28 +++++++++++++++++++++------- nasa/nasa.options.js | 4 +++- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/index.js b/index.js index 2f116b6..d0f6728 100644 --- a/index.js +++ b/index.js @@ -1,17 +1,30 @@ const express = require("express") -const axios = require('axios') -const feed = require('./nasa/nasa.client.js') +const nasa = require('./nasa/nasa.client.js') const app = express(); app.listen(8000, ()=> { console.log("Server started, port: 8000") }) -app.get('/meteors', (req, res) => { - axios.get('https://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&api_key=jdT7geV5iPWY5TJWt94rKcO7usE2JQuVWFsX2UkG') - .then(response => { - console.log(response) - res.send(response.data)}) - .catch(error => {console.log(error)}) +app.get('/meteors', async (req, res) => { + let meteors = await nasa.getMeteors(); + console.log(meteors) + const meteorData = meteors.data.near_earth_objects; + const allMeteors = Object.values(meteorData).flat(); + if(!Array.isArray(allMeteors)){ + res.send("meteors are not array") + } + const adaptedMeteors = allMeteors.map(meteor => ({ + id: meteor.id, + name: meteor.name, + diameter: meteor.estimated_diameter.meters, + is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, + close_approach_data: meteor.close_approach_data.map(data => ({ + close_approach_date_full: data.close_approach_date_full, + kilometers_per_second: data.relative_velocity.kilometers_per_second + })) + })); + + res.send(adaptedMeteors) }) diff --git a/nasa/nasa.client.js b/nasa/nasa.client.js index a217a80..2e9c20f 100644 --- a/nasa/nasa.client.js +++ b/nasa/nasa.client.js @@ -1,16 +1,14 @@ const https = require('https') -const options = require('./nasa.options.js') +const axios = require('axios') +const { meteors_path, options } = require('./nasa.options.js') -function getMeteors(){ - return 'qwer'; -} -const feed = (()=>{ +const feed = (() => { const req = https.request(options, (res) => { console.log('statusCode:', res.statusCode); console.log('headers:', res.headers); - + let rawData = ''; res.on('data', (chunk) => { rawData += chunk; }); @@ -31,4 +29,20 @@ const feed = (()=>{ req.end(); }); -module.exports = { feed, getMeteors} \ No newline at end of file +async function getMeteors(params) { + try { + const response = await axios.get(meteors_path); + return response; + } catch (error) { + if (error.response) { + console.error(error.response.satus + ": " + error.response.data) + } else if (error.request) { + + console.error(error.request.satus + ": " + error.request.data) + } else { + console.error(error.message) + } + } +} + +module.exports = { feed, getMeteors } \ No newline at end of file diff --git a/nasa/nasa.options.js b/nasa/nasa.options.js index 1a8c438..1b2557e 100644 --- a/nasa/nasa.options.js +++ b/nasa/nasa.options.js @@ -12,4 +12,6 @@ const options = { method: 'GET' }; - module.exports = options \ No newline at end of file + const meteors_path = "https://" + options.hostname + feed_path; + + module.exports = { meteors_path, options } \ No newline at end of file From c4e85af4891686358585caf646d3ca1072ec3b51 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Mon, 14 Oct 2024 15:18:10 +0200 Subject: [PATCH 05/17] temp --- .gitignore | 3 ++- delivery/meteor.js | 9 +++++++++ delivery/meteors.logic.js | 26 ++++++++++++++++++++++++++ index.js | 30 +----------------------------- 4 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 delivery/meteor.js create mode 100644 delivery/meteors.logic.js diff --git a/.gitignore b/.gitignore index 2861fd6..a8985d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode env .env -node_modules \ No newline at end of file +node_modules +.idea \ No newline at end of file diff --git a/delivery/meteor.js b/delivery/meteor.js new file mode 100644 index 0000000..4ace867 --- /dev/null +++ b/delivery/meteor.js @@ -0,0 +1,9 @@ +const express = require("express"); +const meteorsCallback = require('./meteors.logic.js') +const app = express(); + +app.listen(8000, ()=> { + console.log("Server started, port: 8000") +}) + +app.get('/meteors', (req, res) => meteorsCallback) \ No newline at end of file diff --git a/delivery/meteors.logic.js b/delivery/meteors.logic.js new file mode 100644 index 0000000..c6e7d02 --- /dev/null +++ b/delivery/meteors.logic.js @@ -0,0 +1,26 @@ + +const nasa = require('../nasa/nasa.client.js') + +function meteorsCallback() { + return async (req, res) => { + let meteors = await nasa.getMeteors(); + console.log(meteors) + const meteorData = meteors.data.near_earth_objects; + const allMeteors = Object.values(meteorData).flat(); + if (!Array.isArray(allMeteors)) { + res.send("meteors are not array") + } + const adaptedMeteors = allMeteors.map(meteor => ({ + id: meteor.id, + name: meteor.name, + diameter: meteor.estimated_diameter.meters, + is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, + close_approach_data: meteor.close_approach_data.map(data => ({ + close_approach_date_full: data.close_approach_date_full, + kilometers_per_second: data.relative_velocity.kilometers_per_second + })) + })); + + res.send(adaptedMeteors) + }; +} \ No newline at end of file diff --git a/index.js b/index.js index d0f6728..cfb5287 100644 --- a/index.js +++ b/index.js @@ -1,30 +1,2 @@ -const express = require("express") +const meteor = require('./delivery/meteor.js') -const nasa = require('./nasa/nasa.client.js') -const app = express(); - -app.listen(8000, ()=> { - console.log("Server started, port: 8000") -}) - -app.get('/meteors', async (req, res) => { - let meteors = await nasa.getMeteors(); - console.log(meteors) - const meteorData = meteors.data.near_earth_objects; - const allMeteors = Object.values(meteorData).flat(); - if(!Array.isArray(allMeteors)){ - res.send("meteors are not array") - } - const adaptedMeteors = allMeteors.map(meteor => ({ - id: meteor.id, - name: meteor.name, - diameter: meteor.estimated_diameter.meters, - is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, - close_approach_data: meteor.close_approach_data.map(data => ({ - close_approach_date_full: data.close_approach_date_full, - kilometers_per_second: data.relative_velocity.kilometers_per_second - })) - })); - - res.send(adaptedMeteors) -}) From fa0c65b738ff7f56f3e9cc830b1a2cb2762eeb0f Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Mon, 14 Oct 2024 15:27:40 +0200 Subject: [PATCH 06/17] split to adapter & callback --- delivery/meteor.js | 3 ++- delivery/meteors.logic.js | 44 +++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/delivery/meteor.js b/delivery/meteor.js index 4ace867..db2cc00 100644 --- a/delivery/meteor.js +++ b/delivery/meteor.js @@ -1,9 +1,10 @@ const express = require("express"); const meteorsCallback = require('./meteors.logic.js') +const {response} = require("express"); const app = express(); app.listen(8000, ()=> { console.log("Server started, port: 8000") }) -app.get('/meteors', (req, res) => meteorsCallback) \ No newline at end of file +app.get('/meteors', meteorsCallback) \ No newline at end of file diff --git a/delivery/meteors.logic.js b/delivery/meteors.logic.js index c6e7d02..eec4bdd 100644 --- a/delivery/meteors.logic.js +++ b/delivery/meteors.logic.js @@ -1,26 +1,26 @@ const nasa = require('../nasa/nasa.client.js') -function meteorsCallback() { - return async (req, res) => { - let meteors = await nasa.getMeteors(); - console.log(meteors) - const meteorData = meteors.data.near_earth_objects; - const allMeteors = Object.values(meteorData).flat(); - if (!Array.isArray(allMeteors)) { - res.send("meteors are not array") - } - const adaptedMeteors = allMeteors.map(meteor => ({ - id: meteor.id, - name: meteor.name, - diameter: meteor.estimated_diameter.meters, - is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, - close_approach_data: meteor.close_approach_data.map(data => ({ - close_approach_date_full: data.close_approach_date_full, - kilometers_per_second: data.relative_velocity.kilometers_per_second - })) - })); +function modify(meteors) { + const meteorData = meteors.data.near_earth_objects; + const allMeteors = Object.values(meteorData).flat(); + const adaptedMeteors = allMeteors.map(meteor => ({ + id: meteor.id, + name: meteor.name, + diameter: meteor.estimated_diameter.meters, + is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, + close_approach_data: meteor.close_approach_data.map(data => ({ + close_approach_date_full: data.close_approach_date_full, + kilometers_per_second: data.relative_velocity.kilometers_per_second + })) + })); + return adaptedMeteors; +} - res.send(adaptedMeteors) - }; -} \ No newline at end of file +const meteorsCallback = async (request, response) => { + let meteors = await nasa.getMeteors(); + let adaptedMeteors = modify(meteors) + response.send(adaptedMeteors); +}; + +module.exports = meteorsCallback \ No newline at end of file From e71c87290c5a582779c236f2e0592dc83aef7f3b Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Mon, 14 Oct 2024 15:37:23 +0200 Subject: [PATCH 07/17] moved --- delivery/meteor.js => Delivery/meteor.router.js | 4 ++-- .../meteors.logic.js => UseCases/meteor.mapper.js | 13 +++---------- UseCases/meteors.logic.js | 10 ++++++++++ index.js | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) rename delivery/meteor.js => Delivery/meteor.router.js (64%) rename delivery/meteors.logic.js => UseCases/meteor.mapper.js (71%) create mode 100644 UseCases/meteors.logic.js diff --git a/delivery/meteor.js b/Delivery/meteor.router.js similarity index 64% rename from delivery/meteor.js rename to Delivery/meteor.router.js index db2cc00..0ac900e 100644 --- a/delivery/meteor.js +++ b/Delivery/meteor.router.js @@ -1,8 +1,8 @@ const express = require("express"); -const meteorsCallback = require('./meteors.logic.js') -const {response} = require("express"); const app = express(); +const meteorsCallback = require('../UseCases/meteors.logic.js') + app.listen(8000, ()=> { console.log("Server started, port: 8000") }) diff --git a/delivery/meteors.logic.js b/UseCases/meteor.mapper.js similarity index 71% rename from delivery/meteors.logic.js rename to UseCases/meteor.mapper.js index eec4bdd..68758d8 100644 --- a/delivery/meteors.logic.js +++ b/UseCases/meteor.mapper.js @@ -1,9 +1,7 @@ - -const nasa = require('../nasa/nasa.client.js') - function modify(meteors) { const meteorData = meteors.data.near_earth_objects; const allMeteors = Object.values(meteorData).flat(); + const adaptedMeteors = allMeteors.map(meteor => ({ id: meteor.id, name: meteor.name, @@ -14,13 +12,8 @@ function modify(meteors) { kilometers_per_second: data.relative_velocity.kilometers_per_second })) })); + return adaptedMeteors; } -const meteorsCallback = async (request, response) => { - let meteors = await nasa.getMeteors(); - let adaptedMeteors = modify(meteors) - response.send(adaptedMeteors); -}; - -module.exports = meteorsCallback \ No newline at end of file +module.exports = modify \ No newline at end of file diff --git a/UseCases/meteors.logic.js b/UseCases/meteors.logic.js new file mode 100644 index 0000000..fa0c4a1 --- /dev/null +++ b/UseCases/meteors.logic.js @@ -0,0 +1,10 @@ +const nasa = require('../nasa/nasa.client.js') +const mapper = require('./meteor.mapper.js') + +const meteorsCallback = async (request, response) => { + let meteors = await nasa.getMeteors(); + let adaptedMeteors = mapper(meteors) + response.send(adaptedMeteors); +}; + +module.exports = meteorsCallback \ No newline at end of file diff --git a/index.js b/index.js index cfb5287..c35b598 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,2 @@ -const meteor = require('./delivery/meteor.js') +const meteor = require('./Delivery/meteor.router.js') From 765ff185dfd704b3318643185c586b1b402484da Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Tue, 15 Oct 2024 14:36:19 +0200 Subject: [PATCH 08/17] task-9: Add date as a parameter to the query --- UseCases/meteor.mapper.js | 1 + UseCases/meteors.logic.js | 2 +- api.http | 1 + nasa/nasa.client.js | 11 ++++++++--- nasa/nasa.options.js | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 api.http diff --git a/UseCases/meteor.mapper.js b/UseCases/meteor.mapper.js index 68758d8..56a2e10 100644 --- a/UseCases/meteor.mapper.js +++ b/UseCases/meteor.mapper.js @@ -1,4 +1,5 @@ function modify(meteors) { + console.log(meteors) const meteorData = meteors.data.near_earth_objects; const allMeteors = Object.values(meteorData).flat(); diff --git a/UseCases/meteors.logic.js b/UseCases/meteors.logic.js index fa0c4a1..4a3438f 100644 --- a/UseCases/meteors.logic.js +++ b/UseCases/meteors.logic.js @@ -2,7 +2,7 @@ const nasa = require('../nasa/nasa.client.js') const mapper = require('./meteor.mapper.js') const meteorsCallback = async (request, response) => { - let meteors = await nasa.getMeteors(); + let meteors = await nasa.getMeteors(request.query.start_date, request.query.end_date); let adaptedMeteors = mapper(meteors) response.send(adaptedMeteors); }; diff --git a/api.http b/api.http new file mode 100644 index 0000000..4f0494c --- /dev/null +++ b/api.http @@ -0,0 +1 @@ +GET http://localhost:8000/meteors?start_date=2015-09-07&end_date=2015-09-09 \ No newline at end of file diff --git a/nasa/nasa.client.js b/nasa/nasa.client.js index 2e9c20f..0b1b9d8 100644 --- a/nasa/nasa.client.js +++ b/nasa/nasa.client.js @@ -1,5 +1,7 @@ const https = require('https') const axios = require('axios') +const {URL} = require('url') + const { meteors_path, options } = require('./nasa.options.js') @@ -29,10 +31,13 @@ const feed = (() => { req.end(); }); -async function getMeteors(params) { +async function getMeteors(startDate, endDate) { try { - const response = await axios.get(meteors_path); - return response; + meteors_url = new URL(meteors_path); + meteors_url.searchParams.append('start_date', startDate); + meteors_url.searchParams.append('end_date', endDate); + + return await axios.get(meteors_url.toString()); } catch (error) { if (error.response) { console.error(error.response.satus + ": " + error.response.data) diff --git a/nasa/nasa.options.js b/nasa/nasa.options.js index 1b2557e..8d1fa76 100644 --- a/nasa/nasa.options.js +++ b/nasa/nasa.options.js @@ -2,7 +2,7 @@ process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; const api_key = process.env.nasa_api_key -const feed_path = `/neo/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&api_key=${api_key}`; +const feed_path = `/neo/rest/v1/feed?api_key=${api_key}`; console.log(feed_path) const options = { From 310893fa24662993be7e43705c89abd7b254371e Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Wed, 16 Oct 2024 10:45:17 +0200 Subject: [PATCH 09/17] task-9: Add count and adngerous as a parameter to the query --- UseCases/meteor.mapper.js | 13 ++++++- UseCases/meteors.logic.js | 29 ++++++++++++-- nasa/nasa.client.js | 82 +++++++++++++++++++++------------------ 3 files changed, 81 insertions(+), 43 deletions(-) diff --git a/UseCases/meteor.mapper.js b/UseCases/meteor.mapper.js index 56a2e10..76a47d9 100644 --- a/UseCases/meteor.mapper.js +++ b/UseCases/meteor.mapper.js @@ -1,7 +1,16 @@ -function modify(meteors) { +function modify(meteors, query) { console.log(meteors) const meteorData = meteors.data.near_earth_objects; - const allMeteors = Object.values(meteorData).flat(); + var allMeteors = Object.values(meteorData).flat(); + + var dangerous = query.dangerous; + if (dangerous === 'true') { + allMeteors = allMeteors.filter((meteor) => meteor.is_potentially_hazardous_asteroid) + } else if (dangerous === 'false') { + allMeteors = allMeteors.filter((meteor) => !meteor.is_potentially_hazardous_asteroid) + } + + allMeteors = query.count ? allMeteors.slice(0, query.count) : allMeteors; const adaptedMeteors = allMeteors.map(meteor => ({ id: meteor.id, diff --git a/UseCases/meteors.logic.js b/UseCases/meteors.logic.js index 4a3438f..133658e 100644 --- a/UseCases/meteors.logic.js +++ b/UseCases/meteors.logic.js @@ -1,10 +1,33 @@ const nasa = require('../nasa/nasa.client.js') const mapper = require('./meteor.mapper.js') + const meteorsCallback = async (request, response) => { - let meteors = await nasa.getMeteors(request.query.start_date, request.query.end_date); - let adaptedMeteors = mapper(meteors) - response.send(adaptedMeteors); + + try { + let meteors = await nasa.getMeteors( + getStartDateOrDefault(request.query.start_date), + getEndDateOrDefault(request.query.end_date) + ); + let adaptedMeteors = mapper(meteors, request.query) + response.send(adaptedMeteors); + } catch (error) { + throw new Error('Error getting data from NASA: ' + error); + } }; +function getStartDateOrDefault(startDate) { + return startDate || new Date().toISOString().split('T')[0]; +} + +function getEndDateOrDefault(endDate) { + + if (endDate) { + return endDate + } + var date = new Date(); + date.setDate(date.getDate() - 1); + return date.toISOString().split('T')[0]; +} + module.exports = meteorsCallback \ No newline at end of file diff --git a/nasa/nasa.client.js b/nasa/nasa.client.js index 0b1b9d8..ef9aaaf 100644 --- a/nasa/nasa.client.js +++ b/nasa/nasa.client.js @@ -2,52 +2,58 @@ const https = require('https') const axios = require('axios') const {URL} = require('url') -const { meteors_path, options } = require('./nasa.options.js') +const {meteors_path, options} = require('./nasa.options.js') const feed = (() => { - const req = https.request(options, (res) => { - - console.log('statusCode:', res.statusCode); - console.log('headers:', res.headers); - - let rawData = ''; - res.on('data', (chunk) => { rawData += chunk; }); - - res.on('end', () => { - try { - const parsedData = JSON.parse(rawData); - console.log(parsedData); - } catch (e) { - console.error(e.message); - } + const req = https.request(options, (res) => { + + console.log('statusCode:', res.statusCode); + console.log('headers:', res.headers); + + let rawData = ''; + res.on('data', (chunk) => { + rawData += chunk; + }); + + res.on('end', () => { + try { + const parsedData = JSON.parse(rawData); + console.log(parsedData); + } catch (e) { + console.error(e.message); + } + }); + return rawData; + }); + req.on('error', (e) => { + console.error(e); }); - return rawData; - }); - req.on('error', (e) => { - console.error(e); - }); - req.end(); + req.end(); }); + + async function getMeteors(startDate, endDate) { - try { - meteors_url = new URL(meteors_path); - meteors_url.searchParams.append('start_date', startDate); - meteors_url.searchParams.append('end_date', endDate); - - return await axios.get(meteors_url.toString()); - } catch (error) { - if (error.response) { - console.error(error.response.satus + ": " + error.response.data) - } else if (error.request) { - - console.error(error.request.satus + ": " + error.request.data) - } else { - console.error(error.message) + try { + meteors_url = new URL(meteors_path); + meteors_url.searchParams.append('start_date', startDate); + meteors_url.searchParams.append('end_date', endDate); + + var axiosResponse = await axios.get(meteors_url.toString()); + console.log(axiosResponse) + return axiosResponse; + } catch (error) { + if (error.response) { + console.error(error.response.satus + ": " + error.response.data) + } else if (error.request) { + + console.error(error.request.satus + ": " + error.request.data) + } else { + console.error(error.message) + } } - } } -module.exports = { feed, getMeteors } \ No newline at end of file +module.exports = {feed, getMeteors} \ No newline at end of file From e2b0d3e169244e36a22f1f1b03e24f415e9a7fb7 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Wed, 16 Oct 2024 11:53:47 +0200 Subject: [PATCH 10/17] task-10: add nunjacks --- Delivery/meteor.router.js | 10 -------- Delivery/meteorRoutes.js | 17 +++++++++++++ UseCases/meteorController.js | 49 ++++++++++++++++++++++++++++++++++++ UseCases/meteors.logic.js | 33 ------------------------ index.js | 2 +- package-lock.json | 49 +++++++++++++++++++++++++++++++++++- package.json | 3 ++- template/meteors.njk | 0 8 files changed, 117 insertions(+), 46 deletions(-) delete mode 100644 Delivery/meteor.router.js create mode 100644 Delivery/meteorRoutes.js create mode 100644 UseCases/meteorController.js delete mode 100644 UseCases/meteors.logic.js create mode 100644 template/meteors.njk diff --git a/Delivery/meteor.router.js b/Delivery/meteor.router.js deleted file mode 100644 index 0ac900e..0000000 --- a/Delivery/meteor.router.js +++ /dev/null @@ -1,10 +0,0 @@ -const express = require("express"); -const app = express(); - -const meteorsCallback = require('../UseCases/meteors.logic.js') - -app.listen(8000, ()=> { - console.log("Server started, port: 8000") -}) - -app.get('/meteors', meteorsCallback) \ No newline at end of file diff --git a/Delivery/meteorRoutes.js b/Delivery/meteorRoutes.js new file mode 100644 index 0000000..1560088 --- /dev/null +++ b/Delivery/meteorRoutes.js @@ -0,0 +1,17 @@ +const express = require("express"); +const app = express(); +const meteorController = require('../UseCases/meteorController.js') + +const nunjucks = require('nunjucks') + +nunjucks.configure('views', { + autoescape: true, + express: app +}) +app.set('view engine', 'njk') + +app.listen(8000, ()=> { + console.log("Server started, port: 8000") +}) + +app.get('/meteors', meteorController.getMeteors); \ No newline at end of file diff --git a/UseCases/meteorController.js b/UseCases/meteorController.js new file mode 100644 index 0000000..60527e1 --- /dev/null +++ b/UseCases/meteorController.js @@ -0,0 +1,49 @@ +const nasa = require('../nasa/nasa.client.js') +const mapper = require('./meteor.mapper.js') + +async function getMeteorsObjects(request) { + var startDateOrDefault = getStartDateOrDefault(request.query.start_date); + var endDateOrDefault = getEndDateOrDefault(request.query.end_date, startDateOrDefault); + + let meteors = await nasa.getMeteors( + startDateOrDefault, + endDateOrDefault + ); + + let adaptedMeteors = mapper(meteors, request.query) + return adaptedMeteors; +} + +const getMeteors = async (request, response) => { + try { + let meteors = await getMeteorsObjects(request); + response.send(meteors); + } catch (error) { + throw new Error('Error getting data from NASA: ' + error); + } +}; + +const getMeteorsView = async (request, response) => { + try { + var meteors = getMeteorsObjects(request); + } catch (error) { + throw new Error('Error getting data from NASA: ' + error); + } +}; + + +function getStartDateOrDefault(startDate) { + return startDate || new Date().toISOString().split('T')[0]; +} + +function getEndDateOrDefault(endDate, startDate) { + + if (endDate) { + return endDate + } + var date = new Date(); + date.setDate(date.getDate() - 1); + return date.toISOString().split('T')[0]; +} + +module.exports = getMeteors \ No newline at end of file diff --git a/UseCases/meteors.logic.js b/UseCases/meteors.logic.js deleted file mode 100644 index 133658e..0000000 --- a/UseCases/meteors.logic.js +++ /dev/null @@ -1,33 +0,0 @@ -const nasa = require('../nasa/nasa.client.js') -const mapper = require('./meteor.mapper.js') - - -const meteorsCallback = async (request, response) => { - - try { - let meteors = await nasa.getMeteors( - getStartDateOrDefault(request.query.start_date), - getEndDateOrDefault(request.query.end_date) - ); - let adaptedMeteors = mapper(meteors, request.query) - response.send(adaptedMeteors); - } catch (error) { - throw new Error('Error getting data from NASA: ' + error); - } -}; - -function getStartDateOrDefault(startDate) { - return startDate || new Date().toISOString().split('T')[0]; -} - -function getEndDateOrDefault(endDate) { - - if (endDate) { - return endDate - } - var date = new Date(); - date.setDate(date.getDate() - 1); - return date.toISOString().split('T')[0]; -} - -module.exports = meteorsCallback \ No newline at end of file diff --git a/index.js b/index.js index c35b598..c64c210 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,2 @@ -const meteor = require('./Delivery/meteor.router.js') +const meteor = require('./Delivery/meteorRoutes.js') diff --git a/package-lock.json b/package-lock.json index d9ca358..2c7b475 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,16 @@ "license": "ISC", "dependencies": { "axios": "^1.7.7", - "express": "^4.21.1" + "express": "^4.21.1", + "nunjucks": "^3.2.4" } }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -32,6 +39,12 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -113,6 +126,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -572,6 +594,31 @@ "node": ">= 0.6" } }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", diff --git a/package.json b/package.json index 97e9dbe..cb68e4a 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/AntonHrbnts/node-proxy-server#readme", "dependencies": { "axios": "^1.7.7", - "express": "^4.21.1" + "express": "^4.21.1", + "nunjucks": "^3.2.4" } } diff --git a/template/meteors.njk b/template/meteors.njk new file mode 100644 index 0000000..e69de29 From 8253e98135049599f5c11932557a1e12d089c4a9 Mon Sep 17 00:00:00 2001 From: Anton <168634637+AntonHrbnts@users.noreply.github.com> Date: Wed, 16 Oct 2024 11:56:20 +0200 Subject: [PATCH 11/17] Update meteors.njk --- template/meteors.njk | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/template/meteors.njk b/template/meteors.njk index e69de29..6f96d0d 100644 --- a/template/meteors.njk +++ b/template/meteors.njk @@ -0,0 +1,21 @@ + + + + + + + Meteor Data + + +

Meteor Data

+
    + {% for meteor in meteors %} +
  • + Name: {{ meteor.name }}
    + ID: {{ meteor.id }}
    + Potentially Hazardous: {{ meteor.is_potentially_hazardous_asteroid ? 'Yes' : 'No' }} +
  • + {% endfor %} +
+ + From 34315f9cd3aeb602eba60945bfb35d2f248dc654 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Wed, 16 Oct 2024 12:20:08 +0200 Subject: [PATCH 12/17] task-10: meteorsView --- Delivery/meteorRoutes.js | 9 +++++-- UseCases/meteorController.js | 13 ++------- {template => templates}/meteors.njk | 42 ++++++++++++++--------------- 3 files changed, 30 insertions(+), 34 deletions(-) rename {template => templates}/meteors.njk (78%) diff --git a/Delivery/meteorRoutes.js b/Delivery/meteorRoutes.js index 1560088..cbb9881 100644 --- a/Delivery/meteorRoutes.js +++ b/Delivery/meteorRoutes.js @@ -4,7 +4,7 @@ const meteorController = require('../UseCases/meteorController.js') const nunjucks = require('nunjucks') -nunjucks.configure('views', { +nunjucks.configure('templates', { autoescape: true, express: app }) @@ -14,4 +14,9 @@ app.listen(8000, ()=> { console.log("Server started, port: 8000") }) -app.get('/meteors', meteorController.getMeteors); \ No newline at end of file +app.get('/meteors', meteorController.getMeteors); +app.get('/meteorsView', async (req, res) => { + const meteors = await meteorController.getMeteorsObjects(req,res); + console.log('meteorsView data: ' + meteors); + res.render('meteors.njk', {meteors}) +}); \ No newline at end of file diff --git a/UseCases/meteorController.js b/UseCases/meteorController.js index 60527e1..198301a 100644 --- a/UseCases/meteorController.js +++ b/UseCases/meteorController.js @@ -1,7 +1,7 @@ const nasa = require('../nasa/nasa.client.js') const mapper = require('./meteor.mapper.js') -async function getMeteorsObjects(request) { +const getMeteorsObjects = async function (request) { var startDateOrDefault = getStartDateOrDefault(request.query.start_date); var endDateOrDefault = getEndDateOrDefault(request.query.end_date, startDateOrDefault); @@ -23,15 +23,6 @@ const getMeteors = async (request, response) => { } }; -const getMeteorsView = async (request, response) => { - try { - var meteors = getMeteorsObjects(request); - } catch (error) { - throw new Error('Error getting data from NASA: ' + error); - } -}; - - function getStartDateOrDefault(startDate) { return startDate || new Date().toISOString().split('T')[0]; } @@ -46,4 +37,4 @@ function getEndDateOrDefault(endDate, startDate) { return date.toISOString().split('T')[0]; } -module.exports = getMeteors \ No newline at end of file +module.exports = { getMeteors, getMeteorsObjects} \ No newline at end of file diff --git a/template/meteors.njk b/templates/meteors.njk similarity index 78% rename from template/meteors.njk rename to templates/meteors.njk index 6f96d0d..d1172ac 100644 --- a/template/meteors.njk +++ b/templates/meteors.njk @@ -1,21 +1,21 @@ - - - - - - - Meteor Data - - -

Meteor Data

-
    - {% for meteor in meteors %} -
  • - Name: {{ meteor.name }}
    - ID: {{ meteor.id }}
    - Potentially Hazardous: {{ meteor.is_potentially_hazardous_asteroid ? 'Yes' : 'No' }} -
  • - {% endfor %} -
- - + + + + + + + Meteor Data + + +

Meteor Data

+
    + {% for meteor in meteors %} +
  • + Name: {{ meteor.name }}
    + ID: {{ meteor.id }}
    + dangerous: {{ meteor.is_potentially_hazardous_asteroid }}
    +
  • + {% endfor %} +
+ + From 170f0acab1a35551d917e092e23080d1827de803 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Wed, 16 Oct 2024 14:23:43 +0200 Subject: [PATCH 13/17] task-10: meteorsView --- Delivery/meteorRoutes.js | 16 +++-- .../{meteor.mapper.js => meteorAdaptor.js} | 29 ++++++-- UseCases/meteorController.js | 41 ++++++------ api.http | 13 +++- nasa/{nasa.client.js => nasaClient.js} | 66 ++++++++++++------- nasa/{nasa.options.js => nasaOptions.js} | 0 utils/dateUtils.js | 14 ++++ 7 files changed, 119 insertions(+), 60 deletions(-) rename UseCases/{meteor.mapper.js => meteorAdaptor.js} (54%) rename nasa/{nasa.client.js => nasaClient.js} (64%) rename nasa/{nasa.options.js => nasaOptions.js} (100%) create mode 100644 utils/dateUtils.js diff --git a/Delivery/meteorRoutes.js b/Delivery/meteorRoutes.js index cbb9881..ee74f1b 100644 --- a/Delivery/meteorRoutes.js +++ b/Delivery/meteorRoutes.js @@ -9,14 +9,20 @@ nunjucks.configure('templates', { express: app }) app.set('view engine', 'njk') +app.use(express.json()) app.listen(8000, ()=> { console.log("Server started, port: 8000") }) app.get('/meteors', meteorController.getMeteors); -app.get('/meteorsView', async (req, res) => { - const meteors = await meteorController.getMeteorsObjects(req,res); - console.log('meteorsView data: ' + meteors); - res.render('meteors.njk', {meteors}) -}); \ No newline at end of file +app.get('/meteorsView', meteorsView()); +app.post('/picture', meteorController.postPicture) + +function meteorsView() { + return async (req, res) => { + const meteors = await meteorController.getMeteorsObjects(req, res); + console.log('meteorsView data: ' + meteors); + res.render('meteors.njk', {meteors}) + }; +} \ No newline at end of file diff --git a/UseCases/meteor.mapper.js b/UseCases/meteorAdaptor.js similarity index 54% rename from UseCases/meteor.mapper.js rename to UseCases/meteorAdaptor.js index 76a47d9..28bb1a3 100644 --- a/UseCases/meteor.mapper.js +++ b/UseCases/meteorAdaptor.js @@ -1,18 +1,34 @@ -function modify(meteors, query) { - console.log(meteors) - const meteorData = meteors.data.near_earth_objects; +function modify(meteorsResponse, query) { + console.log(meteorsResponse) + var allMeteors = extractMeteors(meteorsResponse); + + allMeteors = filterDangerousMeteors(query, allMeteors); + allMeteors = sliceMeteors(query, allMeteors); + return toMeteorsModel(allMeteors); +} + +function extractMeteors(meteorsResponse) { + const meteorData = meteorsResponse.data.near_earth_objects; var allMeteors = Object.values(meteorData).flat(); + return allMeteors; +} +function filterDangerousMeteors(query, allMeteors) { var dangerous = query.dangerous; if (dangerous === 'true') { allMeteors = allMeteors.filter((meteor) => meteor.is_potentially_hazardous_asteroid) } else if (dangerous === 'false') { allMeteors = allMeteors.filter((meteor) => !meteor.is_potentially_hazardous_asteroid) } + return allMeteors; +} - allMeteors = query.count ? allMeteors.slice(0, query.count) : allMeteors; +function sliceMeteors(query, allMeteors) { + return query.count ? allMeteors.slice(0, query.count) : allMeteors; +} - const adaptedMeteors = allMeteors.map(meteor => ({ +function toMeteorsModel(allMeteors) { + return allMeteors.map(meteor => ({ id: meteor.id, name: meteor.name, diameter: meteor.estimated_diameter.meters, @@ -22,8 +38,7 @@ function modify(meteors, query) { kilometers_per_second: data.relative_velocity.kilometers_per_second })) })); - - return adaptedMeteors; } + module.exports = modify \ No newline at end of file diff --git a/UseCases/meteorController.js b/UseCases/meteorController.js index 198301a..0e802b4 100644 --- a/UseCases/meteorController.js +++ b/UseCases/meteorController.js @@ -1,40 +1,37 @@ -const nasa = require('../nasa/nasa.client.js') -const mapper = require('./meteor.mapper.js') +const nasa = require('../nasa/nasaClient.js') +const adapt = require('./meteorAdaptor.js') +const dateUtils = require('../utils/dateUtils.js') -const getMeteorsObjects = async function (request) { - var startDateOrDefault = getStartDateOrDefault(request.query.start_date); - var endDateOrDefault = getEndDateOrDefault(request.query.end_date, startDateOrDefault); +exports.getMeteorsObjects = async function (request) { + const startDateOrDefault = dateUtils.getStartDateOrDefault(request.query.start_date); + const endDateOrDefault = dateUtils.getEndDateOrDefault(request.query.end_date, startDateOrDefault); let meteors = await nasa.getMeteors( startDateOrDefault, endDateOrDefault ); - - let adaptedMeteors = mapper(meteors, request.query) - return adaptedMeteors; + return adapt(meteors, request.query) } -const getMeteors = async (request, response) => { +exports.getMeteors = async (request, response) => { try { - let meteors = await getMeteorsObjects(request); + let meteors = await this.getMeteorsObjects(request); response.send(meteors); } catch (error) { throw new Error('Error getting data from NASA: ' + error); } }; -function getStartDateOrDefault(startDate) { - return startDate || new Date().toISOString().split('T')[0]; -} +exports.postPicture = async (request, response) => { + try { + const {userId, userName, API_KEY} = request.body -function getEndDateOrDefault(endDate, startDate) { + console.log('userId:' + userId) + console.log('userName:' + userName) - if (endDate) { - return endDate + let image = await nasa.getMostRecentImage(API_KEY); + response.send(image); + } catch (error) { + throw new Error('Error getting data from NASA: ' + error); } - var date = new Date(); - date.setDate(date.getDate() - 1); - return date.toISOString().split('T')[0]; -} - -module.exports = { getMeteors, getMeteorsObjects} \ No newline at end of file +}; \ No newline at end of file diff --git a/api.http b/api.http index 4f0494c..dc4c120 100644 --- a/api.http +++ b/api.http @@ -1 +1,12 @@ -GET http://localhost:8000/meteors?start_date=2015-09-07&end_date=2015-09-09 \ No newline at end of file +GET http://localhost:8000/meteors?start_date=2015-09-07&end_date=2015-09-09 +### +GET http://localhost:8000/meteorsView?start_date=2000-01-01&end_date=2000-01-03&dangerous=false +### +POST http://localhost:8000/picture?API_KEY=DEMO_KEY +Content-Type: application/json + +{ + "userId": 10, + "userName": "pppp", + "API_KEY": "DEMO_KEY" +} \ No newline at end of file diff --git a/nasa/nasa.client.js b/nasa/nasaClient.js similarity index 64% rename from nasa/nasa.client.js rename to nasa/nasaClient.js index ef9aaaf..6190e53 100644 --- a/nasa/nasa.client.js +++ b/nasa/nasaClient.js @@ -2,8 +2,47 @@ const https = require('https') const axios = require('axios') const {URL} = require('url') -const {meteors_path, options} = require('./nasa.options.js') +const {meteors_path, options} = require('./nasaOptions.js') +async function getMeteors(startDate, endDate) { + try { + meteors_url = new URL(meteors_path); + meteors_url.searchParams.append('start_date', startDate); + meteors_url.searchParams.append('end_date', endDate); + + var axiosResponse = await axios.get(meteors_url.toString()); + console.log(axiosResponse) + return axiosResponse; + } catch (error) { + if (error.response) { + console.error(error.response.satus + ": " + error.response.data) + } else if (error.request) { + console.error(error.request.satus + ": " + error.request.data) + } else { + console.error(error.message) + } + } +} + +async function getMostRecentImages(API_KEY) { + const imageUri = new URL('https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/latest_photos') + imageUri.searchParams.append('api_key', API_KEY) + try { + const response = await axios.get(imageUri); + return response.data.latest_photos; + } catch (error) { + console.error('Error getting recent images: ' + error) + } + return null; +} + +const getMostRecentImage = async function (API_KEY) { + const mostRecentImages = await getMostRecentImages(API_KEY); + if (mostRecentImages.length > 0) { + return mostRecentImages[mostRecentImages.length - 1]; + } + return null; +} const feed = (() => { const req = https.request(options, (res) => { @@ -33,27 +72,4 @@ const feed = (() => { req.end(); }); - - -async function getMeteors(startDate, endDate) { - try { - meteors_url = new URL(meteors_path); - meteors_url.searchParams.append('start_date', startDate); - meteors_url.searchParams.append('end_date', endDate); - - var axiosResponse = await axios.get(meteors_url.toString()); - console.log(axiosResponse) - return axiosResponse; - } catch (error) { - if (error.response) { - console.error(error.response.satus + ": " + error.response.data) - } else if (error.request) { - - console.error(error.request.satus + ": " + error.request.data) - } else { - console.error(error.message) - } - } -} - -module.exports = {feed, getMeteors} \ No newline at end of file +module.exports = {feed, getMeteors, getMostRecentImage} \ No newline at end of file diff --git a/nasa/nasa.options.js b/nasa/nasaOptions.js similarity index 100% rename from nasa/nasa.options.js rename to nasa/nasaOptions.js diff --git a/utils/dateUtils.js b/utils/dateUtils.js new file mode 100644 index 0000000..3500178 --- /dev/null +++ b/utils/dateUtils.js @@ -0,0 +1,14 @@ +exports.getStartDateOrDefault = function (startDate) { + return startDate || new Date().toISOString().split('T')[0]; +} + +exports.getEndDateOrDefault = function (endDate, startDate) { + + if (endDate) { + return endDate + } + var date = new Date(); + //todo fix bug(if start_date in query and end_date is not present) + date.setDate(startDate || date.getDate() - 1); + return date.toISOString().split('T')[0]; +} \ No newline at end of file From 811cf37a27ecbb74aab57cdbc39b6423eec6425a Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Wed, 16 Oct 2024 14:35:47 +0200 Subject: [PATCH 14/17] task-10: meteorsView --- Delivery/expressInitialization.js | 21 +++++++++++++++++++++ Delivery/meteorRoutes.js | 28 ++++------------------------ UseCases/meteorController.js | 8 ++++++++ 3 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 Delivery/expressInitialization.js diff --git a/Delivery/expressInitialization.js b/Delivery/expressInitialization.js new file mode 100644 index 0000000..dfad1f4 --- /dev/null +++ b/Delivery/expressInitialization.js @@ -0,0 +1,21 @@ +function expressInit() { + const express = require("express"); + const app = express(); + + const nunjucks = require('nunjucks') + + nunjucks.configure('templates', { + autoescape: true, + express: app + }) + + app.set('view engine', 'njk') + app.use(express.json()) + + app.listen(8000, () => { + console.log("Server started, port: 8000") + }) + return app; +} + +module.exports = expressInit; \ No newline at end of file diff --git a/Delivery/meteorRoutes.js b/Delivery/meteorRoutes.js index ee74f1b..048aa24 100644 --- a/Delivery/meteorRoutes.js +++ b/Delivery/meteorRoutes.js @@ -1,28 +1,8 @@ -const express = require("express"); -const app = express(); +const expressInit = require('./expressInitialization.js') const meteorController = require('../UseCases/meteorController.js') -const nunjucks = require('nunjucks') - -nunjucks.configure('templates', { - autoescape: true, - express: app -}) -app.set('view engine', 'njk') -app.use(express.json()) - -app.listen(8000, ()=> { - console.log("Server started, port: 8000") -}) +app = expressInit() app.get('/meteors', meteorController.getMeteors); -app.get('/meteorsView', meteorsView()); -app.post('/picture', meteorController.postPicture) - -function meteorsView() { - return async (req, res) => { - const meteors = await meteorController.getMeteorsObjects(req, res); - console.log('meteorsView data: ' + meteors); - res.render('meteors.njk', {meteors}) - }; -} \ No newline at end of file +app.get('/meteorsView', meteorController.meteorsView); +app.post('/picture', meteorController.postPicture) \ No newline at end of file diff --git a/UseCases/meteorController.js b/UseCases/meteorController.js index 0e802b4..cd5b0ff 100644 --- a/UseCases/meteorController.js +++ b/UseCases/meteorController.js @@ -22,6 +22,14 @@ exports.getMeteors = async (request, response) => { } }; +exports.meteorsView = function () { + return async (req, res) => { + const meteors = await meteorController.getMeteorsObjects(req, res); + console.log('meteorsView data: ' + meteors); + res.render('meteors.njk', {meteors}) + }; +} + exports.postPicture = async (request, response) => { try { const {userId, userName, API_KEY} = request.body From 35de595d2eeb70d72175b07b8bb52832575ea5a2 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Wed, 16 Oct 2024 14:46:39 +0200 Subject: [PATCH 15/17] task-10: meteorsView --- Delivery/expressInitialization.js | 9 ++++++--- config/config.js | 6 ++++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 config/config.js diff --git a/Delivery/expressInitialization.js b/Delivery/expressInitialization.js index dfad1f4..fcfba25 100644 --- a/Delivery/expressInitialization.js +++ b/Delivery/expressInitialization.js @@ -1,10 +1,13 @@ +const config = require("../config/config"); + function expressInit() { + const config = require("../config/config.js"); const express = require("express"); const app = express(); const nunjucks = require('nunjucks') - nunjucks.configure('templates', { + nunjucks.configure(config.template_path, { autoescape: true, express: app }) @@ -12,8 +15,8 @@ function expressInit() { app.set('view engine', 'njk') app.use(express.json()) - app.listen(8000, () => { - console.log("Server started, port: 8000") + app.listen(config.port, () => { + console.log("Server started, port: " + config.port) }) return app; } diff --git a/config/config.js b/config/config.js new file mode 100644 index 0000000..dd214ed --- /dev/null +++ b/config/config.js @@ -0,0 +1,6 @@ +const config = { + port: 8000, + template_path: 'templates' +} + +module.exports = config \ No newline at end of file From 2c80283017a0dd0e726f7674f7e21085a0359d32 Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Thu, 17 Oct 2024 12:23:45 +0200 Subject: [PATCH 16/17] fix --- Delivery/expressInitialization.js | 24 -- Delivery/meteorRoutes.js | 8 - UseCases/meteorAdaptor.js | 44 --- UseCases/meteorController.js | 45 ---- config/config.js | 6 - index.js | 2 - nasa/nasaClient.js | 75 ------ nasa/nasaOptions.js | 17 -- package-lock.json | 400 ++++++++++++++++++++++++++++ package.json | 6 + src/config/config.js | 11 + src/controllers/meteorController.js | 53 ++++ src/index.js | 26 ++ src/repositories/nasaRepository.js | 39 +++ src/services/meteorService.js | 58 ++++ src/utils/booleanUtil.js | 5 + {utils => src/utils}/dateUtils.js | 0 src/utils/errorHandler.js | 10 + src/utils/exception.js | 8 + 19 files changed, 616 insertions(+), 221 deletions(-) delete mode 100644 Delivery/expressInitialization.js delete mode 100644 Delivery/meteorRoutes.js delete mode 100644 UseCases/meteorAdaptor.js delete mode 100644 UseCases/meteorController.js delete mode 100644 config/config.js delete mode 100644 index.js delete mode 100644 nasa/nasaClient.js delete mode 100644 nasa/nasaOptions.js create mode 100644 src/config/config.js create mode 100644 src/controllers/meteorController.js create mode 100644 src/index.js create mode 100644 src/repositories/nasaRepository.js create mode 100644 src/services/meteorService.js create mode 100644 src/utils/booleanUtil.js rename {utils => src/utils}/dateUtils.js (100%) create mode 100644 src/utils/errorHandler.js create mode 100644 src/utils/exception.js diff --git a/Delivery/expressInitialization.js b/Delivery/expressInitialization.js deleted file mode 100644 index fcfba25..0000000 --- a/Delivery/expressInitialization.js +++ /dev/null @@ -1,24 +0,0 @@ -const config = require("../config/config"); - -function expressInit() { - const config = require("../config/config.js"); - const express = require("express"); - const app = express(); - - const nunjucks = require('nunjucks') - - nunjucks.configure(config.template_path, { - autoescape: true, - express: app - }) - - app.set('view engine', 'njk') - app.use(express.json()) - - app.listen(config.port, () => { - console.log("Server started, port: " + config.port) - }) - return app; -} - -module.exports = expressInit; \ No newline at end of file diff --git a/Delivery/meteorRoutes.js b/Delivery/meteorRoutes.js deleted file mode 100644 index 048aa24..0000000 --- a/Delivery/meteorRoutes.js +++ /dev/null @@ -1,8 +0,0 @@ -const expressInit = require('./expressInitialization.js') -const meteorController = require('../UseCases/meteorController.js') - -app = expressInit() - -app.get('/meteors', meteorController.getMeteors); -app.get('/meteorsView', meteorController.meteorsView); -app.post('/picture', meteorController.postPicture) \ No newline at end of file diff --git a/UseCases/meteorAdaptor.js b/UseCases/meteorAdaptor.js deleted file mode 100644 index 28bb1a3..0000000 --- a/UseCases/meteorAdaptor.js +++ /dev/null @@ -1,44 +0,0 @@ -function modify(meteorsResponse, query) { - console.log(meteorsResponse) - var allMeteors = extractMeteors(meteorsResponse); - - allMeteors = filterDangerousMeteors(query, allMeteors); - allMeteors = sliceMeteors(query, allMeteors); - return toMeteorsModel(allMeteors); -} - -function extractMeteors(meteorsResponse) { - const meteorData = meteorsResponse.data.near_earth_objects; - var allMeteors = Object.values(meteorData).flat(); - return allMeteors; -} - -function filterDangerousMeteors(query, allMeteors) { - var dangerous = query.dangerous; - if (dangerous === 'true') { - allMeteors = allMeteors.filter((meteor) => meteor.is_potentially_hazardous_asteroid) - } else if (dangerous === 'false') { - allMeteors = allMeteors.filter((meteor) => !meteor.is_potentially_hazardous_asteroid) - } - return allMeteors; -} - -function sliceMeteors(query, allMeteors) { - return query.count ? allMeteors.slice(0, query.count) : allMeteors; -} - -function toMeteorsModel(allMeteors) { - return allMeteors.map(meteor => ({ - id: meteor.id, - name: meteor.name, - diameter: meteor.estimated_diameter.meters, - is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, - close_approach_data: meteor.close_approach_data.map(data => ({ - close_approach_date_full: data.close_approach_date_full, - kilometers_per_second: data.relative_velocity.kilometers_per_second - })) - })); -} - - -module.exports = modify \ No newline at end of file diff --git a/UseCases/meteorController.js b/UseCases/meteorController.js deleted file mode 100644 index cd5b0ff..0000000 --- a/UseCases/meteorController.js +++ /dev/null @@ -1,45 +0,0 @@ -const nasa = require('../nasa/nasaClient.js') -const adapt = require('./meteorAdaptor.js') -const dateUtils = require('../utils/dateUtils.js') - -exports.getMeteorsObjects = async function (request) { - const startDateOrDefault = dateUtils.getStartDateOrDefault(request.query.start_date); - const endDateOrDefault = dateUtils.getEndDateOrDefault(request.query.end_date, startDateOrDefault); - - let meteors = await nasa.getMeteors( - startDateOrDefault, - endDateOrDefault - ); - return adapt(meteors, request.query) -} - -exports.getMeteors = async (request, response) => { - try { - let meteors = await this.getMeteorsObjects(request); - response.send(meteors); - } catch (error) { - throw new Error('Error getting data from NASA: ' + error); - } -}; - -exports.meteorsView = function () { - return async (req, res) => { - const meteors = await meteorController.getMeteorsObjects(req, res); - console.log('meteorsView data: ' + meteors); - res.render('meteors.njk', {meteors}) - }; -} - -exports.postPicture = async (request, response) => { - try { - const {userId, userName, API_KEY} = request.body - - console.log('userId:' + userId) - console.log('userName:' + userName) - - let image = await nasa.getMostRecentImage(API_KEY); - response.send(image); - } catch (error) { - throw new Error('Error getting data from NASA: ' + error); - } -}; \ No newline at end of file diff --git a/config/config.js b/config/config.js deleted file mode 100644 index dd214ed..0000000 --- a/config/config.js +++ /dev/null @@ -1,6 +0,0 @@ -const config = { - port: 8000, - template_path: 'templates' -} - -module.exports = config \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index c64c210..0000000 --- a/index.js +++ /dev/null @@ -1,2 +0,0 @@ -const meteor = require('./Delivery/meteorRoutes.js') - diff --git a/nasa/nasaClient.js b/nasa/nasaClient.js deleted file mode 100644 index 6190e53..0000000 --- a/nasa/nasaClient.js +++ /dev/null @@ -1,75 +0,0 @@ -const https = require('https') -const axios = require('axios') -const {URL} = require('url') - -const {meteors_path, options} = require('./nasaOptions.js') - -async function getMeteors(startDate, endDate) { - try { - meteors_url = new URL(meteors_path); - meteors_url.searchParams.append('start_date', startDate); - meteors_url.searchParams.append('end_date', endDate); - - var axiosResponse = await axios.get(meteors_url.toString()); - console.log(axiosResponse) - return axiosResponse; - } catch (error) { - if (error.response) { - console.error(error.response.satus + ": " + error.response.data) - } else if (error.request) { - console.error(error.request.satus + ": " + error.request.data) - } else { - console.error(error.message) - } - } -} - -async function getMostRecentImages(API_KEY) { - const imageUri = new URL('https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/latest_photos') - imageUri.searchParams.append('api_key', API_KEY) - try { - const response = await axios.get(imageUri); - return response.data.latest_photos; - } catch (error) { - console.error('Error getting recent images: ' + error) - } - return null; -} - -const getMostRecentImage = async function (API_KEY) { - const mostRecentImages = await getMostRecentImages(API_KEY); - if (mostRecentImages.length > 0) { - return mostRecentImages[mostRecentImages.length - 1]; - } - return null; -} - -const feed = (() => { - const req = https.request(options, (res) => { - - console.log('statusCode:', res.statusCode); - console.log('headers:', res.headers); - - let rawData = ''; - res.on('data', (chunk) => { - rawData += chunk; - }); - - res.on('end', () => { - try { - const parsedData = JSON.parse(rawData); - console.log(parsedData); - } catch (e) { - console.error(e.message); - } - }); - return rawData; - }); - req.on('error', (e) => { - console.error(e); - }); - - req.end(); -}); - -module.exports = {feed, getMeteors, getMostRecentImage} \ No newline at end of file diff --git a/nasa/nasaOptions.js b/nasa/nasaOptions.js deleted file mode 100644 index 8d1fa76..0000000 --- a/nasa/nasaOptions.js +++ /dev/null @@ -1,17 +0,0 @@ -process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; - -const api_key = process.env.nasa_api_key - -const feed_path = `/neo/rest/v1/feed?api_key=${api_key}`; -console.log(feed_path) - -const options = { - hostname: 'api.nasa.gov', - port: 443, - path: feed_path, - method: 'GET' - }; - - const meteors_path = "https://" + options.hostname + feed_path; - - module.exports = { meteors_path, options } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2c7b475..2e06e65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,13 @@ "license": "ISC", "dependencies": { "axios": "^1.7.7", + "date-fns": "^4.1.0", + "dotenv": "^16.4.5", "express": "^4.21.1", "nunjucks": "^3.2.4" + }, + "devDependencies": { + "nodemon": "^3.1.7" } }, "node_modules/a-sync-waterfall": { @@ -33,6 +38,20 @@ "node": ">= 0.6" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -62,6 +81,26 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -86,6 +125,30 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -114,6 +177,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -135,6 +223,13 @@ "node": ">= 6" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -171,6 +266,16 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -225,6 +330,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -318,6 +435,19 @@ "node": ">= 0.10.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -388,6 +518,21 @@ "node": ">= 0.6" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -416,6 +561,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -428,6 +586,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -504,6 +672,13 @@ "node": ">=0.10.0" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -519,6 +694,52 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -579,6 +800,19 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -594,6 +828,70 @@ "node": ">= 0.6" } }, + "node_modules/nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nunjucks": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", @@ -658,6 +956,19 @@ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "license": "MIT" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -677,6 +988,13 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -716,6 +1034,19 @@ "node": ">= 0.8" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -742,6 +1073,19 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -837,6 +1181,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -846,6 +1203,32 @@ "node": ">= 0.8" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -855,6 +1238,16 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -868,6 +1261,13 @@ "node": ">= 0.6" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index cb68e4a..f6da3f5 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "node proxy server", "main": "index.js", "scripts": { + "dev": "nodemon index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -23,7 +24,12 @@ "homepage": "https://github.com/AntonHrbnts/node-proxy-server#readme", "dependencies": { "axios": "^1.7.7", + "date-fns": "^4.1.0", + "dotenv": "^16.4.5", "express": "^4.21.1", "nunjucks": "^3.2.4" + }, + "devDependencies": { + "nodemon": "^3.1.7" } } diff --git a/src/config/config.js b/src/config/config.js new file mode 100644 index 0000000..5b4bf3c --- /dev/null +++ b/src/config/config.js @@ -0,0 +1,11 @@ +process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; +require("dotenv").config(); + +const config = { + port: process.env.PORT, + template_path: "templates", + nasaBaseUrl: process.env.NASA_BASE_URL, + nasaApiKey: process.env.NASA_API_KEY, +}; + +module.exports = config; diff --git a/src/controllers/meteorController.js b/src/controllers/meteorController.js new file mode 100644 index 0000000..e149bf7 --- /dev/null +++ b/src/controllers/meteorController.js @@ -0,0 +1,53 @@ +const { format } = require("date-fns"); +const nasaRepository = require("../repositories/nasaRepository.js"); +const getMeteorsData = require("../services/meteorService.js"); +const stringToBoolean = require("../utils/booleanUtil.js"); + +const getMeteors = async (req, res, next) => { + try { + const date = req.query.date || format(new Date(), "yyyy-MM-dd"); + const count = stringToBoolean(req.query.count); + const wereDangerousMeteors = stringToBoolean( + req.query.wereDangerousMeteors + ); + + const meteors = await getMeteorsData({ date, count, wereDangerousMeteors }); + + res.send(meteors); + } catch (error) { + next(error); + } +}; + +const meteorsView = async (req, res, next) => { + try { + const date = req.query.date || format(new Date(), "yyyy-MM-dd"); + const count = stringToBoolean(req.query.count); + const wereDangerousMeteors = stringToBoolean( + req.query.wereDangerousMeteors + ); + + const meteors = await getMeteorsData({ date, count, wereDangerousMeteors }); + + console.log("meteorsView data: " + meteors); + res.render("meteors.njk", { meteors }); + } catch (error) { + next(error); + } +}; + +const postPicture = async (req, res, next) => { + try { + const { userId, userName } = req.body; + + console.log("userId:" + userId); + console.log("userName:" + userName); + + const image = await nasaRepository.getMostRecentImage(); + res.send(image); + } catch (error) { + next(error); + } +}; + +module.exports = { getMeteors, meteorsView, postPicture }; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..aae1662 --- /dev/null +++ b/src/index.js @@ -0,0 +1,26 @@ +const express = require("express"); +const path = require("path"); +const nunjucks = require("nunjucks"); +const config = require("./config/config.js"); +const meteorController = require("./controllers/meteorController.js"); +const errorHandler = require("./utils/errorHandler.js"); + +const app = express(); + +nunjucks.configure(config.template_path, { + autoescape: true, + express: app, +}); + +app.set("view engine", "njk"); +app.use(express.json()); + +app.get("/meteors", meteorController.getMeteors); +app.get("/meteorsView", meteorController.meteorsView); +app.post("/picture", meteorController.postPicture); + +app.use(errorHandler); + +app.listen(config.port, () => { + console.log("Server started, port: " + config.port); +}); diff --git a/src/repositories/nasaRepository.js b/src/repositories/nasaRepository.js new file mode 100644 index 0000000..b32a036 --- /dev/null +++ b/src/repositories/nasaRepository.js @@ -0,0 +1,39 @@ +const axios = require("axios"); +const config = require("../config/config"); + +async function getMeteors(startDate, endDate) { + const axiosResponse = await axios.get( + `${config.nasaBaseUrl}/neo/rest/v1/feed`, + { + params: { + api_key: config.nasaApiKey, + start_date: startDate, + end_date: endDate, + }, + } + ); + + return axiosResponse.data.near_earth_objects; +} + +async function getMostRecentImages() { + const response = await axios.get( + `${config.nasaBaseUrl}/mars-photos/api/v1/rovers/curiosity/latest_photos`, + { + params: { + api_key: config.nasaApiKey, + }, + } + ); + return response.data.latest_photos; +} + +const getMostRecentImage = async function () { + const mostRecentImages = await getMostRecentImages(); + if (mostRecentImages.length > 0) { + return mostRecentImages[mostRecentImages.length - 1]; + } + return null; +}; + +module.exports = { getMeteors, getMostRecentImage }; diff --git a/src/services/meteorService.js b/src/services/meteorService.js new file mode 100644 index 0000000..b65c951 --- /dev/null +++ b/src/services/meteorService.js @@ -0,0 +1,58 @@ +const nasaRepository = require("../repositories/nasaRepository"); +const Exception = require("../utils/exception"); +const dateUtils = require("../utils/dateUtils"); + +const getMeteorsData = async ({ date, count, wereDangerousMeteors }) => { + const startDate = dateUtils.getStartDateOrDefault(date); + const endDate = dateUtils.getEndDateOrDefault(date, startDate); + + const meteorsData = await nasaRepository.getMeteors(startDate, endDate); + + if (!meteorsData) { + throw new Exception(500, "Failed to fetch data from NASA API"); + } + + const meteorsArray = meteorsData[startDate]; + + if (!Array.isArray(meteorsArray)) { + throw new Exception( + 500, + "Expected an array of meteors, but received something else" + ); + } + + const filteredData = meteorsArray.map((meteor) => { + const diameter_meters = + meteor.estimated_diameter?.meters?.estimated_diameter_max || "unknown"; + const closeApproachData = meteor.close_approach_data?.[0] || {}; + const close_approach_date_full = + closeApproachData.close_approach_date_full || "unknown"; + const relative_velocity_kps = + closeApproachData.relative_velocity?.kilometers_per_second || "unknown"; + + return { + id: meteor.id || "unknown", + name: meteor.name || "unknown", + diameter_meters, + is_potentially_hazardous_asteroid: + meteor.is_potentially_hazardous_asteroid || false, + close_approach_date_full, + relative_velocity_kps, + }; + }); + + if (count) { + return { count: filteredData.length }; + } + + if (wereDangerousMeteors) { + const dangerousMeteors = filteredData.filter( + (meteor) => meteor.is_potentially_hazardous_asteroid + ); + return { wereDangerousMeteors: dangerousMeteors.length > 0 }; + } + + return filteredData; +}; + +module.exports = getMeteorsData; diff --git a/src/utils/booleanUtil.js b/src/utils/booleanUtil.js new file mode 100644 index 0000000..dbda31f --- /dev/null +++ b/src/utils/booleanUtil.js @@ -0,0 +1,5 @@ +const stringToBoolean = (str) => { + return str === "true"; +}; + +module.exports = stringToBoolean; diff --git a/utils/dateUtils.js b/src/utils/dateUtils.js similarity index 100% rename from utils/dateUtils.js rename to src/utils/dateUtils.js diff --git a/src/utils/errorHandler.js b/src/utils/errorHandler.js new file mode 100644 index 0000000..a2a4986 --- /dev/null +++ b/src/utils/errorHandler.js @@ -0,0 +1,10 @@ +const Exception = require("./exception"); + +function errorHandler(err, req, res) { + const statusCode = err instanceof Exception ? err.statusCode : 500; + res.status(statusCode).json({ + message: err.message, + }); +} + +module.exports = errorHandler; diff --git a/src/utils/exception.js b/src/utils/exception.js new file mode 100644 index 0000000..3e8d763 --- /dev/null +++ b/src/utils/exception.js @@ -0,0 +1,8 @@ +class Exception extends Error { + constructor(statusCode, message) { + super(message); + this.statusCode = statusCode; + } +} + +module.exports = Exception; From 65bb331f44350b719ce16f78aded7b8570bb439f Mon Sep 17 00:00:00 2001 From: Anton Hrabianets Date: Fri, 18 Oct 2024 11:23:52 +0200 Subject: [PATCH 17/17] fix comments --- api.http | 4 +- src/controllers/meteorController.js | 17 ++++--- src/repositories/nasaRepository.js | 2 +- src/services/meteorService.js | 70 +++++++++++++---------------- src/utils/dateUtils.js | 17 ++++--- 5 files changed, 56 insertions(+), 54 deletions(-) diff --git a/api.http b/api.http index dc4c120..3cf2442 100644 --- a/api.http +++ b/api.http @@ -1,6 +1,8 @@ GET http://localhost:8000/meteors?start_date=2015-09-07&end_date=2015-09-09 ### -GET http://localhost:8000/meteorsView?start_date=2000-01-01&end_date=2000-01-03&dangerous=false +GET http://localhost:8000/meteors +### +GET http://localhost:8000/meteorsView?start_date=2000-01-01&end_date=2000-01-03&wereDangerousMeteors=true&count=3 ### POST http://localhost:8000/picture?API_KEY=DEMO_KEY Content-Type: application/json diff --git a/src/controllers/meteorController.js b/src/controllers/meteorController.js index e149bf7..83d9d93 100644 --- a/src/controllers/meteorController.js +++ b/src/controllers/meteorController.js @@ -1,17 +1,18 @@ -const { format } = require("date-fns"); const nasaRepository = require("../repositories/nasaRepository.js"); const getMeteorsData = require("../services/meteorService.js"); const stringToBoolean = require("../utils/booleanUtil.js"); const getMeteors = async (req, res, next) => { try { - const date = req.query.date || format(new Date(), "yyyy-MM-dd"); - const count = stringToBoolean(req.query.count); + const startDate = req.query.start_date; + const endDate = req.query.end_date; + const count = req.query.count; + const wereDangerousMeteors = stringToBoolean( req.query.wereDangerousMeteors ); - const meteors = await getMeteorsData({ date, count, wereDangerousMeteors }); + const meteors = await getMeteorsData({ startDate, endDate , count, wereDangerousMeteors }); res.send(meteors); } catch (error) { @@ -21,13 +22,15 @@ const getMeteors = async (req, res, next) => { const meteorsView = async (req, res, next) => { try { - const date = req.query.date || format(new Date(), "yyyy-MM-dd"); - const count = stringToBoolean(req.query.count); + const startDate = req.query.start_date; + const endDate = req.query.end_date; + const count = req.query.count; + const wereDangerousMeteors = stringToBoolean( req.query.wereDangerousMeteors ); - const meteors = await getMeteorsData({ date, count, wereDangerousMeteors }); + const meteors = await getMeteorsData({ startDate, endDate , count, wereDangerousMeteors }); console.log("meteorsView data: " + meteors); res.render("meteors.njk", { meteors }); diff --git a/src/repositories/nasaRepository.js b/src/repositories/nasaRepository.js index b32a036..ca87d3c 100644 --- a/src/repositories/nasaRepository.js +++ b/src/repositories/nasaRepository.js @@ -12,7 +12,7 @@ async function getMeteors(startDate, endDate) { }, } ); - + console.log(axiosResponse.data); return axiosResponse.data.near_earth_objects; } diff --git a/src/services/meteorService.js b/src/services/meteorService.js index b65c951..53d3e9c 100644 --- a/src/services/meteorService.js +++ b/src/services/meteorService.js @@ -2,57 +2,51 @@ const nasaRepository = require("../repositories/nasaRepository"); const Exception = require("../utils/exception"); const dateUtils = require("../utils/dateUtils"); -const getMeteorsData = async ({ date, count, wereDangerousMeteors }) => { - const startDate = dateUtils.getStartDateOrDefault(date); - const endDate = dateUtils.getEndDateOrDefault(date, startDate); +const getMeteorsData = async ({startDate, endDate, count, wereDangerousMeteors}) => { - const meteorsData = await nasaRepository.getMeteors(startDate, endDate); + const meteorsData = await nasaRepository.getMeteors(dateUtils.getStartDateOrDefault(startDate), dateUtils.getEndDateOrDefault(endDate, startDate)); if (!meteorsData) { throw new Exception(500, "Failed to fetch data from NASA API"); } + let allMeteors = Object.values(meteorsData).flat(); - const meteorsArray = meteorsData[startDate]; - - if (!Array.isArray(meteorsArray)) { + if (!Array.isArray(allMeteors)) { throw new Exception( 500, - "Expected an array of meteors, but received something else" + "Expected an array of meteors, but received something else" + meteorsData ); } - const filteredData = meteorsArray.map((meteor) => { - const diameter_meters = - meteor.estimated_diameter?.meters?.estimated_diameter_max || "unknown"; - const closeApproachData = meteor.close_approach_data?.[0] || {}; - const close_approach_date_full = - closeApproachData.close_approach_date_full || "unknown"; - const relative_velocity_kps = - closeApproachData.relative_velocity?.kilometers_per_second || "unknown"; - - return { - id: meteor.id || "unknown", - name: meteor.name || "unknown", - diameter_meters, - is_potentially_hazardous_asteroid: - meteor.is_potentially_hazardous_asteroid || false, - close_approach_date_full, - relative_velocity_kps, - }; - }); - - if (count) { - return { count: filteredData.length }; - } + allMeteors = filterDangerousMeteors(wereDangerousMeteors, allMeteors); + allMeteors = sliceMeteors(count, allMeteors); - if (wereDangerousMeteors) { - const dangerousMeteors = filteredData.filter( - (meteor) => meteor.is_potentially_hazardous_asteroid - ); - return { wereDangerousMeteors: dangerousMeteors.length > 0 }; + return toMeteorsDto(allMeteors); +}; + +function toMeteorsDto(allMeteors) { + return allMeteors.map(meteor => ({ + id: meteor.id, + name: meteor.name, + diameter: meteor.estimated_diameter.meters, + is_potentially_hazardous_asteroid: meteor.is_potentially_hazardous_asteroid, + close_approach_data: meteor.close_approach_data.map(data => ({ + close_approach_date_full: data.close_approach_date_full, + kilometers_per_second: data.relative_velocity.kilometers_per_second + })) + })); +} + +function filterDangerousMeteors(dangerous, allMeteors) { + if (dangerous) { + allMeteors = allMeteors.filter((meteor) => meteor.is_potentially_hazardous_asteroid) } + return allMeteors; +} + +function sliceMeteors(count, allMeteors) { + return count ? allMeteors.slice(0, count) : allMeteors; +} - return filteredData; -}; module.exports = getMeteorsData; diff --git a/src/utils/dateUtils.js b/src/utils/dateUtils.js index 3500178..044bef4 100644 --- a/src/utils/dateUtils.js +++ b/src/utils/dateUtils.js @@ -1,14 +1,17 @@ -exports.getStartDateOrDefault = function (startDate) { - return startDate || new Date().toISOString().split('T')[0]; +const {format} = require("date-fns"); + +function getStartDateOrDefault(startDate) { + return startDate || format(new Date(), "yyyy-MM-dd"); } -exports.getEndDateOrDefault = function (endDate, startDate) { +function getEndDateOrDefault (endDate) { if (endDate) { return endDate } var date = new Date(); - //todo fix bug(if start_date in query and end_date is not present) - date.setDate(startDate || date.getDate() - 1); - return date.toISOString().split('T')[0]; -} \ No newline at end of file + date.setDate(date.getDate() - 1); + return format(date, "yyyy-MM-dd"); +} + +module.exports = {getStartDateOrDefault, getEndDateOrDefault}; \ No newline at end of file