diff --git a/auth-service/.env b/auth-service/.env index cf8db7d..9e9d028 100644 --- a/auth-service/.env +++ b/auth-service/.env @@ -1,4 +1,5 @@ CLIENT_ID = "485880105639-1in8tvb6ondnn198rasuj2d8ank06ntp.apps.googleusercontent.com" CLIENT_SECRET = "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" CLIENT_URL = "http://localhost:5173/" +DB_USER_SERVICE_URL = "http://localhost:3000/" SESSION_KEY = "f3f4d8e6b17a4b3abdc8e9a2c0457aaf91c0d5f6e3b7a9c8df624bd71ea35f42" \ No newline at end of file diff --git a/auth-service/package-lock.json b/auth-service/package-lock.json index bdfa019..495b39d 100644 --- a/auth-service/package-lock.json +++ b/auth-service/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "axios": "^1.8.4", "cors": "^2.8.5", "dotenv": "^16.5.0", "express": "^5.1.0", @@ -44,6 +45,23 @@ "node": ">= 8" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -192,6 +210,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -265,6 +295,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -345,6 +384,21 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "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", @@ -490,6 +544,62 @@ } } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/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/form-data/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/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -613,6 +723,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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", @@ -1017,6 +1142,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", diff --git a/auth-service/package.json b/auth-service/package.json index 5c0ec3d..14d0810 100644 --- a/auth-service/package.json +++ b/auth-service/package.json @@ -10,6 +10,7 @@ "license": "ISC", "description": "", "dependencies": { + "axios": "^1.8.4", "cors": "^2.8.5", "dotenv": "^16.5.0", "express": "^5.1.0", diff --git a/auth-service/routes/auth.js b/auth-service/routes/auth.js index 0968be2..3877d59 100644 --- a/auth-service/routes/auth.js +++ b/auth-service/routes/auth.js @@ -1,21 +1,31 @@ const router = require("express").Router(); const passport = require("passport"); +const axios = require("axios"); router.get( "/google/callback", passport.authenticate("google", { - successRedirect: process.env.CLIENT_URL, - failureRedirect: "/login/failed", + successRedirect: "/auth/login", + failureRedirect: "/auth/login/failed", }) ); -router.get("/login/success", (req, res) => { +router.get("/login", (req, res) => { if (req.user) { - res.status(200).json({ - error: false, - message: "Successfully Logged In", + + console.log(`${process.env.DB_USER_SERVICE_URL}instructor/register-user`) + axios.post(`${process.env.DB_USER_SERVICE_URL}instructor/register-user`, { user: req.user, + }) + .then(response => { + console.log("User registration response:", response.data); + res.redirect(process.env.CLIENT_URL); + }) + .catch(error => { + console.error("Error registering user:", error.message); + res.status(500).json({ error: true, message: "User login failed" }); }); + } else { res.status(403).json({ error: true, message: "Not Authorized" }); } diff --git a/user-db-service/prisma/schema.prisma b/user-db-service/prisma/schema.prisma index c51bdcd..f2fcd29 100644 --- a/user-db-service/prisma/schema.prisma +++ b/user-db-service/prisma/schema.prisma @@ -9,11 +9,11 @@ datasource db { } model users { - UserId Int @id @default(autoincrement()) - Name String? - Email String? - Password String? - Role String? - GoogleId String? - LoginType String? + userid Int @id @default(autoincrement()) + email String @unique + name String? + password String? + role String? + googleid String? + logintype String? } diff --git a/user-db-service/routes/InstructorRouter.js b/user-db-service/routes/InstructorRouter.js index cf66b54..4f81efd 100644 --- a/user-db-service/routes/InstructorRouter.js +++ b/user-db-service/routes/InstructorRouter.js @@ -1,17 +1,53 @@ const express = require("express"); const instructorRouter = express.Router(); +const { PrismaClient } = require("@prisma/client"); +const prisma = new PrismaClient(); // For new users sign-up via Google oAuth: -instructorRouter.post('/register-user', async (req, res) => { - try { - const { username, password } = req.body; - const newUser = await prisma.user.create({ - data: { username, email, password }, +instructorRouter.post("/register-user", async (req, res) => { + try { + console.log("Received request to register user"); + + const { id, displayName, emails } = req.body.user; + console.log("User details from request:", { id, displayName, emails }); + + const email = emails[0].value; + console.log("Extracted email:", email); + + // Check if user exists + const user = await prisma.users.findFirst({ + where: { + email: { + equals: email, + mode: "insensitive", + }, + }, + }); + console.log("User lookup result:", user); + + // if it is a new user, insert it into the DB + if (!user) { + console.log("User does not exist, creating new user"); + const newUser = await prisma.users.create({ + data: { + name: displayName, + email: email, + role: "instructor", + googleid: id, + logintype: "google", + }, }); - res.json({ message: 'User added successfully', user: newUser }); - } catch (err) { - res.status(500).json({ error: err.message }); + console.log("New user created:", newUser); + + res.json({ message: "User added successfully", user: newUser }); + } else { + console.log("User already exists:", user); + res.json({ message: "User exist", user: user }); } - }); + } catch (err) { + console.error("Error during user registration:", err.message); + res.status(500).json({ error: err.message }); + } +}); module.exports = instructorRouter;