From 02bae87caa17e3e3a45ccc82b1a2403f300b478d Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 14:27:04 -0400 Subject: [PATCH 1/8] chore: install dependencies --- .gitignore | 1 + package-lock.json | 909 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 16 + 3 files changed, 926 insertions(+) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..9a9980d4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,909 @@ +{ + "name": "new-test-backend-nodejs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "new-test-backend-nodejs", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.19.2", + "mongoose": "^8.3.2" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", + "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "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==", + "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==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "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.11.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/bson": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.6.0.tgz", + "integrity": "sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "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==", + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "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==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "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==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "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.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "engines": { + "node": ">=12.0.0" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "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==", + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mongodb": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", + "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.4.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", + "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.2.tgz", + "integrity": "sha512-3JcpDjFI25cF/3xpu+4+9nM0lURQTNLcP86X83+LvuICdn453QQLmhSrUr2IPM/ffLiDE9KPl9slNb2s0hZPpg==", + "dependencies": { + "bson": "^6.5.0", + "kareem": "2.6.3", + "mongodb": "6.5.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "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==", + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "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==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "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==", + "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==", + "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" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.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==", + "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==" + }, + "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==", + "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/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..f385fe04 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "new-test-backend-nodejs", + "version": "1.0.0", + "description": "

Backend Analyst Candidate Test

\r Dear developer,", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^4.19.2", + "mongoose": "^8.3.2" + } +} From 2ea2d50ebe7306024eb30ae9f0c47905968f74ef Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 14:35:34 -0400 Subject: [PATCH 2/8] feat: run server with express --- package.json | 7 ++++++- src/server.js | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/server.js diff --git a/package.json b/package.json index f385fe04..0655d9d6 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,13 @@ "version": "1.0.0", "description": "

Backend Analyst Candidate Test

\r Dear developer,", "main": "index.js", + "type": "module", + "engines": { + "node": "20.11.0" + }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "node --watch src/server.js" }, "keywords": [], "author": "", diff --git a/src/server.js b/src/server.js new file mode 100644 index 00000000..b644a092 --- /dev/null +++ b/src/server.js @@ -0,0 +1,17 @@ +import express from 'express' + +const app = express() + +const port = process.env.PORT || 8080 + +app.use(express.json()) + +app.get('/', (request, reponse) => { + reponse.json({ + message: "Server Running" + }) +}) + +app.listen(port, () => { + console.log(`Server running at port http://localhost:${port}`) +}) \ No newline at end of file From fab3cb619a84418243b3747f257f00e4cfc7f90b Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 15:01:41 -0400 Subject: [PATCH 3/8] feat: set up docker compose --- .env.example | 2 ++ .gitignore | 3 ++- docker-compose.yaml | 11 +++++++++++ package.json | 2 +- src/database/connection.js | 0 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 .env.example create mode 100644 docker-compose.yaml create mode 100644 src/database/connection.js diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..dcb3a7c5 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +MONGO_USERNAME= +MONGO_PASSWORD= \ No newline at end of file diff --git a/.gitignore b/.gitignore index 40b878db..3ec544c7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules/ \ No newline at end of file +node_modules/ +.env \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..c703b784 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,11 @@ +version: '3.0' + +services: + mongo: + image: mongo + container_name: anotaai + ports: + - 27017:27017 + environment: + MONGO_INITDB_ROOT_USERNAME: ${MONGO_USERNAME} + MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD} \ No newline at end of file diff --git a/package.json b/package.json index 0655d9d6..7fa2b793 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "node --watch src/server.js" + "dev": "node --watch --env-file .env src/server.js" }, "keywords": [], "author": "", diff --git a/src/database/connection.js b/src/database/connection.js new file mode 100644 index 00000000..e69de29b From b839f07f360bb0e86cd4c48dd1358fb35249c318 Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 15:34:08 -0400 Subject: [PATCH 4/8] feat: create connection with mongodb --- src/database/connection.js | 17 +++++++++++++++++ src/server.js | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/database/connection.js b/src/database/connection.js index e69de29b..f8232fb9 100644 --- a/src/database/connection.js +++ b/src/database/connection.js @@ -0,0 +1,17 @@ +import mongoose from "mongoose" + +const user = process.env.MONGO_USERNAME +const pass = process.env.MONGO_PASSWORD + +export class MongoConnectDatabase { + + async main() { + await mongoose.connect(`mongodb://localhost:27017/db`, { + authSource: 'admin', + user, + pass, + }) + } +} + + diff --git a/src/server.js b/src/server.js index b644a092..02c3ee47 100644 --- a/src/server.js +++ b/src/server.js @@ -1,4 +1,5 @@ import express from 'express' +import { MongoConnectDatabase } from './database/connection.js' const app = express() @@ -6,6 +7,17 @@ const port = process.env.PORT || 8080 app.use(express.json()) +const connectionDatabase = new MongoConnectDatabase() + +connectionDatabase.main() + .then(() => { + console.log('Connection sucessfully') + }) + .catch((e) => { + console.error('Database error', e) + }) + + app.get('/', (request, reponse) => { reponse.json({ message: "Server Running" From e4cd51b01ce91a5886ad48c408b3df9fa745c0f2 Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 16:00:02 -0400 Subject: [PATCH 5/8] feat: create category and owner models --- src/model/category.js | 13 +++++++++++++ src/model/owner.js | 7 +++++++ src/server.js | 10 ++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 src/model/category.js create mode 100644 src/model/owner.js diff --git a/src/model/category.js b/src/model/category.js new file mode 100644 index 00000000..c1490193 --- /dev/null +++ b/src/model/category.js @@ -0,0 +1,13 @@ +import mongoose from "mongoose"; +const Schema = mongoose.Schema + +const categoriesSchema = new Schema({ + title: String, + description: String, + owners: [{ + type: Schema.Types.ObjectId, + ref: "Owner" + }] +}) + +export const Categories = mongoose.model('Categories', categoriesSchema) \ No newline at end of file diff --git a/src/model/owner.js b/src/model/owner.js new file mode 100644 index 00000000..a9126dcd --- /dev/null +++ b/src/model/owner.js @@ -0,0 +1,7 @@ +import mongoose from 'mongoose' + +const OwnerSchema = new mongoose.Schema({ + name: String +}) + +export const Owner = mongoose.model('Owner', OwnerSchema) \ No newline at end of file diff --git a/src/server.js b/src/server.js index 02c3ee47..29046400 100644 --- a/src/server.js +++ b/src/server.js @@ -1,5 +1,6 @@ import express from 'express' import { MongoConnectDatabase } from './database/connection.js' +import { Owner } from './model/owner.js' const app = express() @@ -18,10 +19,11 @@ connectionDatabase.main() }) -app.get('/', (request, reponse) => { - reponse.json({ - message: "Server Running" - }) +app.get('/', async (request, reponse) => { + const allOwners = await Owner.find() + console.log(allOwners) + + reponse.json(allOwners) }) app.listen(port, () => { From bd1d044b091994a7e0f333e049499e29d33c0714 Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 16:11:12 -0400 Subject: [PATCH 6/8] feat: create owner controller --- ddasd | 137 +++++++++++++++++++++++++++++ src/controller/onwer-controller.js | 22 +++++ src/server.js | 19 ++-- 3 files changed, 172 insertions(+), 6 deletions(-) create mode 100644 ddasd create mode 100644 src/controller/onwer-controller.js diff --git a/ddasd b/ddasd new file mode 100644 index 00000000..ea799f5c --- /dev/null +++ b/ddasd @@ -0,0 +1,137 @@ +commit b839f07f360bb0e86cd4c48dd1358fb35249c318 (HEAD -> create-models, lucas-nather) +Author: lucasnather +Date: Thu Apr 18 15:34:08 2024 -0400 + + feat: create connection with mongodb + +commit fab3cb619a84418243b3747f257f00e4cfc7f90b +Author: lucasnather +Date: Thu Apr 18 15:01:41 2024 -0400 + + feat: set up docker compose + +commit 2ea2d50ebe7306024eb30ae9f0c47905968f74ef +Author: lucasnather +Date: Thu Apr 18 14:35:34 2024 -0400 + + feat: run server with express + +commit 02bae87caa17e3e3a45ccc82b1a2403f300b478d (origin/lucas-nather) +Author: lucasnather +Date: Thu Apr 18 14:27:04 2024 -0400 + + chore: install dependencies + +commit e718f4cdfe1c7a4ce7802d9abcd79d3e327534ff (origin/master, origin/HEAD, master) +Author: Thiago Pontes Soares +Date: Fri Jul 7 15:40:44 2023 -0300 + + Update README.md + +commit 21cc5b5d8f70227ec9ad774048dfb610837b9c8b +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:35:29 2023 -0300 + + Update README.md + +commit bc98a242e9da4a74d6c8cd639194ff40278edfe7 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:35:00 2023 -0300 + + Update README.md + +commit c69238992e20535a143e358fbe59ea725b1a5160 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:34:43 2023 -0300 + + Update README.md + +commit b669f49aa267e9ad2c6f17ee42595ff9457ccc59 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:34:23 2023 -0300 + + Update README.md + +commit b494fe4a3f0592e57b4009a362f2f06ccefd18e3 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:34:01 2023 -0300 + + Update README.md + +commit d7d7323cc5a87ce3e9429066c4326067d83881df +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:32:10 2023 -0300 + + Update README.md + +commit 36d78ebfe10a34f515046b0d302c297ba98095a4 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:31:51 2023 -0300 + + Update README.md + +commit fe693cb10a8cf2327ec472daa3afa6ed14677277 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:31:00 2023 -0300 + + Update README.md + +commit 2b66d333ff7cca6a6fb8aa75f047c08f917707ef +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:30:45 2023 -0300 + + Update README.md + +commit 692c4ed380607662b7cd8a03ceafd3cf6a213b93 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:30:30 2023 -0300 + + Update README.md + +commit 7602d0635e4d353ee7b2e45572da9ffae78b59e6 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:30:07 2023 -0300 + + Update README.md + +commit 4196de53c7c0ece1109f0decdc490c004a56d9eb +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:29:19 2023 -0300 + + Update README.md + +commit 7b6d6131d74e9be5417ad5bd9db1059440921a6a +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:28:50 2023 -0300 + + Update README.md + +commit f00a50dc8ca113485f64a8586be6d63444caf2a9 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:28:21 2023 -0300 + + Update README.md + +commit 5a7731e2e75ab1dd31e86bb9c3277f1a75f31125 +Author: Thiago Pontes Soares +Date: Mon Jun 26 15:25:40 2023 -0300 + + Update README.md + +commit a4c35770af4ebab950991439a69af89475f641ec +Author: Thiago Soares +Date: Mon Jun 26 15:16:26 2023 -0300 + + init + +commit 19a9e223f3bc548cf8a23150ca0c55597c7a56c7 +Author: Thiago Soares +Date: Mon Jun 26 15:15:03 2023 -0300 + + init + +commit 6ef3d5d3c53986b26a6a20f8349022f023411720 +Author: Thiago Pontes Soares +Date: Mon Jun 26 14:37:57 2023 -0300 + + Initial commit diff --git a/src/controller/onwer-controller.js b/src/controller/onwer-controller.js new file mode 100644 index 00000000..2572df27 --- /dev/null +++ b/src/controller/onwer-controller.js @@ -0,0 +1,22 @@ +import { Owner } from "../model/owner.js" + +export class OwnerController { + + async post(req, res) { + const { name } = req.body + + const owners = new Owner({ + name + }) + + await owners.save() + + return res.status(201).json(owners) + } + + async getAll(req, res) { + const owners = await Owner.find() + + return res.status(200).json(owners) + } +} \ No newline at end of file diff --git a/src/server.js b/src/server.js index 29046400..7249ca90 100644 --- a/src/server.js +++ b/src/server.js @@ -1,6 +1,6 @@ -import express from 'express' +import express, { response } from 'express' import { MongoConnectDatabase } from './database/connection.js' -import { Owner } from './model/owner.js' +import { OwnerController } from './controller/onwer-controller.js' const app = express() @@ -9,6 +9,7 @@ const port = process.env.PORT || 8080 app.use(express.json()) const connectionDatabase = new MongoConnectDatabase() +const ownerController = new OwnerController() connectionDatabase.main() .then(() => { @@ -19,11 +20,17 @@ connectionDatabase.main() }) -app.get('/', async (request, reponse) => { - const allOwners = await Owner.find() - console.log(allOwners) +app.get('/owners', async (request, response) => { - reponse.json(allOwners) + const owners = await ownerController.getAll(request, response) + + return owners +}) + +app.post('/owners', async (request, response) => { + const owners = await ownerController.post(request, response) + + return owners }) app.listen(port, () => { From 1dbf689714b747fc190255bd8364b8dc620cafa3 Mon Sep 17 00:00:00 2001 From: lucasnather Date: Thu, 18 Apr 2024 16:47:51 -0400 Subject: [PATCH 7/8] feat: create categories controller and separate paths --- src/controller/category-controller.js | 35 +++++++++++++++++++++++++++ src/controller/onwer-controller.js | 10 ++++++-- src/model/category.js | 14 ++++++++--- src/model/owner.js | 5 +++- src/routes/categories-route.js | 11 +++++++++ src/routes/owner-route.js | 11 +++++++++ src/server.js | 22 +++++------------ 7 files changed, 86 insertions(+), 22 deletions(-) create mode 100644 src/controller/category-controller.js create mode 100644 src/routes/categories-route.js create mode 100644 src/routes/owner-route.js diff --git a/src/controller/category-controller.js b/src/controller/category-controller.js new file mode 100644 index 00000000..40e0a3c8 --- /dev/null +++ b/src/controller/category-controller.js @@ -0,0 +1,35 @@ +import { Categories } from "../model/category.js"; + +export class CategoryController { + + async post(req, res) { + const { title, description, owners } = req.body + + if(!owners) return res.status(201).json({ + message: 'Owner id is required' + }) + + const categories = new Categories({ + title, + description, + owners + }) + + try { + await categories.save() + + return res.status(201).json(categories) + }catch(e) { + + return res.status(201).json({ + message: 'Fields required' + }) + } + } + + async getAll(req, res) { + const categories = await Categories.find() + + return res.status(200).json(categories) + } +} \ No newline at end of file diff --git a/src/controller/onwer-controller.js b/src/controller/onwer-controller.js index 2572df27..9bff23ac 100644 --- a/src/controller/onwer-controller.js +++ b/src/controller/onwer-controller.js @@ -9,9 +9,15 @@ export class OwnerController { name }) - await owners.save() + try { + await owners.save() - return res.status(201).json(owners) + return res.status(201).json(owners) + }catch(e) { + return res.status(404).json({ + message: 'Name is required' + }) + } } async getAll(req, res) { diff --git a/src/model/category.js b/src/model/category.js index c1490193..8030b56c 100644 --- a/src/model/category.js +++ b/src/model/category.js @@ -2,11 +2,19 @@ import mongoose from "mongoose"; const Schema = mongoose.Schema const categoriesSchema = new Schema({ - title: String, - description: String, + title: { + type: String, + required: true + }, + description: { + type: String, + required: true + }, owners: [{ type: Schema.Types.ObjectId, - ref: "Owner" + required: true, + ref: "Owner", + }] }) diff --git a/src/model/owner.js b/src/model/owner.js index a9126dcd..7e2ac64c 100644 --- a/src/model/owner.js +++ b/src/model/owner.js @@ -1,7 +1,10 @@ import mongoose from 'mongoose' const OwnerSchema = new mongoose.Schema({ - name: String + name: { + type: String, + required: true + } }) export const Owner = mongoose.model('Owner', OwnerSchema) \ No newline at end of file diff --git a/src/routes/categories-route.js b/src/routes/categories-route.js new file mode 100644 index 00000000..c126d51a --- /dev/null +++ b/src/routes/categories-route.js @@ -0,0 +1,11 @@ +import { Router } from 'express' +import { CategoryController } from '../controller/category-controller.js' + +export const categoriesRoute = Router() + +const categoryController = new CategoryController() + +categoriesRoute + .get('/', categoryController.getAll) + .post('/', categoryController.post) + \ No newline at end of file diff --git a/src/routes/owner-route.js b/src/routes/owner-route.js new file mode 100644 index 00000000..48e4c4d8 --- /dev/null +++ b/src/routes/owner-route.js @@ -0,0 +1,11 @@ +import { Router } from 'express' +import { OwnerController } from '../controller/onwer-controller.js' + +export const ownersRoute = Router() + +const ownerController = new OwnerController() + +ownersRoute + .get('/', ownerController.getAll) + .post('/', ownerController.post) + \ No newline at end of file diff --git a/src/server.js b/src/server.js index 7249ca90..1e71a2c7 100644 --- a/src/server.js +++ b/src/server.js @@ -1,6 +1,8 @@ -import express, { response } from 'express' +import express from 'express' import { MongoConnectDatabase } from './database/connection.js' -import { OwnerController } from './controller/onwer-controller.js' +import { CategoryController } from './controller/category-controller.js' +import { ownersRoute } from './routes/owner-route.js' +import { categoriesRoute } from './routes/categories-route.js' const app = express() @@ -9,7 +11,6 @@ const port = process.env.PORT || 8080 app.use(express.json()) const connectionDatabase = new MongoConnectDatabase() -const ownerController = new OwnerController() connectionDatabase.main() .then(() => { @@ -19,19 +20,8 @@ connectionDatabase.main() console.error('Database error', e) }) - -app.get('/owners', async (request, response) => { - - const owners = await ownerController.getAll(request, response) - - return owners -}) - -app.post('/owners', async (request, response) => { - const owners = await ownerController.post(request, response) - - return owners -}) +app.use('/owners', ownersRoute) +app.use('/categories', categoriesRoute) app.listen(port, () => { console.log(`Server running at port http://localhost:${port}`) From f89b849452176a90faf87b62e6e7b949f9186844 Mon Sep 17 00:00:00 2001 From: lucasnather Date: Tue, 14 May 2024 17:08:58 -0400 Subject: [PATCH 8/8] feat: create routes owner, category, product and catalog --- ddasd | 137 -------------------------- package-lock.json | 3 + src/controller/catalog-controller.js | 45 +++++++++ src/controller/category-controller.js | 96 ++++++++++++++++-- src/controller/onwer-controller.js | 32 +++++- src/controller/product-controller.js | 120 ++++++++++++++++++++++ src/model/category.js | 7 +- src/model/product.js | 28 ++++++ src/routes/catalog-route.js | 9 ++ src/routes/categories-route.js | 8 +- src/routes/owner-route.js | 7 +- src/routes/product-route.js | 12 +++ src/server.js | 9 +- 13 files changed, 353 insertions(+), 160 deletions(-) delete mode 100644 ddasd create mode 100644 src/controller/catalog-controller.js create mode 100644 src/controller/product-controller.js create mode 100644 src/model/product.js create mode 100644 src/routes/catalog-route.js create mode 100644 src/routes/product-route.js diff --git a/ddasd b/ddasd deleted file mode 100644 index ea799f5c..00000000 --- a/ddasd +++ /dev/null @@ -1,137 +0,0 @@ -commit b839f07f360bb0e86cd4c48dd1358fb35249c318 (HEAD -> create-models, lucas-nather) -Author: lucasnather -Date: Thu Apr 18 15:34:08 2024 -0400 - - feat: create connection with mongodb - -commit fab3cb619a84418243b3747f257f00e4cfc7f90b -Author: lucasnather -Date: Thu Apr 18 15:01:41 2024 -0400 - - feat: set up docker compose - -commit 2ea2d50ebe7306024eb30ae9f0c47905968f74ef -Author: lucasnather -Date: Thu Apr 18 14:35:34 2024 -0400 - - feat: run server with express - -commit 02bae87caa17e3e3a45ccc82b1a2403f300b478d (origin/lucas-nather) -Author: lucasnather -Date: Thu Apr 18 14:27:04 2024 -0400 - - chore: install dependencies - -commit e718f4cdfe1c7a4ce7802d9abcd79d3e327534ff (origin/master, origin/HEAD, master) -Author: Thiago Pontes Soares -Date: Fri Jul 7 15:40:44 2023 -0300 - - Update README.md - -commit 21cc5b5d8f70227ec9ad774048dfb610837b9c8b -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:35:29 2023 -0300 - - Update README.md - -commit bc98a242e9da4a74d6c8cd639194ff40278edfe7 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:35:00 2023 -0300 - - Update README.md - -commit c69238992e20535a143e358fbe59ea725b1a5160 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:34:43 2023 -0300 - - Update README.md - -commit b669f49aa267e9ad2c6f17ee42595ff9457ccc59 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:34:23 2023 -0300 - - Update README.md - -commit b494fe4a3f0592e57b4009a362f2f06ccefd18e3 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:34:01 2023 -0300 - - Update README.md - -commit d7d7323cc5a87ce3e9429066c4326067d83881df -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:32:10 2023 -0300 - - Update README.md - -commit 36d78ebfe10a34f515046b0d302c297ba98095a4 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:31:51 2023 -0300 - - Update README.md - -commit fe693cb10a8cf2327ec472daa3afa6ed14677277 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:31:00 2023 -0300 - - Update README.md - -commit 2b66d333ff7cca6a6fb8aa75f047c08f917707ef -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:30:45 2023 -0300 - - Update README.md - -commit 692c4ed380607662b7cd8a03ceafd3cf6a213b93 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:30:30 2023 -0300 - - Update README.md - -commit 7602d0635e4d353ee7b2e45572da9ffae78b59e6 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:30:07 2023 -0300 - - Update README.md - -commit 4196de53c7c0ece1109f0decdc490c004a56d9eb -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:29:19 2023 -0300 - - Update README.md - -commit 7b6d6131d74e9be5417ad5bd9db1059440921a6a -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:28:50 2023 -0300 - - Update README.md - -commit f00a50dc8ca113485f64a8586be6d63444caf2a9 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:28:21 2023 -0300 - - Update README.md - -commit 5a7731e2e75ab1dd31e86bb9c3277f1a75f31125 -Author: Thiago Pontes Soares -Date: Mon Jun 26 15:25:40 2023 -0300 - - Update README.md - -commit a4c35770af4ebab950991439a69af89475f641ec -Author: Thiago Soares -Date: Mon Jun 26 15:16:26 2023 -0300 - - init - -commit 19a9e223f3bc548cf8a23150ca0c55597c7a56c7 -Author: Thiago Soares -Date: Mon Jun 26 15:15:03 2023 -0300 - - init - -commit 6ef3d5d3c53986b26a6a20f8349022f023411720 -Author: Thiago Pontes Soares -Date: Mon Jun 26 14:37:57 2023 -0300 - - Initial commit diff --git a/package-lock.json b/package-lock.json index 9a9980d4..c4faf697 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,9 @@ "dependencies": { "express": "^4.19.2", "mongoose": "^8.3.2" + }, + "engines": { + "node": "20.11.0" } }, "node_modules/@mongodb-js/saslprep": { diff --git a/src/controller/catalog-controller.js b/src/controller/catalog-controller.js new file mode 100644 index 00000000..87a86202 --- /dev/null +++ b/src/controller/catalog-controller.js @@ -0,0 +1,45 @@ +import { Categories } from "../model/category.js"; +import { Owner } from "../model/owner.js"; +import { Products } from "../model/product.js"; + +export class CatalogController { + + async get(req, res) { + const { ownerId } = req.params + + try { + const owner = await Owner.findById({ + '_id': ownerId + }) + + const product = await Products.find({ + 'ownerId': owner.id + }) + + const category = await Categories.findOne({ + 'ownerId': owner.id + }) + + + const ownerCatalog = { + owner: owner.name, + catalog: [{ + categoryTitle: category.title, + categoryDescription: category.description, + itens: product.map(({title, description, price}) => { + return { + title, + description, + price + } + }) + }] + } + return res.status(200).json(ownerCatalog) + } catch(e) { + return res.status(500).json({ + message: 'Server Internal Error' + }) + } + } +} \ No newline at end of file diff --git a/src/controller/category-controller.js b/src/controller/category-controller.js index 40e0a3c8..0b101d34 100644 --- a/src/controller/category-controller.js +++ b/src/controller/category-controller.js @@ -1,18 +1,39 @@ import { Categories } from "../model/category.js"; +import { Owner } from "../model/owner.js"; export class CategoryController { async post(req, res) { - const { title, description, owners } = req.body + const { title, description, ownerId } = req.body - if(!owners) return res.status(201).json({ - message: 'Owner id is required' + const checkIfCategoryExist = await Categories.find({ + title }) + if(checkIfCategoryExist.length > 0) { + return res.status(400).json({ + message: 'Category already exists!' + }) + } + + if(!ownerId || !title || !description) return res.status(201).json({ + message: 'Empty labels invalid' + }) + + const checkIfOwnerExists = await Owner.findById({ + '_id': ownerId + }) + + if(!checkIfOwnerExists) { + return res.status(400).json({ + message: 'Owner not exists!' + }) + } + const categories = new Categories({ title, description, - owners + ownerId }) try { @@ -22,14 +43,73 @@ export class CategoryController { }catch(e) { return res.status(201).json({ - message: 'Fields required' + message: 'Server Internal Error' + }) + } + } + + async get(req, res) { + try { + const categories = await Categories.find() + + return res.status(200).json(categories) + } catch(e) { + return res.status(200).json({ + message: 'Server Internal Error' + }) + } + } + + async remove(req, res) { + const { id } = req.params + + try { + await Categories.findByIdAndDelete({ + '_id': id }) + + return res.status(203).json({ + message: 'Category deleted' + }) + } catch(e) { + return res.status(500).json({ + message: 'Server internal error' + }) + } } - async getAll(req, res) { - const categories = await Categories.find() + async update(req, res) { + const { id } = req.params + const { title, description, ownerId } = req.body + + const checkIfCategoryExist = await Categories.findById({ + '_id': id + }) + + if(!checkIfCategoryExist) { + return res.status(400).json({ + message: 'Category not exists' + }) + } + + try { + await Categories.findByIdAndUpdate(id, { + title, + description, + ownerId + }) + + return res.status(203).json({ + message: 'Categorie updated' + }) + } catch(e) { + return res.status(203).json({ + message: 'Server internal Error' + }) + + } + - return res.status(200).json(categories) } } \ No newline at end of file diff --git a/src/controller/onwer-controller.js b/src/controller/onwer-controller.js index 9bff23ac..9920509f 100644 --- a/src/controller/onwer-controller.js +++ b/src/controller/onwer-controller.js @@ -1,3 +1,4 @@ + import { Owner } from "../model/owner.js" export class OwnerController { @@ -5,6 +6,12 @@ export class OwnerController { async post(req, res) { const { name } = req.body + if(!name || name.length < 3) { + return res.status(400).json({ + message: 'O campo deve conter mais que 3 caracteres' + }) + } + const owners = new Owner({ name }) @@ -12,17 +19,38 @@ export class OwnerController { try { await owners.save() + return res.status(201).json(owners) }catch(e) { + return res.status(404).json({ - message: 'Name is required' + message: 'Server internal Error' }) } } - async getAll(req, res) { + async get(req, res) { const owners = await Owner.find() return res.status(200).json(owners) } + + async remove(req, res) { + const { id } = req.params + + try { + await Owner.findByIdAndDelete({ + '_id': id + }) + + return res.status(203).json({ + message: 'Owner deleted' + }) + } catch(e) { + return res.status(500).json({ + message: 'Server internal Error' + }) + + } + } } \ No newline at end of file diff --git a/src/controller/product-controller.js b/src/controller/product-controller.js new file mode 100644 index 00000000..46f67688 --- /dev/null +++ b/src/controller/product-controller.js @@ -0,0 +1,120 @@ +import { Products } from "../model/product.js" +import { Categories } from "../model/category.js" + +export class ProductController { + + async post(req, res) { + const { title, description, price, categoryId, ownerId } = req.body + + if(!title || !description || price <= 0 || !categoryId || !ownerId) { + return res.status(400).json({ + message: 'Invalid labels empty' + }) + } + + const checkIfProductExist = await Products.find({ + title + }) + + if(checkIfProductExist.length > 0) { + return res.status(400).json({ + message: 'Product already exists!' + }) + } + + const checkIfCategoryExists = await Categories.findById({ + '_id': categoryId, + ownerId + }) + + if(!checkIfCategoryExists) { + return res.status(400).json({ + message: 'Category or Owner not exists' + }) + } + + const product = new Products({ + title, + description, + price, + categoryId, + ownerId + }) + + try { + await product.save() + + return res.status(201).json(product) + } catch(e) { + return res.status(404).json({ + message: 'Server internal error' + }) + + } + } + + async get(req, res) { + + try { + const products = await Products.find() + + return res.status(201).json(products) + } catch(e) { + return res.status(404).json({ + message: 'Server internal error' + }) + + } + } + + async remove(req, res) { + const { id } = req.params + + try { + await Products.findByIdAndDelete({ + '_id': id + }) + + return res.status(203).json({ + message: 'Owner deleted' + }) + } catch(e) { + return res.status(404).json({ + message: 'Server internal error' + }) + } + } + + async update(req, res) { + const { id } = req.params + const { title, description, price, categoryId, ownerId } = req.body + + const checkIfProductExist = await Products.findById({ + '_id': id + }) + + if(!checkIfProductExist) { + return res.status(400).json({ + message: 'Product not exists!' + }) + } + + try { + await Products.findByIdAndUpdate(id, { + title, + description, + price, + categoryId, + ownerId + }) + + return res.status(203).json({ + message: 'Product updated!' + }) + } catch(e) { + return res.status(500).json({ + message: 'Server internal Error' + }) + } + } +} \ No newline at end of file diff --git a/src/model/category.js b/src/model/category.js index 8030b56c..bd787d3f 100644 --- a/src/model/category.js +++ b/src/model/category.js @@ -10,12 +10,11 @@ const categoriesSchema = new Schema({ type: String, required: true }, - owners: [{ + ownerId: { type: Schema.Types.ObjectId, required: true, - ref: "Owner", - - }] + ref: "Owner", + } }) export const Categories = mongoose.model('Categories', categoriesSchema) \ No newline at end of file diff --git a/src/model/product.js b/src/model/product.js new file mode 100644 index 00000000..c9fa1015 --- /dev/null +++ b/src/model/product.js @@ -0,0 +1,28 @@ +import mongoose, { Schema, SchemaTypes } from "mongoose"; + +const productSchema = new Schema({ + title: { + type: SchemaTypes.String, + required: true + }, + description: { + type: SchemaTypes.String, + required: true + }, + price: { + type: SchemaTypes.Number, + required: true + }, + categoryId: { + type: Schema.Types.ObjectId, + required: true, + ref: "Categories", + }, + ownerId: { + type: Schema.Types.ObjectId, + required: true, + ref: "Owner", + } +}) + +export const Products = mongoose.model('Products', productSchema) \ No newline at end of file diff --git a/src/routes/catalog-route.js b/src/routes/catalog-route.js new file mode 100644 index 00000000..8a5b66a8 --- /dev/null +++ b/src/routes/catalog-route.js @@ -0,0 +1,9 @@ +import express from 'express' +import { CatalogController } from '../controller/catalog-controller.js' + +export const catalogRoute = express.Router() + +const catalogController = new CatalogController() + +catalogRoute + .get('/:ownerId', catalogController.get) \ No newline at end of file diff --git a/src/routes/categories-route.js b/src/routes/categories-route.js index c126d51a..ea2b81a8 100644 --- a/src/routes/categories-route.js +++ b/src/routes/categories-route.js @@ -1,11 +1,13 @@ -import { Router } from 'express' +import express from 'express' import { CategoryController } from '../controller/category-controller.js' -export const categoriesRoute = Router() +export const categoriesRoute = express.Router() const categoryController = new CategoryController() categoriesRoute - .get('/', categoryController.getAll) + .get('/', categoryController.get) .post('/', categoryController.post) + .delete('/:id', categoryController.remove) + .put('/:id', categoryController.update) \ No newline at end of file diff --git a/src/routes/owner-route.js b/src/routes/owner-route.js index 48e4c4d8..06052a91 100644 --- a/src/routes/owner-route.js +++ b/src/routes/owner-route.js @@ -1,11 +1,12 @@ -import { Router } from 'express' +import express from 'express' import { OwnerController } from '../controller/onwer-controller.js' -export const ownersRoute = Router() +export const ownersRoute = express.Router() const ownerController = new OwnerController() ownersRoute - .get('/', ownerController.getAll) + .get('/', ownerController.get) .post('/', ownerController.post) + .delete('/:id', ownerController.remove) \ No newline at end of file diff --git a/src/routes/product-route.js b/src/routes/product-route.js new file mode 100644 index 00000000..5563708e --- /dev/null +++ b/src/routes/product-route.js @@ -0,0 +1,12 @@ +import express from 'express' +import { ProductController } from '../controller/product-controller.js' + +export const productRoute = express.Router() + +const productsController = new ProductController() + +productRoute + .post('/', productsController.post) + .get('/', productsController.get) + .delete('/:id', productsController.remove) + .put('/:id', productsController.update) diff --git a/src/server.js b/src/server.js index 1e71a2c7..b844a136 100644 --- a/src/server.js +++ b/src/server.js @@ -1,8 +1,9 @@ import express from 'express' import { MongoConnectDatabase } from './database/connection.js' -import { CategoryController } from './controller/category-controller.js' import { ownersRoute } from './routes/owner-route.js' import { categoriesRoute } from './routes/categories-route.js' +import { productRoute } from './routes/product-route.js' +import { catalogRoute } from './routes/catalog-route.js' const app = express() @@ -20,8 +21,10 @@ connectionDatabase.main() console.error('Database error', e) }) -app.use('/owners', ownersRoute) -app.use('/categories', categoriesRoute) +app.use('/api/owners', ownersRoute) +app.use('/api/categories', categoriesRoute) +app.use('/api/products', productRoute) +app.use('/api/catalog', catalogRoute) app.listen(port, () => { console.log(`Server running at port http://localhost:${port}`)