diff --git a/backend/config/passport.js b/backend/config/passport.js index 73040b5..89b2968 100644 --- a/backend/config/passport.js +++ b/backend/config/passport.js @@ -2,6 +2,14 @@ const passport = require("passport"); const GoogleStrategy = require("passport-google-oauth20").Strategy; const User = require("../models/User"); + + +console.log("Client ID:", process.env.GOOGLE_CLIENT_ID); +console.log("Client Secret:", process.env.GOOGLE_CLIENT_SECRET); +console.log("Callback URL:", process.env.GOOGLE_CALLBACK_URL); + + + passport.use( new GoogleStrategy( { diff --git a/backend/controllers/chatbotController.js b/backend/controllers/chatbotController.js new file mode 100644 index 0000000..36809cc --- /dev/null +++ b/backend/controllers/chatbotController.js @@ -0,0 +1,22 @@ +// backend/controllers/chatbotController.js +const { GoogleGenerativeAI } = require("@google/generative-ai"); + +const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY); + +exports.getChatResponse = async (req, res) => { + try { + const { message } = req.body; + if (!message) return res.status(400).json({ error: "Message is required" }); + + const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); + + const result = await model.generateContent(message); + + const reply = result.response.text(); // Gemini ka reply + + res.json({ reply }); + } catch (err) { + console.error("Chatbot Error:", err); + res.status(500).json({ error: "Failed to get response from Gemini AI" }); + } +}; diff --git a/backend/controllers/contact.controller.js b/backend/controllers/contact.controller.js index 4c90002..f6065db 100644 --- a/backend/controllers/contact.controller.js +++ b/backend/controllers/contact.controller.js @@ -17,3 +17,6 @@ const submitContactForm = async (req, res) => { }; module.exports = { submitContactForm }; + + + diff --git a/backend/package-lock.json b/backend/package-lock.json index 066ea5e..e6f8a01 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,34 +1,193 @@ { - "name": "devsync-backend", + "name": "backend", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "devsync-backend", + "name": "backend", "version": "1.0.0", + "license": "ISC", "dependencies": { + "accepts": "^1.3.8", + "anymatch": "^3.1.3", + "append-field": "^1.0.0", + "array-flatten": "^1.1.1", + "balanced-match": "^1.0.2", + "base64url": "^3.0.1", "bcrypt": "^6.0.0", "bcryptjs": "^2.4.3", + "binary-extensions": "^2.3.0", + "body-parser": "^1.20.3", + "brace-expansion": "^1.1.12", + "braces": "^3.0.3", + "bson": "^6.10.4", + "buffer-equal-constant-time": "^1.0.1", + "buffer-from": "^1.1.2", + "busboy": "^1.6.0", + "bytes": "^3.1.2", + "call-bind-apply-helpers": "^1.0.2", + "call-bound": "^1.0.4", + "chalk": "^5.6.0", + "chokidar": "^3.6.0", "clienvy": "^1.1.5", + "commander": "^14.0.0", + "concat-map": "^0.0.1", + "concat-stream": "^2.0.0", + "content-disposition": "^0.5.4", + "content-type": "^1.0.5", + "cookie": "^0.7.1", "cookie-parser": "^1.4.7", + "cookie-signature": "^1.0.6", "cors": "^2.8.5", - "crypto": "^1.0.1", + "debug": "^2.6.9", + "depd": "^2.0.0", + "destroy": "^1.2.0", "dotenv": "^16.6.1", + "dunder-proto": "^1.0.1", + "ecdsa-sig-formatter": "^1.0.11", + "ee-first": "^1.1.1", + "encodeurl": "^2.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "escape-html": "^1.0.3", + "etag": "^1.8.1", "express": "^4.21.2", "express-session": "^1.18.2", - "express-validator": "^7.0.1", + "express-validator": "^7.2.1", + "fast-glob": "^3.3.3", + "fastq": "^1.19.1", + "fill-range": "^7.1.1", + "finalhandler": "^1.3.1", + "forwarded": "^0.2.0", + "fresh": "^0.5.2", + "fs-extra": "^11.3.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "glob-parent": "^5.1.2", + "globby": "^14.1.0", + "gopd": "^1.2.0", + "graceful-fs": "^4.2.11", + "has-flag": "^3.0.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "http-errors": "^2.0.0", + "iconv-lite": "^0.4.24", + "ignore": "^7.0.5", + "ignore-by-default": "^1.0.1", + "inherits": "^2.0.4", + "ipaddr.js": "^1.9.1", + "is-binary-path": "^2.1.0", + "is-extglob": "^2.1.1", + "is-glob": "^4.0.3", + "is-number": "^7.0.0", + "jsonfile": "^6.2.0", "jsonwebtoken": "^9.0.2", - "mongoose": "^8.17.1", + "jwa": "^1.4.2", + "jws": "^3.2.2", + "kareem": "^2.6.3", + "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.1.1", + "math-intrinsics": "^1.1.0", + "media-typer": "^0.3.0", + "memory-pager": "^1.5.0", + "merge-descriptors": "^1.0.3", + "merge2": "^1.4.1", + "methods": "^1.1.2", + "micromatch": "^4.0.8", + "mime": "^1.6.0", + "mime-db": "^1.52.0", + "mime-types": "^2.1.35", + "minimatch": "^3.1.2", + "minimist": "^1.2.8", + "mkdirp": "^0.5.6", + "mongodb": "^6.18.0", + "mongodb-connection-string-url": "^3.0.2", + "mongoose": "^8.18.1", + "mpath": "^0.9.0", + "mquery": "^5.0.0", + "ms": "^2.0.0", "multer": "^2.0.2", - "nodemailer": "^7.0.6", + "negotiator": "^0.6.3", + "node-addon-api": "^8.5.0", + "node-gyp-build": "^4.8.4", + "normalize-path": "^3.0.0", + "oauth": "^0.10.2", + "object-assign": "^4.1.1", + "object-inspect": "^1.13.4", + "on-finished": "^2.4.1", + "on-headers": "^1.1.0", + "openai": "^5.19.1", + "parseurl": "^1.3.3", "passport": "^0.7.0", "passport-google-oauth20": "^2.0.0", - "rate-limiter-flexible": "^7.3.0", - "resend": "^6.0.1" + "passport-oauth2": "^1.8.0", + "passport-strategy": "^1.0.0", + "path-to-regexp": "^0.1.12", + "path-type": "^6.0.0", + "pause": "^0.0.1", + "picomatch": "^2.3.1", + "proxy-addr": "^2.0.7", + "pstree.remy": "^1.1.8", + "punycode": "^2.3.1", + "qs": "^6.13.0", + "queue-microtask": "^1.2.3", + "random-bytes": "^1.0.0", + "range-parser": "^1.2.1", + "raw-body": "^2.5.2", + "readable-stream": "^3.6.2", + "readdirp": "^3.6.0", + "resend": "^6.0.1", + "reusify": "^1.1.0", + "run-parallel": "^1.2.0", + "safe-buffer": "^5.2.1", + "safer-buffer": "^2.1.2", + "semver": "^7.7.2", + "send": "^0.19.0", + "serve-static": "^1.16.2", + "setprototypeof": "^1.2.0", + "side-channel": "^1.1.0", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2", + "sift": "^17.1.3", + "simple-update-notifier": "^2.0.0", + "slash": "^5.1.0", + "sparse-bitfield": "^3.0.3", + "statuses": "^2.0.1", + "streamsearch": "^1.1.0", + "string_decoder": "^1.3.0", + "supports-color": "^5.5.0", + "to-regex-range": "^5.0.1", + "toidentifier": "^1.0.1", + "touch": "^3.1.1", + "tr46": "^5.1.1", + "type-is": "^1.6.18", + "typedarray": "^0.0.6", + "uid-safe": "^2.1.5", + "uid2": "^0.0.4", + "undefsafe": "^2.0.5", + "unicorn-magic": "^0.3.0", + "universalify": "^2.0.1", + "unpipe": "^1.0.0", + "util-deprecate": "^1.0.2", + "utils-merge": "^1.0.1", + "validator": "^13.12.0", + "vary": "^1.1.2", + "webidl-conversions": "^7.0.0", + "whatwg-url": "^14.2.0", + "xtend": "^4.0.2" }, "devDependencies": { - "nodemon": "^3.1.7" + "nodemon": "^3.1.10" } }, "node_modules/@mongodb-js/saslprep": { @@ -101,7 +260,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -121,7 +279,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64url": { @@ -150,7 +307,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -183,7 +339,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -270,7 +425,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -313,7 +467,6 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -379,6 +532,8 @@ }, "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", @@ -388,13 +543,6 @@ "node": ">= 0.10" } }, - "node_modules/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", - "license": "ISC" - }, "node_modules/debug": { "version": "2.6.9", "license": "MIT", @@ -419,6 +567,8 @@ }, "node_modules/dotenv": { "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -494,6 +644,8 @@ }, "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", @@ -736,7 +888,6 @@ }, "node_modules/has-flag": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -795,7 +946,6 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "dev": true, "license": "ISC" }, "node_modules/inherits": { @@ -811,7 +961,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -1013,7 +1162,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -1092,7 +1240,9 @@ } }, "node_modules/mongoose": { - "version": "8.17.1", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.18.1.tgz", + "integrity": "sha512-K0RfrUXXufqNRZZjvAGdyjydB91SnbWxlwFYi5t7zN2DxVWFD3c6puia0/7xfBwZm6RCpYOVdYFlRFpoDWiC+w==", "license": "MIT", "dependencies": { "bson": "^6.10.4", @@ -1196,17 +1346,10 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/nodemailer": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.6.tgz", - "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/nodemon": { "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dev": true, "license": "MIT", "dependencies": { @@ -1255,7 +1398,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1301,6 +1443,27 @@ "node": ">= 0.8" } }, + "node_modules/openai": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.19.1.tgz", + "integrity": "sha512-zSqnUF7oR9ksmpusKkpUgkNrj8Sl57U+OyzO8jzc7LUjTMg4DRfR3uCm+EIMA6iw06sRPNp4t7ojp3sCpEUZRQ==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/parseurl": { "version": "1.3.3", "license": "MIT", @@ -1405,7 +1568,6 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", - "dev": true, "license": "MIT" }, "node_modules/punycode": { @@ -1461,11 +1623,6 @@ "node": ">= 0.6" } }, - "node_modules/rate-limiter-flexible": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-7.3.0.tgz", - "integrity": "sha512-0R5gYs0m+jLGqcE6wxuvht+zuch0h4Un+JqVCEWaQajJGCWU2HzY0IFDp8WS8NNqIpviJOLmkZ5VKmzW/8q5dA==" - }, "node_modules/raw-body": { "version": "2.5.2", "license": "MIT", @@ -1495,7 +1652,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -1702,7 +1858,6 @@ }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.3" @@ -1752,7 +1907,6 @@ }, "node_modules/supports-color": { "version": "5.5.0", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -1780,7 +1934,6 @@ }, "node_modules/touch": { "version": "3.1.1", - "dev": true, "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" @@ -1831,7 +1984,6 @@ }, "node_modules/undefsafe": { "version": "2.0.5", - "dev": true, "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/backend/package.json b/backend/package.json index 41c1048..1c2f5b2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,32 +1,193 @@ { - "name": "devsync-backend", + "name": "backend", "version": "1.0.0", + "description": "", "main": "server.js", - "scripts": { - "start": "node server.js", - "dev": "nodemon server.js" - }, "dependencies": { + "accepts": "^1.3.8", + "anymatch": "^3.1.3", + "append-field": "^1.0.0", + "array-flatten": "^1.1.1", + "balanced-match": "^1.0.2", + "base64url": "^3.0.1", "bcrypt": "^6.0.0", "bcryptjs": "^2.4.3", + "binary-extensions": "^2.3.0", + "body-parser": "^1.20.3", + "brace-expansion": "^1.1.12", + "braces": "^3.0.3", + "bson": "^6.10.4", + "buffer-equal-constant-time": "^1.0.1", + "buffer-from": "^1.1.2", + "busboy": "^1.6.0", + "bytes": "^3.1.2", + "call-bind-apply-helpers": "^1.0.2", + "call-bound": "^1.0.4", + "chalk": "^5.6.0", + "chokidar": "^3.6.0", "clienvy": "^1.1.5", + "commander": "^14.0.0", + "concat-map": "^0.0.1", + "concat-stream": "^2.0.0", + "content-disposition": "^0.5.4", + "content-type": "^1.0.5", + "cookie": "^0.7.1", "cookie-parser": "^1.4.7", + "cookie-signature": "^1.0.6", "cors": "^2.8.5", - "crypto": "^1.0.1", + "debug": "^2.6.9", + "depd": "^2.0.0", + "destroy": "^1.2.0", "dotenv": "^16.6.1", + "dunder-proto": "^1.0.1", + "ecdsa-sig-formatter": "^1.0.11", + "ee-first": "^1.1.1", + "encodeurl": "^2.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "escape-html": "^1.0.3", + "etag": "^1.8.1", "express": "^4.21.2", "express-session": "^1.18.2", - "express-validator": "^7.0.1", + "express-validator": "^7.2.1", + "fast-glob": "^3.3.3", + "fastq": "^1.19.1", + "fill-range": "^7.1.1", + "finalhandler": "^1.3.1", + "forwarded": "^0.2.0", + "fresh": "^0.5.2", + "fs-extra": "^11.3.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "glob-parent": "^5.1.2", + "globby": "^14.1.0", + "gopd": "^1.2.0", + "graceful-fs": "^4.2.11", + "has-flag": "^3.0.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "http-errors": "^2.0.0", + "iconv-lite": "^0.4.24", + "ignore": "^7.0.5", + "ignore-by-default": "^1.0.1", + "inherits": "^2.0.4", + "ipaddr.js": "^1.9.1", + "is-binary-path": "^2.1.0", + "is-extglob": "^2.1.1", + "is-glob": "^4.0.3", + "is-number": "^7.0.0", + "jsonfile": "^6.2.0", "jsonwebtoken": "^9.0.2", - "mongoose": "^8.17.1", + "jwa": "^1.4.2", + "jws": "^3.2.2", + "kareem": "^2.6.3", + "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.1.1", + "math-intrinsics": "^1.1.0", + "media-typer": "^0.3.0", + "memory-pager": "^1.5.0", + "merge-descriptors": "^1.0.3", + "merge2": "^1.4.1", + "methods": "^1.1.2", + "micromatch": "^4.0.8", + "mime": "^1.6.0", + "mime-db": "^1.52.0", + "mime-types": "^2.1.35", + "minimatch": "^3.1.2", + "minimist": "^1.2.8", + "mkdirp": "^0.5.6", + "mongodb": "^6.18.0", + "mongodb-connection-string-url": "^3.0.2", + "mongoose": "^8.18.1", + "mpath": "^0.9.0", + "mquery": "^5.0.0", + "ms": "^2.0.0", "multer": "^2.0.2", - "nodemailer": "^7.0.6", + "negotiator": "^0.6.3", + "node-addon-api": "^8.5.0", + "node-gyp-build": "^4.8.4", + "nodemon": "^3.1.10", + "normalize-path": "^3.0.0", + "oauth": "^0.10.2", + "object-assign": "^4.1.1", + "object-inspect": "^1.13.4", + "on-finished": "^2.4.1", + "on-headers": "^1.1.0", + "openai": "^5.19.1", + "parseurl": "^1.3.3", "passport": "^0.7.0", "passport-google-oauth20": "^2.0.0", - "rate-limiter-flexible": "^7.3.0", - "resend": "^6.0.1" + "passport-oauth2": "^1.8.0", + "passport-strategy": "^1.0.0", + "path-to-regexp": "^0.1.12", + "path-type": "^6.0.0", + "pause": "^0.0.1", + "picomatch": "^2.3.1", + "proxy-addr": "^2.0.7", + "pstree.remy": "^1.1.8", + "punycode": "^2.3.1", + "qs": "^6.13.0", + "queue-microtask": "^1.2.3", + "random-bytes": "^1.0.0", + "range-parser": "^1.2.1", + "raw-body": "^2.5.2", + "readable-stream": "^3.6.2", + "readdirp": "^3.6.0", + "resend": "^6.0.1", + "reusify": "^1.1.0", + "run-parallel": "^1.2.0", + "safe-buffer": "^5.2.1", + "safer-buffer": "^2.1.2", + "semver": "^7.7.2", + "send": "^0.19.0", + "serve-static": "^1.16.2", + "setprototypeof": "^1.2.0", + "side-channel": "^1.1.0", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2", + "sift": "^17.1.3", + "simple-update-notifier": "^2.0.0", + "slash": "^5.1.0", + "sparse-bitfield": "^3.0.3", + "statuses": "^2.0.1", + "streamsearch": "^1.1.0", + "string_decoder": "^1.3.0", + "supports-color": "^5.5.0", + "to-regex-range": "^5.0.1", + "toidentifier": "^1.0.1", + "touch": "^3.1.1", + "tr46": "^5.1.1", + "type-is": "^1.6.18", + "typedarray": "^0.0.6", + "uid-safe": "^2.1.5", + "uid2": "^0.0.4", + "undefsafe": "^2.0.5", + "unicorn-magic": "^0.3.0", + "universalify": "^2.0.1", + "unpipe": "^1.0.0", + "util-deprecate": "^1.0.2", + "utils-merge": "^1.0.1", + "validator": "^13.12.0", + "vary": "^1.1.2", + "webidl-conversions": "^7.0.0", + "whatwg-url": "^14.2.0", + "xtend": "^4.0.2" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js", + "dev": "nodemon server.js" }, - "devDependencies": { - "nodemon": "^3.1.7" - } + "keywords": [], + "author": "", + "license": "ISC" } diff --git a/backend/routes/chatbot.route.js b/backend/routes/chatbot.route.js new file mode 100644 index 0000000..6fc59a5 --- /dev/null +++ b/backend/routes/chatbot.route.js @@ -0,0 +1,9 @@ +// backend/routes/chatbot.route.js +const express = require("express"); +const router = express.Router(); +const { getChatResponse } = require("../controllers/chatbotController"); + +// POST /api/chatbot +router.post("/", getChatResponse); + +module.exports = router; diff --git a/backend/server.js b/backend/server.js index d4938dc..d375543 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,66 +1,33 @@ -// Entry point of the backend server -require("dotenv").config(); -const dbconnection = require("./db/connection"); +// server.js const express = require("express"); const mongoose = require("mongoose"); const cors = require("cors"); -const path = require("path"); -const contactRouter = require("./routes/contact.route"); -const passport = require("passport"); // import actual passport -require("./config/passport"); // just execute the strategy config -const session = require("express-session"); +const dotenv = require("dotenv"); +dotenv.config(); -// Importing Rate Limiter Middlewares - -const { generalMiddleware, authMiddleware } = require("./middleware/rateLimit/index") - - - -// Initialize express const app = express(); +// Middleware app.use(express.json()); -app.use(cors({ - origin: process.env.CLIENT_URL || "http://localhost:5173", // frontend URL for local dev - credentials: true -})); - - - -app.use( - session({ - secret: process.env.SESSION_SECRET || "devsync_session_secret", - resave: false, - saveUninitialized: false, - cookie: { secure: false } // set true if using HTTPS - }) -); - -app.use(passport.initialize()); -app.use(passport.session()); - -// Serve uploaded files -app.use("/uploads", express.static(path.join(__dirname, "uploads"))); - -// Define routes - -// app.use("/api/auth", require("./routes/auth")); -app.use("/api/auth", authMiddleware, require("./routes/auth")); - -// app.use("/api/profile", require("./routes/profile")); -app.use("/api/profile", generalMiddleware, require("./routes/profile")); - -// app.use("/api/contact",contactRouter); -app.use("/api/contact", generalMiddleware, contactRouter); - - -// Route to display the initial message on browser +app.use(cors()); + +// MongoDB connection +mongoose + .connect(process.env.MONGO_URI, { + useNewUrlParser: true, + useUnifiedTopology: true, + }) + .then(() => console.log("β MongoDB connected")) + .catch((err) => console.error("β MongoDB connection error:", err)); + +// Basic route app.get("/", (req, res) => { - res.send("DEVSYNC BACKEND API"); + res.send("Backend server is running π"); }); +// Start server const PORT = process.env.PORT || 5000; app.listen(PORT, () => { - console.log(`Server is up and running at http://localhost:${PORT} π`); -}); \ No newline at end of file + console.log(`β Server running on port ${PORT}`); +}); diff --git a/backend/testGemini.js b/backend/testGemini.js new file mode 100644 index 0000000..a97569d --- /dev/null +++ b/backend/testGemini.js @@ -0,0 +1,16 @@ +require("dotenv").config(); +const { GoogleGenerativeAI } = require("@google/generative-ai"); + +(async () => { + try { + const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY); + + // π updated model name + const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); + + const result = await model.generateContent("Hello Gemini!"); + console.log("β Gemini says:", result.response.text()); + } catch (err) { + console.error("β Gemini test error:", err); + } +})(); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index afb71c5..47bfdb5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -32,6 +32,7 @@ "shadcn": "^2.9.2", "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.11", + "uuid": "^11.1.0", "zod": "^3.25.76" }, "devDependencies": { @@ -7437,6 +7438,19 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 143adc8..5624f78 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,52 +1,29 @@ { - "name": "frontend", - "private": true, - "version": "0.0.0", + "name": "devsync", + "version": "1.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" + "dev": "nodemon backend/server.js", + "start": "node backend/server.js", + "client": "npm start --prefix frontend", + "server": "nodemon backend/server.js", + "install-all": "npm install && cd frontend && npm install" }, "dependencies": { - "@hookform/resolvers": "^5.2.1", - "@nivo/calendar": "^0.99.0", - "@radix-ui/react-alert-dialog": "^1.1.14", - "@radix-ui/react-avatar": "^1.1.10", - "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-toast": "^1.2.14", - "@tailwindcss/vite": "^4.1.11", - "add": "^2.0.6", - "axios": "^1.11.0", - "button": "^1.1.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "framer-motion": "^12.23.12", - "lucide-react": "^0.525.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.62.0", - "react-icons": "^5.5.0", - "react-intersection-observer": "^9.16.0", - "react-router-dom": "^7.7.0", - "shadcn": "^2.9.2", - "tailwind-merge": "^3.3.1", - "tailwindcss": "^4.1.11", - "zod": "^3.25.76" + "axios": "^1.6.7", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^16.4.0", + "express": "^4.18.2", + "express-session": "^1.17.3", + "gemini-ai": "^1.0.0", + "jsonwebtoken": "^9.0.2", + "mongoose": "^7.6.1", + "multer": "^1.4.5-lts.1", + "passport": "^0.7.0", + "passport-local": "^1.0.0" }, "devDependencies": { - "@eslint/js": "^9.30.1", - "@types/node": "^24.0.14", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@vitejs/plugin-react": "^4.6.0", - "eslint": "^9.30.1", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.20", - "globals": "^16.3.0", - "tw-animate-css": "^1.3.5", - "vite": "^7.0.4" + "nodemon": "^3.0.2" } } diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 72ac4b9..2a1b532 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,4 +1,6 @@ // src/App.jsx +import ChatLauncher from "./Components/ChatLauncher"; // π Chatbot + import React, { useEffect, useState } from "react"; import { Routes, Route } from "react-router-dom"; import Hero from "./Components/Hero"; @@ -9,7 +11,7 @@ import AdStrip from "./Components/Ad"; import { FeaturesSection } from "./Components/Features"; import Footer from "./Components/footer"; import ScrollRevealWrapper from "./Components/ui/ScrollRevealWrapper"; -import Loader from "./Components/ui/Loader"; // β Import the Loader +import Loader from "./Components/ui/Loader"; import Login from "./Components/auth/Login"; import Register from "./Components/auth/Register"; @@ -17,37 +19,28 @@ import Profile from "./Components/profile/Profile"; import ProtectedRoute from "./Components/auth/ProtectedRoute"; import Dashboard from "./Components/Dashboard"; +import { ArrowUp } from "lucide-react"; -// Home component that contains the main landing page content -import { ArrowUp } from "lucide-react"; // <-- icon for back to top - +// β Home component function Home() { const [showTop, setShowTop] = useState(false); useEffect(() => { const handleScroll = () => { - if (window.scrollY > 300) { - setShowTop(true); - } else { - setShowTop(false); - } + setShowTop(window.scrollY > 300); }; window.addEventListener("scroll", handleScroll); return () => window.removeEventListener("scroll", handleScroll); }, []); - const scrollToTop = () => { - window.scrollTo({ top: 0, behavior: "smooth" }); - }; - return ( -