From 36a7749fff8918ae477a365e2004212dcca4c4b9 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 08:17:00 +0530 Subject: [PATCH 01/34] Connect to database --- .gitignore | 2 + backend/config/DBconn.js | 12 + backend/package-lock.json | 1101 +++++++++++++++++++++++++++++++++++++ backend/package.json | 9 +- backend/server.js | 14 + 5 files changed, 1136 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 backend/config/DBconn.js create mode 100644 backend/package-lock.json create mode 100644 backend/server.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1dcef2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env \ No newline at end of file diff --git a/backend/config/DBconn.js b/backend/config/DBconn.js new file mode 100644 index 0000000..c3e852c --- /dev/null +++ b/backend/config/DBconn.js @@ -0,0 +1,12 @@ +import mongoose from 'mongoose'; + + +const connectDb=async (url)=>{ + try{ + await mongoose.connect(url); + }catch(err){ + console.log(err,'database not connected') + } +} + +export default connectDb; \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..c363562 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1101 @@ +{ + "name": "backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.21.2", + "mongoose": "^8.9.4" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "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==", + "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/body-parser/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/body-parser/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/bson": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.1.tgz", + "integrity": "sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==", + "license": "Apache-2.0", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "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": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "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/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "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.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "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.12", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/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/express/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/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/finalhandler/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/finalhandler/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/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.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "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/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/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==", + "license": "MIT" + }, + "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/mongodb": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.12.0.tgz", + "integrity": "sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.1", + "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 || ^2.0.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.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.9.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.9.4.tgz", + "integrity": "sha512-DndoI01aV/q40P9DiYDXsYjhj8vZjmmuFwcC3Tro5wFznoE1z6Fe2JgMnbLR6ghglym5ziYizSfAJykp+UPZWg==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.1", + "kareem": "2.6.3", + "mongodb": "~6.12.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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/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.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "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.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/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/send/node_modules/debug/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/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/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/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.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "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/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "license": "MIT", + "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==", + "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" + } + }, + "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==", + "license": "BSD-2-Clause", + "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==", + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + } + } +} diff --git a/backend/package.json b/backend/package.json index ea7e359..de9c237 100644 --- a/backend/package.json +++ b/backend/package.json @@ -2,11 +2,16 @@ "name": "backend", "version": "1.0.0", "main": "index.js", + "type": "module", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "dev":"node --env-file=.env --watch server.js " }, "keywords": [], "author": "", "license": "ISC", - "description": "" + "description": "", + "dependencies": { + "express": "^4.21.2", + "mongoose": "^8.9.4" + } } diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..28bcf87 --- /dev/null +++ b/backend/server.js @@ -0,0 +1,14 @@ +import express from 'express' +import mongoose from 'mongoose'; +import connectDb from './config/DBconn.js'; +const app=express(); +const PORT=process.env.PORT ||8000; + + + + +connectDb(process.env.DATABASE_URI) +mongoose.connection.once('open',()=>{ + console.log('Connected to Database....') + app.listen(PORT,()=>console.log(`Server running on port ${PORT}......`)) +}) \ No newline at end of file From 9f720eb6339e205d51abd4bfc2aa56098ad32ebe Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 08:44:31 +0530 Subject: [PATCH 02/34] Add User.js model --- backend/models/User.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 backend/models/User.js diff --git a/backend/models/User.js b/backend/models/User.js new file mode 100644 index 0000000..d783268 --- /dev/null +++ b/backend/models/User.js @@ -0,0 +1,33 @@ +import mongoose from "mongoose"; + +const UserSchema = new mongoose.Schema({ + name: { + type: String, + required: true, + trim: true, + minlength: 2, + maxlength: 50 + }, + email: { + type: String, + required: true, + unique: true, + trim: true, + lowercase: true, + match: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + }, + phoneNumber: { + type: String, + required: true, + unique: true + }, + college: { + type: String, + required: true, + trim: true, + minlength: 2, + maxlength: 100 + } +}, { timestamps: true }); + +export default mongoose.model('User', UserSchema); \ No newline at end of file From 7a9393f98af4b67c6bceaebe4f34920db922c4b1 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 13:09:10 +0530 Subject: [PATCH 03/34] Add registration route --- backend/controllers/registerController.js | 43 +++++++++++++++++++++++ backend/routes/registerRoute.js | 7 ++++ backend/server.js | 6 +++- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 backend/controllers/registerController.js create mode 100644 backend/routes/registerRoute.js diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js new file mode 100644 index 0000000..a17f459 --- /dev/null +++ b/backend/controllers/registerController.js @@ -0,0 +1,43 @@ +import User from "../models/User.js"; + +const handleNewRegistration = async (req, res) => { + try { + const { name, email, phoneNumber, college } = req.body; + + // Validate required fields + if (!name || !email || !phoneNumber || !college) { + return res.status(400).json({ message: 'All fields are required.' }); + } + + // Check for duplicate email and phone number in parallel + const [duplicateEmail, duplicatePhoneNo] = await Promise.all([ + User.findOne({ email }), + User.findOne({ phoneNumber }) + ]); + + if (duplicateEmail) { + console.log('Duplicate email found:', duplicateEmail); + return res.status(409).json({ message: 'Email already registered.' }); + } + + if (duplicatePhoneNo) { + console.log('Duplicate phone number found:', duplicatePhoneNo); + return res.status(409).json({ message: 'Phone number already registered.' }); + } + + // Create a new user + const newUser = await User.create({ name, email, phoneNumber, college }); + + console.log('New user created:', newUser); + return res.status(201).json({ + message: `New user '${newUser.name}' created successfully.`, + user: newUser, // Include the created user details if needed + }); + } catch (error) { + console.error('Error handling new registration:', error.message); + return res.status(500).json({ message: 'Internal server error.' }); + } +}; + + +export default handleNewRegistration \ No newline at end of file diff --git a/backend/routes/registerRoute.js b/backend/routes/registerRoute.js new file mode 100644 index 0000000..de2977b --- /dev/null +++ b/backend/routes/registerRoute.js @@ -0,0 +1,7 @@ +import express from "express"; +import handleNewRegistration from "../controllers/registerController.js"; + +const router= express.Router(); + +router.post('/',handleNewRegistration) +export default router; \ No newline at end of file diff --git a/backend/server.js b/backend/server.js index 28bcf87..c58a006 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,11 +1,15 @@ import express from 'express' import mongoose from 'mongoose'; import connectDb from './config/DBconn.js'; +import register from './routes/registerRoute.js'; const app=express(); const PORT=process.env.PORT ||8000; +// app.use(cors()); +// app.use( express.urlencoded({extended:false}) ); +app.use(express.json()); - +app.use('/register',register); connectDb(process.env.DATABASE_URI) mongoose.connection.once('open',()=>{ From 9a1265bcdd9374077b9e5b2901aa49ea75ac6f4a Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 17:11:10 +0530 Subject: [PATCH 04/34] Update User model --- backend/controllers/registerController.js | 6 +++--- backend/models/User.js | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index a17f459..f36779d 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -2,10 +2,10 @@ import User from "../models/User.js"; const handleNewRegistration = async (req, res) => { try { - const { name, email, phoneNumber, college } = req.body; + const { name, email, phoneNumber, college, semester } = req.body; // Validate required fields - if (!name || !email || !phoneNumber || !college) { + if (!name || !email || !phoneNumber || !college || !semester) { return res.status(400).json({ message: 'All fields are required.' }); } @@ -26,7 +26,7 @@ const handleNewRegistration = async (req, res) => { } // Create a new user - const newUser = await User.create({ name, email, phoneNumber, college }); + const newUser = await User.create({ name, email, phoneNumber, college, semester }); console.log('New user created:', newUser); return res.status(201).json({ diff --git a/backend/models/User.js b/backend/models/User.js index d783268..7f63580 100644 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -27,6 +27,13 @@ const UserSchema = new mongoose.Schema({ trim: true, minlength: 2, maxlength: 100 + }, + semester: { + type: String, + required: true, + trim: true, + minlength: 1, + maxlength: 20 } }, { timestamps: true }); From 7911bc18a184ab0b811241409d33cceafea0a0fb Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 21:15:54 +0530 Subject: [PATCH 05/34] Add semester attribute in User model --- backend/controllers/registerController.js | 53 ++++++++++++----------- backend/models/User.js | 3 +- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index f36779d..36b6530 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -1,30 +1,30 @@ import User from "../models/User.js"; const handleNewRegistration = async (req, res) => { + const { name, email, phoneNumber, college, semester } = req.body; + + // Validate required fields + if (!name || !email || !phoneNumber || !college || !semester) { + return res.status(400).json({ message: 'All fields are required.' }); + } + + // Check for duplicate email and phone number in parallel + const [duplicateEmail, duplicatePhoneNo] = await Promise.all([ + User.findOne({ email }), + User.findOne({ phoneNumber }) + ]); + + if (duplicateEmail) { + console.log('Duplicate email found:', duplicateEmail); + return res.status(409).json({ message: 'Email already registered.' }); + } + + if (duplicatePhoneNo) { + console.log('Duplicate phone number found:', duplicatePhoneNo); + return res.status(409).json({ message: 'Phone number already registered.' }); + } + try { - const { name, email, phoneNumber, college, semester } = req.body; - - // Validate required fields - if (!name || !email || !phoneNumber || !college || !semester) { - return res.status(400).json({ message: 'All fields are required.' }); - } - - // Check for duplicate email and phone number in parallel - const [duplicateEmail, duplicatePhoneNo] = await Promise.all([ - User.findOne({ email }), - User.findOne({ phoneNumber }) - ]); - - if (duplicateEmail) { - console.log('Duplicate email found:', duplicateEmail); - return res.status(409).json({ message: 'Email already registered.' }); - } - - if (duplicatePhoneNo) { - console.log('Duplicate phone number found:', duplicatePhoneNo); - return res.status(409).json({ message: 'Phone number already registered.' }); - } - // Create a new user const newUser = await User.create({ name, email, phoneNumber, college, semester }); @@ -34,10 +34,13 @@ const handleNewRegistration = async (req, res) => { user: newUser, // Include the created user details if needed }); } catch (error) { - console.error('Error handling new registration:', error.message); - return res.status(500).json({ message: 'Internal server error.' }); + console.error('Error handling new registration: \n',error, error.message); + return res.status(500).json({ message: error.message }); } }; + + + export default handleNewRegistration \ No newline at end of file diff --git a/backend/models/User.js b/backend/models/User.js index 7f63580..591a4fc 100644 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -19,7 +19,8 @@ const UserSchema = new mongoose.Schema({ phoneNumber: { type: String, required: true, - unique: true + unique: true, + match: /^\d{10}$/ }, college: { type: String, From 2dfe7c1698c87dc7b1e648e690ce35532c578176 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 23:26:10 +0530 Subject: [PATCH 06/34] Add ConfirmationEmail funtionality --- backend/controllers/registerController.js | 40 +++++++++++++++++++++++ package-lock.json | 21 ++++++++++++ package.json | 5 +++ 3 files changed, 66 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index 36b6530..1f00f0b 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -1,4 +1,5 @@ import User from "../models/User.js"; +import nodemailer from 'nodemailer' const handleNewRegistration = async (req, res) => { const { name, email, phoneNumber, college, semester } = req.body; @@ -29,6 +30,8 @@ const handleNewRegistration = async (req, res) => { const newUser = await User.create({ name, email, phoneNumber, college, semester }); console.log('New user created:', newUser); + // Send confirmation email + await sendConfirmationEmail(name, email); return res.status(201).json({ message: `New user '${newUser.name}' created successfully.`, user: newUser, // Include the created user details if needed @@ -39,7 +42,44 @@ const handleNewRegistration = async (req, res) => { } }; +const sendConfirmationEmail=async(name, email)=>{ + try{ + const transporter= nodemailer.createTransport({ + // host:"smtp.ethereal.email", + // port:587, + // secure:false, + service:"Gmail", + auth:{ + user:"open8hub@gmail.com", + pass:process.env.EMAIL_PASSWORD + } + }); + + const mailOptions={ + from:'"Hack-This-Spring Team" open8hub@gmail.com', + to: email, + subject: 'Registration Confirmation for Hack This Spring', + text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, + html:` +

Dear ${name},

+

Thank you for registering for HackThisSpring! We are thrilled to have you onboard for this exciting hackathon, organized by the OpenHub Community.

+

In the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, exchange ideas, and form your teams for the event. We encourage you to actively participate and collaborate with your fellow developers.

+

We are excited about your participation in HackThisSpring and wish you the best of luck as you prepare for the hackathon.

+

Best regards,

+

The HackThisSpring Team

+ ` + }; + + //Send mail + await transporter.sendMail(mailOptions); + console.log(`Confirmation email sent to ${email}`); + } + catch (error) { + console.error('Error sending confirmation email:', error.message); + throw new Error('Failed to send confirmation email.'); + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..21a5786 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,21 @@ +{ + "name": "Hack-This-Spring", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "nodemailer": "^6.9.16" + } + }, + "node_modules/nodemailer": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", + "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..35f6b84 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "nodemailer": "^6.9.16" + } +} From 21139997ba38ee2f107f10791daa125a57c17a52 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Mon, 13 Jan 2025 23:29:10 +0530 Subject: [PATCH 07/34] Fix bugs --- backend/package-lock.json | 12 +++++++++++- backend/package.json | 5 +++-- package-lock.json | 21 --------------------- package.json | 5 ----- 4 files changed, 14 insertions(+), 29 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/backend/package-lock.json b/backend/package-lock.json index c363562..4e6a33c 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -10,7 +10,8 @@ "license": "ISC", "dependencies": { "express": "^4.21.2", - "mongoose": "^8.9.4" + "mongoose": "^8.9.4", + "nodemailer": "^6.9.16" } }, "node_modules/@mongodb-js/saslprep": { @@ -723,6 +724,15 @@ "node": ">= 0.6" } }, + "node_modules/nodemailer": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", + "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", diff --git a/backend/package.json b/backend/package.json index de9c237..599a6a0 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,7 @@ "main": "index.js", "type": "module", "scripts": { - "dev":"node --env-file=.env --watch server.js " + "dev": "node --env-file=.env --watch server.js " }, "keywords": [], "author": "", @@ -12,6 +12,7 @@ "description": "", "dependencies": { "express": "^4.21.2", - "mongoose": "^8.9.4" + "mongoose": "^8.9.4", + "nodemailer": "^6.9.16" } } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 21a5786..0000000 --- a/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "Hack-This-Spring", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "nodemailer": "^6.9.16" - } - }, - "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 35f6b84..0000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "nodemailer": "^6.9.16" - } -} From b01f0b6276299f86f2ec90b4550fae6ad620cbb0 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Tue, 14 Jan 2025 00:32:04 +0530 Subject: [PATCH 08/34] Add cors middleware --- backend/package-lock.json | 23 +++++++++++++++++++++++ backend/package.json | 1 + backend/server.js | 5 +++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 4e6a33c..b5b22e2 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "cors": "^2.8.5", "express": "^4.21.2", "mongoose": "^8.9.4", "nodemailer": "^6.9.16" @@ -179,6 +180,19 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -733,6 +747,15 @@ "node": ">=6.0.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", diff --git a/backend/package.json b/backend/package.json index 599a6a0..592ceee 100644 --- a/backend/package.json +++ b/backend/package.json @@ -11,6 +11,7 @@ "license": "ISC", "description": "", "dependencies": { + "cors": "^2.8.5", "express": "^4.21.2", "mongoose": "^8.9.4", "nodemailer": "^6.9.16" diff --git a/backend/server.js b/backend/server.js index c58a006..247ecc8 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,12 +1,13 @@ import express from 'express' import mongoose from 'mongoose'; import connectDb from './config/DBconn.js'; +import cors from 'cors' import register from './routes/registerRoute.js'; const app=express(); const PORT=process.env.PORT ||8000; -// app.use(cors()); -// app.use( express.urlencoded({extended:false}) ); +app.use(cors()); +app.use( express.urlencoded({extended:false}) ); app.use(express.json()); app.use('/register',register); From 84a6cacd18b8616d958842795fa14aad8fce0411 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Tue, 14 Jan 2025 17:20:57 +0530 Subject: [PATCH 09/34] Add admin route --- backend/controllers/adminController.js | 13 +++++++++++++ backend/middlewares/verifyAdmin.js | 18 ++++++++++++++++++ backend/routes/adminRoute.js | 9 +++++++++ backend/server.js | 2 ++ 4 files changed, 42 insertions(+) create mode 100644 backend/controllers/adminController.js create mode 100644 backend/middlewares/verifyAdmin.js create mode 100644 backend/routes/adminRoute.js diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js new file mode 100644 index 0000000..548e68e --- /dev/null +++ b/backend/controllers/adminController.js @@ -0,0 +1,13 @@ +import User from "../models/User.js"; + +const getAllStudents=async (req,res)=>{ + try { + const users = await User.find(); // Fetch all registered users + console.log(users) + res.json(users); + } catch (err) { + res.status(500).json({ message: 'Server error-Couldnt fetch the students', error: err.message }); + } +} + +export default getAllStudents; \ No newline at end of file diff --git a/backend/middlewares/verifyAdmin.js b/backend/middlewares/verifyAdmin.js new file mode 100644 index 0000000..ce95e25 --- /dev/null +++ b/backend/middlewares/verifyAdmin.js @@ -0,0 +1,18 @@ + + +const verifyAdmin=(req, res, next)=>{ + const ADMIN_USERNAME = process.env.ADMIN_USERNAME ; + const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD; + + const {adminId,password} = req.body; + if(!adminId || !password ) return res.status(400).json({'message':'adminId and password are required...'}); + + if (adminId === ADMIN_USERNAME && password===ADMIN_PASSWORD) { + return next(); + } else { + return res.status(401).send('Unauthorized: Invalid credentials.'); + } + + +} +export default verifyAdmin; \ No newline at end of file diff --git a/backend/routes/adminRoute.js b/backend/routes/adminRoute.js new file mode 100644 index 0000000..4dfd7b5 --- /dev/null +++ b/backend/routes/adminRoute.js @@ -0,0 +1,9 @@ +import express from 'express'; +import getAllStudents from '../controllers/adminController.js'; +import verifyAdmin from '../middlewares/verifyAdmin.js'; + +const router=express.Router(); + +router.post('/', verifyAdmin ,getAllStudents); + +export default router \ No newline at end of file diff --git a/backend/server.js b/backend/server.js index 247ecc8..5827522 100644 --- a/backend/server.js +++ b/backend/server.js @@ -3,6 +3,7 @@ import mongoose from 'mongoose'; import connectDb from './config/DBconn.js'; import cors from 'cors' import register from './routes/registerRoute.js'; +import admin from './routes/adminRoute.js'; const app=express(); const PORT=process.env.PORT ||8000; @@ -11,6 +12,7 @@ app.use( express.urlencoded({extended:false}) ); app.use(express.json()); app.use('/register',register); +app.use('/admin',admin); connectDb(process.env.DATABASE_URI) mongoose.connection.once('open',()=>{ From 7b9374fd53e770ea6ed92734f92cbabe17954e1a Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Wed, 15 Jan 2025 01:44:00 +0530 Subject: [PATCH 10/34] Add gender and T&M attribute --- backend/controllers/registerController.js | 10 +++++++--- backend/models/User.js | 8 ++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index 1f00f0b..2335854 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -2,10 +2,10 @@ import User from "../models/User.js"; import nodemailer from 'nodemailer' const handleNewRegistration = async (req, res) => { - const { name, email, phoneNumber, college, semester } = req.body; + const { name, email, phoneNumber, college, semester,gender, agree } = req.body; // Validate required fields - if (!name || !email || !phoneNumber || !college || !semester) { + if (!name || !email || !phoneNumber || !college || !semester, !gender, !agree) { return res.status(400).json({ message: 'All fields are required.' }); } @@ -15,6 +15,10 @@ const handleNewRegistration = async (req, res) => { User.findOne({ phoneNumber }) ]); + if (duplicateEmail && duplicatePhoneNo) { + console.log('Duplicate email and PhoneNO found:', duplicateEmail); + return res.status(409).json({ message: 'Email and Phone Number already registered.' }); + } if (duplicateEmail) { console.log('Duplicate email found:', duplicateEmail); return res.status(409).json({ message: 'Email already registered.' }); @@ -31,7 +35,7 @@ const handleNewRegistration = async (req, res) => { console.log('New user created:', newUser); // Send confirmation email - await sendConfirmationEmail(name, email); + //await sendConfirmationEmail(name, email); return res.status(201).json({ message: `New user '${newUser.name}' created successfully.`, user: newUser, // Include the created user details if needed diff --git a/backend/models/User.js b/backend/models/User.js index 591a4fc..b74ad84 100644 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -35,6 +35,14 @@ const UserSchema = new mongoose.Schema({ trim: true, minlength: 1, maxlength: 20 + }, + gender: { + type: String, + required: true, + }, + agree: { + type: Boolean, + required: true } }, { timestamps: true }); From 641da76d72d6cf7ba6cdf522857d8287b78ffcba Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Wed, 15 Jan 2025 01:46:41 +0530 Subject: [PATCH 11/34] Fix bugs --- backend/controllers/registerController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index 2335854..5fb82a6 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -31,7 +31,7 @@ const handleNewRegistration = async (req, res) => { try { // Create a new user - const newUser = await User.create({ name, email, phoneNumber, college, semester }); + const newUser = await User.create({ name, email, phoneNumber, college, semester, gender, agree }); console.log('New user created:', newUser); // Send confirmation email From 7a637610cae98ba48be3e6e1f2849f861e687c80 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Wed, 15 Jan 2025 23:20:56 +0530 Subject: [PATCH 12/34] Add Subscriber model --- backend/models/Subscriber.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 backend/models/Subscriber.js diff --git a/backend/models/Subscriber.js b/backend/models/Subscriber.js new file mode 100644 index 0000000..030a34d --- /dev/null +++ b/backend/models/Subscriber.js @@ -0,0 +1,13 @@ +import mongoose from "mongoose"; + +const SubscriberSchema= new mongoose.Schema({ + email: { + type: String, + required: true, + unique: true, + trim: true, + lowercase: true, + match: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + } +}); +export default mongoose.model('Subscriber',SubscriberSchema); \ No newline at end of file From a995f34b2091e3ed6ca74ffad7812e2d5c8d7401 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Wed, 15 Jan 2025 23:32:05 +0530 Subject: [PATCH 13/34] Add newsletter route --- backend/controllers/newsletterController.js | 34 +++++++++++++++++++++ backend/routes/newsletterRoute.js | 8 +++++ 2 files changed, 42 insertions(+) create mode 100644 backend/controllers/newsletterController.js create mode 100644 backend/routes/newsletterRoute.js diff --git a/backend/controllers/newsletterController.js b/backend/controllers/newsletterController.js new file mode 100644 index 0000000..faa26c3 --- /dev/null +++ b/backend/controllers/newsletterController.js @@ -0,0 +1,34 @@ +import Subscribers from "../models/Subscriber.js"; +import sendConfirmationEmail from "../services/emailService.js"; + +const handleNewSubscriber = async (req, res) => { + const { email } = req.body; + if (!email) { + return res.status(400).json({ message: 'Enter email to subscribe to the newsletter' }); + } + const duplicateEmail = await Subscribers.findOne({ email }); + + if (duplicateEmail) { + console.log('Duplicate email found:', duplicateEmail); + return res.status(409).json({ message: 'Email already registered.' }); + } + + try { + // Create a new subscriber + const newSubscriber = await Subscribers.create({ email }); + + console.log('New subscriber created:', newSubscriber); + + // Send confirmation email + await sendConfirmationEmail(email); + + return res.status(201).json({ + message: `New subscriber '${newSubscriber.email}' added successfully.` + }); + } catch (error) { + console.error('Error handling new subscription:', error); + return res.status(500).json({ message: 'Internal server error while handling new subscription' }); + } +}; + +export default handleNewSubscriber; diff --git a/backend/routes/newsletterRoute.js b/backend/routes/newsletterRoute.js new file mode 100644 index 0000000..698d769 --- /dev/null +++ b/backend/routes/newsletterRoute.js @@ -0,0 +1,8 @@ +import express from 'express'; +import handleNewSubscriber from '../controllers/newsletterController.js'; + +const router=express.Router(); + +router.post('/',handleNewSubscriber); + +export default router \ No newline at end of file From e5238b92dfdaa5eae0da5999e6acacd90aa8ad5f Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Wed, 15 Jan 2025 23:38:14 +0530 Subject: [PATCH 14/34] Refactor: Extract sendConfirmationEmail function to services/emailService.js --- backend/controllers/newsletterController.js | 2 +- backend/controllers/registerController.js | 45 +-------------------- backend/server.js | 2 + backend/services/emailService.js | 42 +++++++++++++++++++ 4 files changed, 47 insertions(+), 44 deletions(-) create mode 100644 backend/services/emailService.js diff --git a/backend/controllers/newsletterController.js b/backend/controllers/newsletterController.js index faa26c3..083d426 100644 --- a/backend/controllers/newsletterController.js +++ b/backend/controllers/newsletterController.js @@ -20,7 +20,7 @@ const handleNewSubscriber = async (req, res) => { console.log('New subscriber created:', newSubscriber); // Send confirmation email - await sendConfirmationEmail(email); + //await sendConfirmationEmail(email); return res.status(201).json({ message: `New subscriber '${newSubscriber.email}' added successfully.` diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index 5fb82a6..c0a74ad 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -1,14 +1,12 @@ import User from "../models/User.js"; -import nodemailer from 'nodemailer' +import sendConfirmationEmail from "../services/emailService.js"; const handleNewRegistration = async (req, res) => { const { name, email, phoneNumber, college, semester,gender, agree } = req.body; - // Validate required fields if (!name || !email || !phoneNumber || !college || !semester, !gender, !agree) { return res.status(400).json({ message: 'All fields are required.' }); } - // Check for duplicate email and phone number in parallel const [duplicateEmail, duplicatePhoneNo] = await Promise.all([ User.findOne({ email }), @@ -37,8 +35,7 @@ const handleNewRegistration = async (req, res) => { // Send confirmation email //await sendConfirmationEmail(name, email); return res.status(201).json({ - message: `New user '${newUser.name}' created successfully.`, - user: newUser, // Include the created user details if needed + message: `New user '${newUser.name}' created successfully.`//, user: newUser, // Include the created user details if needed }); } catch (error) { console.error('Error handling new registration: \n',error, error.message); @@ -46,44 +43,6 @@ const handleNewRegistration = async (req, res) => { } }; -const sendConfirmationEmail=async(name, email)=>{ - try{ - const transporter= nodemailer.createTransport({ - // host:"smtp.ethereal.email", - // port:587, - // secure:false, - service:"Gmail", - auth:{ - user:"open8hub@gmail.com", - pass:process.env.EMAIL_PASSWORD - } - }); - - const mailOptions={ - from:'"Hack-This-Spring Team" open8hub@gmail.com', - to: email, - subject: 'Registration Confirmation for Hack This Spring', - text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, - html:` -

Dear ${name},

-

Thank you for registering for HackThisSpring! We are thrilled to have you onboard for this exciting hackathon, organized by the OpenHub Community.

-

In the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, exchange ideas, and form your teams for the event. We encourage you to actively participate and collaborate with your fellow developers.

-

We are excited about your participation in HackThisSpring and wish you the best of luck as you prepare for the hackathon.

-

Best regards,

-

The HackThisSpring Team

- ` - }; - - //Send mail - await transporter.sendMail(mailOptions); - console.log(`Confirmation email sent to ${email}`); - - } - catch (error) { - console.error('Error sending confirmation email:', error.message); - throw new Error('Failed to send confirmation email.'); - } -} diff --git a/backend/server.js b/backend/server.js index 5827522..6dd4403 100644 --- a/backend/server.js +++ b/backend/server.js @@ -4,6 +4,7 @@ import connectDb from './config/DBconn.js'; import cors from 'cors' import register from './routes/registerRoute.js'; import admin from './routes/adminRoute.js'; +import newsletter from './routes/newsletterRoute.js'; const app=express(); const PORT=process.env.PORT ||8000; @@ -13,6 +14,7 @@ app.use(express.json()); app.use('/register',register); app.use('/admin',admin); +app.use('/newsletter',newsletter); connectDb(process.env.DATABASE_URI) mongoose.connection.once('open',()=>{ diff --git a/backend/services/emailService.js b/backend/services/emailService.js new file mode 100644 index 0000000..e5329f4 --- /dev/null +++ b/backend/services/emailService.js @@ -0,0 +1,42 @@ +import nodemailer from 'nodemailer' + +const sendConfirmationEmail=async(name, email)=>{ + try{ + const transporter= nodemailer.createTransport({ + // host:"smtp.ethereal.email", + // port:587, + // secure:false, + service:"Gmail", + auth:{ + user:"open8hub@gmail.com", + pass:process.env.EMAIL_PASSWORD + } + }); + + const mailOptions={ + from:'"Hack-This-Spring Team" open8hub@gmail.com', + to: email, + subject: 'Registration Confirmation for Hack This Spring', + text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, + html:` +

Dear ${name},

+

Thank you for registering for HackThisSpring! We are thrilled to have you onboard for this exciting hackathon, organized by the OpenHub Community.

+

In the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, exchange ideas, and form your teams for the event. We encourage you to actively participate and collaborate with your fellow developers.

+

We are excited about your participation in HackThisSpring and wish you the best of luck as you prepare for the hackathon.

+

Best regards,

+

The HackThisSpring Team

+ ` + }; + + //Send mail + await transporter.sendMail(mailOptions); + console.log(`Confirmation email sent to ${email}`); + + } + catch (error) { + console.error('Error sending confirmation email:', error.message); + throw new Error('Failed to send confirmation email.'); + } +} + +export default sendConfirmationEmail; \ No newline at end of file From fd82f6ac47f1f8f731e0680b9e06901ba55655bd Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 00:22:55 +0530 Subject: [PATCH 15/34] Fix bugs --- backend/controllers/newsletterController.js | 40 ++++++++++++++++----- backend/controllers/registerController.js | 20 ++++++++++- backend/services/emailService.js | 19 +--------- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/backend/controllers/newsletterController.js b/backend/controllers/newsletterController.js index 083d426..70b9aec 100644 --- a/backend/controllers/newsletterController.js +++ b/backend/controllers/newsletterController.js @@ -6,22 +6,46 @@ const handleNewSubscriber = async (req, res) => { if (!email) { return res.status(400).json({ message: 'Enter email to subscribe to the newsletter' }); } - const duplicateEmail = await Subscribers.findOne({ email }); - + const duplicateEmail = await Subscribers.findOne({ email }); if (duplicateEmail) { console.log('Duplicate email found:', duplicateEmail); return res.status(409).json({ message: 'Email already registered.' }); - } - - try { + } // Create a new subscriber + try { const newSubscriber = await Subscribers.create({ email }); - console.log('New subscriber created:', newSubscriber); // Send confirmation email - //await sendConfirmationEmail(email); - + const mailOptions = { + from: '"Open Hub Community" ', + to: email, + subject: 'Welcome to Open Hub Community Newsletter! πŸŽ‰', + text: `Hi there! \n\nThank you for subscribing to the Open Hub Community newsletter! πŸŽ‰ We're excited to have you onboard and look forward to bringing you the latest updates on open-source projects, tech trends, and collaboration opportunities. πŸ’»βœ¨\n\nAs a subscriber, you'll be the first to know about new initiatives, tutorials, and news from our community. Stay tuned for upcoming newsletters packed with valuable insights and opportunities to engage with like-minded tech enthusiasts! πŸš€\n\nFeel free to reach out to us if you have any questions or suggestions. We’d love to hear from you! πŸ’¬\n\nIf you’re interested in joining our community and collaborating with us directly, click here to join: https://github.com/Open-Hub-Community/Support/issues/new?assignees=&labels=invite+me+to+the+community&projects=&template=invitation.yml&title=Please+invite+me+to+the+Open+Hub+Community+Organization πŸ”—\n\nBest regards,\nNaik Mubashir\nFounder, Open Hub Community\n\nFollow us on:\nLinkedIn: https://www.linkedin.com/company/open8hub\nGitHub: https://www.github.com/Open-Hub-Community\nTwitter: https://www.x.com/open8hub\n\nπŸš€ Let's build something amazing together!`, + html: ` +

Hi there!

+

Thank you for subscribing to the Open Hub Community newsletter! πŸŽ‰ We are thrilled to have you as part of our growing community and are excited to bring you the latest updates on open-source projects, tech trends, and collaboration opportunities. πŸ’»βœ¨

+

As a subscriber, you'll be the first to know about:

+
    +
  • Exclusive open-source projects and collaboration opportunities. πŸ”§
  • +
  • Helpful resources and tutorials to enhance your skills. πŸ“š
  • +
  • Latest news and trends in the world of tech and innovation. 🌐
  • +
+

We encourage you to stay engaged and participate in upcoming events. If you ever have any questions, feedback, or suggestions, don’t hesitate to reach out. We’re always happy to hear from you! πŸ’¬

+

If you’re interested in joining our community and collaborating with us directly, click here to join the Open Hub Community πŸ”—.

+

Best regards,

+

Naik Mubashir
Founder, Open Hub Community

+

Follow us on:

+

+ LinkedIn | + GitHub | + Twitter +

+

πŸš€ Let's build something amazing together!

+ ` + }; + + await sendConfirmationEmail(email,mailOptions); return res.status(201).json({ message: `New subscriber '${newSubscriber.email}' added successfully.` }); diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index c0a74ad..ce728e3 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -32,8 +32,26 @@ const handleNewRegistration = async (req, res) => { const newUser = await User.create({ name, email, phoneNumber, college, semester, gender, agree }); console.log('New user created:', newUser); + + + const mailOptions={ + from:'"Hack-This-Spring Team" open8hub@gmail.com', + to: email, + subject: 'Registration Confirmation for Hack This Spring', + text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, + html:` +

Dear ${name},

+

Thank you for registering for HackThisSpring! We are thrilled to have you onboard for this exciting hackathon, organized by the OpenHub Community.

+

In the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, exchange ideas, and form your teams for the event. We encourage you to actively participate and collaborate with your fellow developers.

+

We are excited about your participation in HackThisSpring and wish you the best of luck as you prepare for the hackathon.

+

Best regards,

+

The HackThisSpring Team

+ ` + }; + + // Send confirmation email - //await sendConfirmationEmail(name, email); + await sendConfirmationEmail( email, mailOptions); return res.status(201).json({ message: `New user '${newUser.name}' created successfully.`//, user: newUser, // Include the created user details if needed }); diff --git a/backend/services/emailService.js b/backend/services/emailService.js index e5329f4..9a44e0f 100644 --- a/backend/services/emailService.js +++ b/backend/services/emailService.js @@ -1,6 +1,6 @@ import nodemailer from 'nodemailer' -const sendConfirmationEmail=async(name, email)=>{ +const sendConfirmationEmail=async( email,mailOptions)=>{ try{ const transporter= nodemailer.createTransport({ // host:"smtp.ethereal.email", @@ -12,26 +12,9 @@ const sendConfirmationEmail=async(name, email)=>{ pass:process.env.EMAIL_PASSWORD } }); - - const mailOptions={ - from:'"Hack-This-Spring Team" open8hub@gmail.com', - to: email, - subject: 'Registration Confirmation for Hack This Spring', - text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, - html:` -

Dear ${name},

-

Thank you for registering for HackThisSpring! We are thrilled to have you onboard for this exciting hackathon, organized by the OpenHub Community.

-

In the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, exchange ideas, and form your teams for the event. We encourage you to actively participate and collaborate with your fellow developers.

-

We are excited about your participation in HackThisSpring and wish you the best of luck as you prepare for the hackathon.

-

Best regards,

-

The HackThisSpring Team

- ` - }; - //Send mail await transporter.sendMail(mailOptions); console.log(`Confirmation email sent to ${email}`); - } catch (error) { console.error('Error sending confirmation email:', error.message); From 79e3d66091b2bccb2fe1f8403471e46f3183d553 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 14:47:01 +0530 Subject: [PATCH 16/34] Update admin route --- backend/controllers/adminController.js | 8 +++++++- backend/routes/adminRoute.js | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js index 548e68e..f0e8207 100644 --- a/backend/controllers/adminController.js +++ b/backend/controllers/adminController.js @@ -1,13 +1,19 @@ import User from "../models/User.js"; +import Subscriber from "../models/Subscriber.js"; const getAllStudents=async (req,res)=>{ try { const users = await User.find(); // Fetch all registered users console.log(users) - res.json(users); + const subscribers = await Subscriber.find(); // Fetch all registered users + console.log(subscribers) + res.json([users?.length ? users : [], subscribers?.length ? subscribers : []]); } catch (err) { res.status(500).json({ message: 'Server error-Couldnt fetch the students', error: err.message }); } } + + + export default getAllStudents; \ No newline at end of file diff --git a/backend/routes/adminRoute.js b/backend/routes/adminRoute.js index 4dfd7b5..60867ad 100644 --- a/backend/routes/adminRoute.js +++ b/backend/routes/adminRoute.js @@ -6,4 +6,5 @@ const router=express.Router(); router.post('/', verifyAdmin ,getAllStudents); + export default router \ No newline at end of file From e0a7f1d64aa8b901ba59bf0e57cea8edce2ecb83 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 14:55:23 +0530 Subject: [PATCH 17/34] Remove .gitignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1dcef2d..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -.env \ No newline at end of file From 3776aaf6ec96d7ce61d48638069e80af9583c805 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 15:00:48 +0530 Subject: [PATCH 18/34] Rename backend folder --- {backend => backend1}/config/DBconn.js | 0 {backend => backend1}/controllers/adminController.js | 0 {backend => backend1}/controllers/newsletterController.js | 0 {backend => backend1}/controllers/registerController.js | 0 {backend => backend1}/middlewares/verifyAdmin.js | 0 {backend => backend1}/models/Subscriber.js | 0 {backend => backend1}/models/User.js | 0 {backend => backend1}/package-lock.json | 0 {backend => backend1}/package.json | 0 {backend => backend1}/routes/adminRoute.js | 0 {backend => backend1}/routes/newsletterRoute.js | 0 {backend => backend1}/routes/registerRoute.js | 0 {backend => backend1}/server.js | 0 {backend => backend1}/services/emailService.js | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename {backend => backend1}/config/DBconn.js (100%) rename {backend => backend1}/controllers/adminController.js (100%) rename {backend => backend1}/controllers/newsletterController.js (100%) rename {backend => backend1}/controllers/registerController.js (100%) rename {backend => backend1}/middlewares/verifyAdmin.js (100%) rename {backend => backend1}/models/Subscriber.js (100%) rename {backend => backend1}/models/User.js (100%) rename {backend => backend1}/package-lock.json (100%) rename {backend => backend1}/package.json (100%) rename {backend => backend1}/routes/adminRoute.js (100%) rename {backend => backend1}/routes/newsletterRoute.js (100%) rename {backend => backend1}/routes/registerRoute.js (100%) rename {backend => backend1}/server.js (100%) rename {backend => backend1}/services/emailService.js (100%) diff --git a/backend/config/DBconn.js b/backend1/config/DBconn.js similarity index 100% rename from backend/config/DBconn.js rename to backend1/config/DBconn.js diff --git a/backend/controllers/adminController.js b/backend1/controllers/adminController.js similarity index 100% rename from backend/controllers/adminController.js rename to backend1/controllers/adminController.js diff --git a/backend/controllers/newsletterController.js b/backend1/controllers/newsletterController.js similarity index 100% rename from backend/controllers/newsletterController.js rename to backend1/controllers/newsletterController.js diff --git a/backend/controllers/registerController.js b/backend1/controllers/registerController.js similarity index 100% rename from backend/controllers/registerController.js rename to backend1/controllers/registerController.js diff --git a/backend/middlewares/verifyAdmin.js b/backend1/middlewares/verifyAdmin.js similarity index 100% rename from backend/middlewares/verifyAdmin.js rename to backend1/middlewares/verifyAdmin.js diff --git a/backend/models/Subscriber.js b/backend1/models/Subscriber.js similarity index 100% rename from backend/models/Subscriber.js rename to backend1/models/Subscriber.js diff --git a/backend/models/User.js b/backend1/models/User.js similarity index 100% rename from backend/models/User.js rename to backend1/models/User.js diff --git a/backend/package-lock.json b/backend1/package-lock.json similarity index 100% rename from backend/package-lock.json rename to backend1/package-lock.json diff --git a/backend/package.json b/backend1/package.json similarity index 100% rename from backend/package.json rename to backend1/package.json diff --git a/backend/routes/adminRoute.js b/backend1/routes/adminRoute.js similarity index 100% rename from backend/routes/adminRoute.js rename to backend1/routes/adminRoute.js diff --git a/backend/routes/newsletterRoute.js b/backend1/routes/newsletterRoute.js similarity index 100% rename from backend/routes/newsletterRoute.js rename to backend1/routes/newsletterRoute.js diff --git a/backend/routes/registerRoute.js b/backend1/routes/registerRoute.js similarity index 100% rename from backend/routes/registerRoute.js rename to backend1/routes/registerRoute.js diff --git a/backend/server.js b/backend1/server.js similarity index 100% rename from backend/server.js rename to backend1/server.js diff --git a/backend/services/emailService.js b/backend1/services/emailService.js similarity index 100% rename from backend/services/emailService.js rename to backend1/services/emailService.js From 077f019f4b4e0568f07905a9339766458710d90d Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:13:02 +0530 Subject: [PATCH 19/34] Update package.json --- backend1/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend1/package.json b/backend1/package.json index 592ceee..be3d595 100644 --- a/backend1/package.json +++ b/backend1/package.json @@ -4,7 +4,8 @@ "main": "index.js", "type": "module", "scripts": { - "dev": "node --env-file=.env --watch server.js " + "build":"npm install" + "start": "node --env-file=.env --watch server.js " }, "keywords": [], "author": "", From 1d3eeadd6b4060959771227c0ac0d010e28017f6 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:19:05 +0530 Subject: [PATCH 20/34] Update package.json --- backend1/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend1/package.json b/backend1/package.json index be3d595..919e8e0 100644 --- a/backend1/package.json +++ b/backend1/package.json @@ -5,7 +5,9 @@ "type": "module", "scripts": { "build":"npm install" - "start": "node --env-file=.env --watch server.js " + "dev": "node --env-file=.env --watch server.js ", + "start": "node server.js ", + }, "keywords": [], "author": "", From d48f8b101d02ba9dc9452c6b226b69b263952bf1 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:20:53 +0530 Subject: [PATCH 21/34] Update package.json --- backend1/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend1/package.json b/backend1/package.json index 919e8e0..07e1f37 100644 --- a/backend1/package.json +++ b/backend1/package.json @@ -4,7 +4,7 @@ "main": "index.js", "type": "module", "scripts": { - "build":"npm install" + "build":"npm install", "dev": "node --env-file=.env --watch server.js ", "start": "node server.js ", From 6c7398719a25b43d899bcfd581a015d5e8f79cb1 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:23:50 +0530 Subject: [PATCH 22/34] Update package.json --- backend1/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend1/package.json b/backend1/package.json index 07e1f37..d978351 100644 --- a/backend1/package.json +++ b/backend1/package.json @@ -6,7 +6,7 @@ "scripts": { "build":"npm install", "dev": "node --env-file=.env --watch server.js ", - "start": "node server.js ", + "start": "node server.js " }, "keywords": [], From d3dc65fa5c8b0a19fb149948c1b42aa1ce064d56 Mon Sep 17 00:00:00 2001 From: ANAN Date: Thu, 16 Jan 2025 16:19:00 +0530 Subject: [PATCH 23/34] Update README.md --- README.md | 48 +++++++++--------------------------------------- 1 file changed, 9 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 880d484..8b8a845 100644 --- a/README.md +++ b/README.md @@ -19,44 +19,6 @@ Welcome to **Hack This Spring**, a dynamic hackathon platform developed by the O --- -## πŸ–₯️ Setup Instructions - -1. **Clone the repository:** - ```bash - git clone https://github.com/OpenHubCommunity/HackThisSpring.git - ``` - -2. **Navigate to the project directory:** - ```bash - cd HackThisSpring - ``` - -3. **Install dependencies:** - - Frontend: - ```bash - cd frontend - npm install - ``` - - Backend: - ```bash - cd backend - npm install - ``` - -4. **Run the application:** - - Frontend: - ```bash - npm start - ``` - - Backend: - ```bash - npm start - ``` - -5. Open your browser and navigate to `http://localhost:3000` for the frontend. - ---- - ## 🌟 Credits - **Frontend Developer**: [Anaan](https://github.com/Anan328) @@ -72,4 +34,12 @@ Contributions are welcome! If you would like to improve the project, feel free t ## πŸ“§ Contact -For any queries or collaboration opportunities, reach out to us via our [OpenHub Community page](#). +For any queries or collaboration opportunities, reach out to us via our [OpenHub Community page](https://github.com/Open-Hub-Community). + +--- + +## 🌐 Preview the Site + +Want to see how the site works? Check out the live preview here: [Preview the Site](https://openhubsite.netlify.app/) + +--- From 692683d9f661f1fd748f047698a0a4aa05e2aa21 Mon Sep 17 00:00:00 2001 From: ANAN Date: Thu, 16 Jan 2025 16:23:10 +0530 Subject: [PATCH 24/34] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b8a845..2ba1a86 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,6 @@ For any queries or collaboration opportunities, reach out to us via our [OpenHub ## 🌐 Preview the Site -Want to see how the site works? Check out the live preview here: [Preview the Site](https://openhubsite.netlify.app/) +Want to see how the site works? Check out the live preview here: [Preview the Site](https://openhubsite.web.app/) --- From aaaa1fd7b63a731293f303a24ffcb0bb3f9485a5 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 20:31:59 +0530 Subject: [PATCH 25/34] Add allowedDomains.js --- backend1/config/allowedDomains.js | 3 +++ backend1/controllers/newsletterController.js | 8 +++++++- backend1/controllers/registerController.js | 9 +++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 backend1/config/allowedDomains.js diff --git a/backend1/config/allowedDomains.js b/backend1/config/allowedDomains.js new file mode 100644 index 0000000..30db013 --- /dev/null +++ b/backend1/config/allowedDomains.js @@ -0,0 +1,3 @@ +const allowedDomains = ['mail.com', 'gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com', 'aol.com', 'icloud.com', 'protonmail.com', 'zoho.com', 'gmx.com']; + +export default allowedDomains; \ No newline at end of file diff --git a/backend1/controllers/newsletterController.js b/backend1/controllers/newsletterController.js index 70b9aec..0d3fc8e 100644 --- a/backend1/controllers/newsletterController.js +++ b/backend1/controllers/newsletterController.js @@ -1,16 +1,22 @@ import Subscribers from "../models/Subscriber.js"; import sendConfirmationEmail from "../services/emailService.js"; - +import allowedDomains from "../config/allowedDomains.js"; const handleNewSubscriber = async (req, res) => { const { email } = req.body; if (!email) { return res.status(400).json({ message: 'Enter email to subscribe to the newsletter' }); } + // Check if the email domain is allowed + const emailDomain = email.split('@')[1]; + if (!allowedDomains.includes(emailDomain)) { + return res.status(400).json({ message: 'Email domain not allowed.' }); + } const duplicateEmail = await Subscribers.findOne({ email }); if (duplicateEmail) { console.log('Duplicate email found:', duplicateEmail); return res.status(409).json({ message: 'Email already registered.' }); } + // Create a new subscriber try { const newSubscriber = await Subscribers.create({ email }); diff --git a/backend1/controllers/registerController.js b/backend1/controllers/registerController.js index ce728e3..f0e5968 100644 --- a/backend1/controllers/registerController.js +++ b/backend1/controllers/registerController.js @@ -1,5 +1,6 @@ import User from "../models/User.js"; import sendConfirmationEmail from "../services/emailService.js"; +import allowedDomains from "../config/allowedDomains.js"; const handleNewRegistration = async (req, res) => { const { name, email, phoneNumber, college, semester,gender, agree } = req.body; @@ -12,7 +13,11 @@ const handleNewRegistration = async (req, res) => { User.findOne({ email }), User.findOne({ phoneNumber }) ]); - + // Check if the email domain is allowed + const emailDomain = email.split('@')[1]; + if (!allowedDomains.includes(emailDomain)) { + return res.status(400).json({ message: 'Email domain not allowed.' }); + } if (duplicateEmail && duplicatePhoneNo) { console.log('Duplicate email and PhoneNO found:', duplicateEmail); return res.status(409).json({ message: 'Email and Phone Number already registered.' }); @@ -26,7 +31,7 @@ const handleNewRegistration = async (req, res) => { console.log('Duplicate phone number found:', duplicatePhoneNo); return res.status(409).json({ message: 'Phone number already registered.' }); } - + try { // Create a new user const newUser = await User.create({ name, email, phoneNumber, college, semester, gender, agree }); From c6bc9f6b68d6404dc0fbdf4d36aa4206a27a5f57 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 20:37:50 +0530 Subject: [PATCH 26/34] Rename folder --- {backend1 => backend}/config/DBconn.js | 0 {backend1 => backend}/config/allowedDomains.js | 0 {backend1 => backend}/controllers/adminController.js | 0 {backend1 => backend}/controllers/newsletterController.js | 0 {backend1 => backend}/controllers/registerController.js | 0 {backend1 => backend}/middlewares/verifyAdmin.js | 0 {backend1 => backend}/models/Subscriber.js | 0 {backend1 => backend}/models/User.js | 0 {backend1 => backend}/package-lock.json | 0 {backend1 => backend}/package.json | 0 {backend1 => backend}/routes/adminRoute.js | 0 {backend1 => backend}/routes/newsletterRoute.js | 0 {backend1 => backend}/routes/registerRoute.js | 0 {backend1 => backend}/server.js | 0 {backend1 => backend}/services/emailService.js | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename {backend1 => backend}/config/DBconn.js (100%) rename {backend1 => backend}/config/allowedDomains.js (100%) rename {backend1 => backend}/controllers/adminController.js (100%) rename {backend1 => backend}/controllers/newsletterController.js (100%) rename {backend1 => backend}/controllers/registerController.js (100%) rename {backend1 => backend}/middlewares/verifyAdmin.js (100%) rename {backend1 => backend}/models/Subscriber.js (100%) rename {backend1 => backend}/models/User.js (100%) rename {backend1 => backend}/package-lock.json (100%) rename {backend1 => backend}/package.json (100%) rename {backend1 => backend}/routes/adminRoute.js (100%) rename {backend1 => backend}/routes/newsletterRoute.js (100%) rename {backend1 => backend}/routes/registerRoute.js (100%) rename {backend1 => backend}/server.js (100%) rename {backend1 => backend}/services/emailService.js (100%) diff --git a/backend1/config/DBconn.js b/backend/config/DBconn.js similarity index 100% rename from backend1/config/DBconn.js rename to backend/config/DBconn.js diff --git a/backend1/config/allowedDomains.js b/backend/config/allowedDomains.js similarity index 100% rename from backend1/config/allowedDomains.js rename to backend/config/allowedDomains.js diff --git a/backend1/controllers/adminController.js b/backend/controllers/adminController.js similarity index 100% rename from backend1/controllers/adminController.js rename to backend/controllers/adminController.js diff --git a/backend1/controllers/newsletterController.js b/backend/controllers/newsletterController.js similarity index 100% rename from backend1/controllers/newsletterController.js rename to backend/controllers/newsletterController.js diff --git a/backend1/controllers/registerController.js b/backend/controllers/registerController.js similarity index 100% rename from backend1/controllers/registerController.js rename to backend/controllers/registerController.js diff --git a/backend1/middlewares/verifyAdmin.js b/backend/middlewares/verifyAdmin.js similarity index 100% rename from backend1/middlewares/verifyAdmin.js rename to backend/middlewares/verifyAdmin.js diff --git a/backend1/models/Subscriber.js b/backend/models/Subscriber.js similarity index 100% rename from backend1/models/Subscriber.js rename to backend/models/Subscriber.js diff --git a/backend1/models/User.js b/backend/models/User.js similarity index 100% rename from backend1/models/User.js rename to backend/models/User.js diff --git a/backend1/package-lock.json b/backend/package-lock.json similarity index 100% rename from backend1/package-lock.json rename to backend/package-lock.json diff --git a/backend1/package.json b/backend/package.json similarity index 100% rename from backend1/package.json rename to backend/package.json diff --git a/backend1/routes/adminRoute.js b/backend/routes/adminRoute.js similarity index 100% rename from backend1/routes/adminRoute.js rename to backend/routes/adminRoute.js diff --git a/backend1/routes/newsletterRoute.js b/backend/routes/newsletterRoute.js similarity index 100% rename from backend1/routes/newsletterRoute.js rename to backend/routes/newsletterRoute.js diff --git a/backend1/routes/registerRoute.js b/backend/routes/registerRoute.js similarity index 100% rename from backend1/routes/registerRoute.js rename to backend/routes/registerRoute.js diff --git a/backend1/server.js b/backend/server.js similarity index 100% rename from backend1/server.js rename to backend/server.js diff --git a/backend1/services/emailService.js b/backend/services/emailService.js similarity index 100% rename from backend1/services/emailService.js rename to backend/services/emailService.js From e3c6896472d41aad5ed7209fe1954c61b1bf9df2 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 21:25:44 +0530 Subject: [PATCH 27/34] Optimise code by sending mails asynchronously --- backend/controllers/newsletterController.js | 2 +- backend/controllers/registerController.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/backend/controllers/newsletterController.js b/backend/controllers/newsletterController.js index 0d3fc8e..3e4de34 100644 --- a/backend/controllers/newsletterController.js +++ b/backend/controllers/newsletterController.js @@ -51,7 +51,7 @@ const handleNewSubscriber = async (req, res) => { ` }; - await sendConfirmationEmail(email,mailOptions); + sendConfirmationEmail(email,mailOptions); return res.status(201).json({ message: `New subscriber '${newSubscriber.email}' added successfully.` }); diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index f0e5968..f835a4d 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -22,12 +22,11 @@ const handleNewRegistration = async (req, res) => { console.log('Duplicate email and PhoneNO found:', duplicateEmail); return res.status(409).json({ message: 'Email and Phone Number already registered.' }); } - if (duplicateEmail) { + else if (duplicateEmail) { console.log('Duplicate email found:', duplicateEmail); return res.status(409).json({ message: 'Email already registered.' }); } - - if (duplicatePhoneNo) { + else if (duplicatePhoneNo) { console.log('Duplicate phone number found:', duplicatePhoneNo); return res.status(409).json({ message: 'Phone number already registered.' }); } @@ -56,7 +55,7 @@ const handleNewRegistration = async (req, res) => { // Send confirmation email - await sendConfirmationEmail( email, mailOptions); + sendConfirmationEmail( email, mailOptions); return res.status(201).json({ message: `New user '${newUser.name}' created successfully.`//, user: newUser, // Include the created user details if needed }); From 25edb024cca12d8ef8783cd093b4d8de009e11b6 Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 22:57:15 +0530 Subject: [PATCH 28/34] Refactor database queries to run in parallel using Promise.all --- backend/controllers/adminController.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js index f0e8207..6719c79 100644 --- a/backend/controllers/adminController.js +++ b/backend/controllers/adminController.js @@ -3,10 +3,10 @@ import Subscriber from "../models/Subscriber.js"; const getAllStudents=async (req,res)=>{ try { - const users = await User.find(); // Fetch all registered users - console.log(users) - const subscribers = await Subscriber.find(); // Fetch all registered users - console.log(subscribers) + const [users, subscribers] = await Promise.all([ + User.find(), // Fetch all registered users + Subscriber.find() // Fetch all subscribers + ]); res.json([users?.length ? users : [], subscribers?.length ? subscribers : []]); } catch (err) { res.status(500).json({ message: 'Server error-Couldnt fetch the students', error: err.message }); From 9f83abe79bdbd9d5dd4a04dc5e3b21edd8886dda Mon Sep 17 00:00:00 2001 From: Naik Mubashir Date: Thu, 16 Jan 2025 22:58:14 +0530 Subject: [PATCH 29/34] Remove console.logs --- backend/controllers/newsletterController.js | 4 ---- backend/controllers/registerController.js | 10 +--------- backend/services/emailService.js | 2 -- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/backend/controllers/newsletterController.js b/backend/controllers/newsletterController.js index 3e4de34..599dab4 100644 --- a/backend/controllers/newsletterController.js +++ b/backend/controllers/newsletterController.js @@ -13,15 +13,12 @@ const handleNewSubscriber = async (req, res) => { } const duplicateEmail = await Subscribers.findOne({ email }); if (duplicateEmail) { - console.log('Duplicate email found:', duplicateEmail); return res.status(409).json({ message: 'Email already registered.' }); } // Create a new subscriber try { const newSubscriber = await Subscribers.create({ email }); - console.log('New subscriber created:', newSubscriber); - // Send confirmation email const mailOptions = { from: '"Open Hub Community" ', @@ -56,7 +53,6 @@ const handleNewSubscriber = async (req, res) => { message: `New subscriber '${newSubscriber.email}' added successfully.` }); } catch (error) { - console.error('Error handling new subscription:', error); return res.status(500).json({ message: 'Internal server error while handling new subscription' }); } }; diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index f835a4d..62318bf 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -19,7 +19,6 @@ const handleNewRegistration = async (req, res) => { return res.status(400).json({ message: 'Email domain not allowed.' }); } if (duplicateEmail && duplicatePhoneNo) { - console.log('Duplicate email and PhoneNO found:', duplicateEmail); return res.status(409).json({ message: 'Email and Phone Number already registered.' }); } else if (duplicateEmail) { @@ -34,10 +33,6 @@ const handleNewRegistration = async (req, res) => { try { // Create a new user const newUser = await User.create({ name, email, phoneNumber, college, semester, gender, agree }); - - console.log('New user created:', newUser); - - const mailOptions={ from:'"Hack-This-Spring Team" open8hub@gmail.com', to: email, @@ -52,15 +47,12 @@ const handleNewRegistration = async (req, res) => {

The HackThisSpring Team

` }; - - // Send confirmation email - sendConfirmationEmail( email, mailOptions); + sendConfirmationEmail( email, mailOptions); return res.status(201).json({ message: `New user '${newUser.name}' created successfully.`//, user: newUser, // Include the created user details if needed }); } catch (error) { - console.error('Error handling new registration: \n',error, error.message); return res.status(500).json({ message: error.message }); } }; diff --git a/backend/services/emailService.js b/backend/services/emailService.js index 9a44e0f..0d0272c 100644 --- a/backend/services/emailService.js +++ b/backend/services/emailService.js @@ -14,10 +14,8 @@ const sendConfirmationEmail=async( email,mailOptions)=>{ }); //Send mail await transporter.sendMail(mailOptions); - console.log(`Confirmation email sent to ${email}`); } catch (error) { - console.error('Error sending confirmation email:', error.message); throw new Error('Failed to send confirmation email.'); } } From 40f61c4569787cef4c6c42fc1f2e81707edd4691 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Fri, 24 Jan 2025 20:56:40 +0530 Subject: [PATCH 30/34] Update registerController.js --- backend/controllers/registerController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index 62318bf..553f830 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -34,7 +34,7 @@ const handleNewRegistration = async (req, res) => { // Create a new user const newUser = await User.create({ name, email, phoneNumber, college, semester, gender, agree }); const mailOptions={ - from:'"Hack-This-Spring Team" open8hub@gmail.com', + from:'"Hack-This-Spring Team" noreply', to: email, subject: 'Registration Confirmation for Hack This Spring', text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, @@ -60,4 +60,4 @@ const handleNewRegistration = async (req, res) => { -export default handleNewRegistration \ No newline at end of file +export default handleNewRegistration From ea2616b17d3f06973f742b392dd6b8abd5316b83 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Fri, 24 Jan 2025 21:08:06 +0530 Subject: [PATCH 31/34] Update registerController.js --- backend/controllers/registerController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/controllers/registerController.js b/backend/controllers/registerController.js index 553f830..7e3e688 100644 --- a/backend/controllers/registerController.js +++ b/backend/controllers/registerController.js @@ -34,7 +34,7 @@ const handleNewRegistration = async (req, res) => { // Create a new user const newUser = await User.create({ name, email, phoneNumber, college, semester, gender, agree }); const mailOptions={ - from:'"Hack-This-Spring Team" noreply', + from:'"Hack-This-Spring Team" open8hub@gmail.com', to: email, subject: 'Registration Confirmation for Hack This Spring', text:`Dear ${name},\n\nThank you for registering for HackThisSpring! We are excited to have you onboard for this prestigious hackathon organized by the OpenHub Community.\n\nIn the coming days, we will be hosting a team-building meet where you will have the opportunity to connect with other developers, discuss ideas, and form your teams for the event. We encourage you to participate actively and collaborate with fellow developers.\n\nWe look forward to seeing you at HackThisSpring and wish you the best of luck!\n\nBest regards,\nThe HackThisSpring Team`, From 4b8fc18bfd3a5a299e8f826524009d31737256d4 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:08:46 +0530 Subject: [PATCH 32/34] Create healthRoute.js --- backend/routes/healthRoute.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 backend/routes/healthRoute.js diff --git a/backend/routes/healthRoute.js b/backend/routes/healthRoute.js new file mode 100644 index 0000000..bd1c964 --- /dev/null +++ b/backend/routes/healthRoute.js @@ -0,0 +1,8 @@ +import express from 'express'; +import { checkHealth } from '../controllers/healthController.js'; + +const router = express.Router(); + +router.get('/health', checkHealth); + +export default router; From 6d9a7725aaaac16b66ee854649ddc9c3f69e2525 Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:09:48 +0530 Subject: [PATCH 33/34] Create healthController.js --- backend/controllers/healthController.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 backend/controllers/healthController.js diff --git a/backend/controllers/healthController.js b/backend/controllers/healthController.js new file mode 100644 index 0000000..0ed6223 --- /dev/null +++ b/backend/controllers/healthController.js @@ -0,0 +1,17 @@ +import mongoose from 'mongoose'; + +export const checkHealth = (req, res) => { + const dbStatus = mongoose.connection.readyState === 1 ? 'connected' : 'disconnected'; + if (dbStatus === 'connected') { + return res.json({ + status: 'ok', + database: dbStatus, + }); + } else { + return res.status(500).json({ + status: 'error', + message: 'Database connection is down', + database: dbStatus, + }); + } +}; From 483d5a86d78d03e69b4ba2b5fdea023beacf362b Mon Sep 17 00:00:00 2001 From: Naik Mubashir <124430100+naikmubashir@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:12:59 +0530 Subject: [PATCH 34/34] Update server.js --- backend/server.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/server.js b/backend/server.js index 6dd4403..813abd9 100644 --- a/backend/server.js +++ b/backend/server.js @@ -5,6 +5,7 @@ import cors from 'cors' import register from './routes/registerRoute.js'; import admin from './routes/adminRoute.js'; import newsletter from './routes/newsletterRoute.js'; +import health from './routes/healthRoute.js'; const app=express(); const PORT=process.env.PORT ||8000; @@ -15,9 +16,9 @@ app.use(express.json()); app.use('/register',register); app.use('/admin',admin); app.use('/newsletter',newsletter); - +app.use('/health', health); connectDb(process.env.DATABASE_URI) mongoose.connection.once('open',()=>{ console.log('Connected to Database....') app.listen(PORT,()=>console.log(`Server running on port ${PORT}......`)) -}) \ No newline at end of file +})