From 3488278d2d582a02b1d262892fb929da7a4226b0 Mon Sep 17 00:00:00 2001 From: talksik Date: Fri, 18 Mar 2022 10:03:57 -0400 Subject: [PATCH] fixing things across the board --- packages/api/middleware/auth.ts | 2 + packages/api/routes/user.ts | 45 +++++++++++++++++-- packages/api/services/user.service.ts | 22 ++++++++- packages/core/models/user.model.ts | 5 +-- packages/desktop/package.json | 1 + .../src/components/ProtectedRoute/index.tsx | 10 ++--- packages/desktop/src/controller/nirvanaApi.ts | 4 +- packages/desktop/src/nirvanaApp.tsx | 28 ++++++------ packages/desktop/src/pages/Login/index.tsx | 25 ++--------- yarn.lock | 5 +++ 10 files changed, 95 insertions(+), 52 deletions(-) diff --git a/packages/api/middleware/auth.ts b/packages/api/middleware/auth.ts index c555e89..9f34d4b 100644 --- a/packages/api/middleware/auth.ts +++ b/packages/api/middleware/auth.ts @@ -22,9 +22,11 @@ export const authCheck = async ( "423533244953-banligobgbof8hg89i6cr1l7u0p7c2pk.apps.googleusercontent.com", // Specify the CLIENT_ID of the app that accesses the backend }); const userId = ticket.getPayload()?.sub; + const email = ticket.getPayload()?.email; // used in subsequent handlers res.locals.userId = userId; + res.locals.email = email; console.log(userId); diff --git a/packages/api/routes/user.ts b/packages/api/routes/user.ts index 0510811..d2f573f 100644 --- a/packages/api/routes/user.ts +++ b/packages/api/routes/user.ts @@ -24,22 +24,59 @@ export default function getUserRoutes() { * create user if doesn't exist */ async function getUserDetails(req: Request, res: Response) { - const userId: string = res.locals.userId; + const email: string = res.locals.email; - console.log(`getting data for ${userId}`); + // passed in accesstoken no matter what + const { access_token } = req.query; + + console.log(`getting data for ${email}`); try { // return user details if it passed auth middleware - const user = await UserService.getUserById(userId); + const user = await UserService.getUserByEmail(email); + // if no user found, then go ahead and create user + if (!user) { + if (!access_token) { + res.status(400).send("No access token provided"); + return; + } + + // get google user info from access token + const userInfo: GoogleUserInfo = + await UserService.getGoogleUserInfoWithAccessToken( + access_token as string + ); + + // create initial user model object + const newUser = new User( + userInfo.email, + userInfo.verifiedEmail, + userInfo.name, + userInfo.given_name, + userInfo.family_name, + userInfo.picture, + userInfo.locale + ); + + // create user if not exists + const insertResult = await UserService.createUserIfNotExists(newUser); + + insertResult + ? res.status(200).send("User created") + : res.status(500).send("Failed to create account, already exists"); + } + + // otherwise, just return the user details res.status(200).send(user); } catch (error) { res .status(404) - .send(`unable to find a matching document with id: ${userId}`); + .send(`unable to find a matching document with email: ${email}`); } } +/** DEPRECATED...USING THE SAME SIGN IN ROUTE TO CREATE */ async function createUser(req: Request, res: Response) { try { const { access_token } = req.query; diff --git a/packages/api/services/user.service.ts b/packages/api/services/user.service.ts index a936fb9..f57a13e 100644 --- a/packages/api/services/user.service.ts +++ b/packages/api/services/user.service.ts @@ -8,7 +8,27 @@ export class UserService { static async getUserById(userId: string) { const query = { _id: new ObjectId(userId) }; - return (await collections.users?.findOne(query)) as unknown as User; + const res = await collections.users?.findOne(query); + + // exists + if (res?._id) { + return res as User; + } + + return null; + } + + static async getUserByEmail(email: string) { + const query = { email }; + + const res = await collections.users?.findOne(query); + + // exists + if (res?._id) { + return res as User; + } + + return null; } static async createUserIfNotExists(newUser: User) { diff --git a/packages/core/models/user.model.ts b/packages/core/models/user.model.ts index e628e48..1dc30fb 100644 --- a/packages/core/models/user.model.ts +++ b/packages/core/models/user.model.ts @@ -9,7 +9,6 @@ export class User { public family_name: string, public picture: string, public locale: string, - public _id?: ObjectId - ) // additional properties specific to our users collection - {} + public _id?: ObjectId // additional properties specific to our users collection + ) {} } diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 0242ef0..95e841f 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -104,6 +104,7 @@ "electron-store": "^8.0.1", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-icons": "^4.3.1", "react-query": "^3.34.16", "react-router-dom": "^6.2.2" } diff --git a/packages/desktop/src/components/ProtectedRoute/index.tsx b/packages/desktop/src/components/ProtectedRoute/index.tsx index e184468..e0ca37f 100644 --- a/packages/desktop/src/components/ProtectedRoute/index.tsx +++ b/packages/desktop/src/components/ProtectedRoute/index.tsx @@ -13,17 +13,15 @@ export default function ProtectedRoute({ const { isLoading, isError } = useGetUserDetails(); const navigate = useNavigate(); - useEffect(() => { - if (isError) { - navigate("/login"); - } - }, [isError]); - useEffect(() => { // console.log(window.electronAPI.store.get(STORE_ITEMS.AUTH_TOKENS)); // nirvanaApi.getUserDetails(); }, []); + if (isError) { + navigate("/login"); + } + if (isLoading) return please wait while we authenticate you; // if we can successfully get user details, we are good to continue diff --git a/packages/desktop/src/controller/nirvanaApi.ts b/packages/desktop/src/controller/nirvanaApi.ts index 4aed334..b1bcdf8 100644 --- a/packages/desktop/src/controller/nirvanaApi.ts +++ b/packages/desktop/src/controller/nirvanaApi.ts @@ -41,8 +41,8 @@ class NirvanaApi { } user = { - async getUserDetails(): Promise { - return await axios.get(localHost + `/users`, { + async getUserDetails(accessToken: string): Promise { + return await axios.get(localHost + `/users?access_token=${accessToken}`, { headers: { Authorization: this._authToken }, }); }, diff --git a/packages/desktop/src/nirvanaApp.tsx b/packages/desktop/src/nirvanaApp.tsx index 13d87a1..602061c 100644 --- a/packages/desktop/src/nirvanaApp.tsx +++ b/packages/desktop/src/nirvanaApp.tsx @@ -1,4 +1,4 @@ -import { HashRouter, Route, Routes } from "react-router-dom"; +import { BrowserRouter, HashRouter, Route, Routes } from "react-router-dom"; import { QueryClient, QueryClientProvider } from "react-query"; import Home from "./pages/Home"; @@ -17,21 +17,19 @@ function NirvanaApp() { <> -
- - } /> - - - - } - /> - {/* + + } /> + + + + } + /> + {/* */} - -
+
diff --git a/packages/desktop/src/pages/Login/index.tsx b/packages/desktop/src/pages/Login/index.tsx index d66710a..88248c6 100644 --- a/packages/desktop/src/pages/Login/index.tsx +++ b/packages/desktop/src/pages/Login/index.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import Channels from "../../electron/constants"; import { CircularProgress } from "@mui/material"; +import { FcGoogle } from "react-icons/fc"; import Logo from "../../components/Logo"; import { nirvanaApi } from "../../controller/nirvanaApi"; import { useCreateUser } from "../../controller/index"; @@ -10,10 +11,6 @@ import { useNavigate } from "react-router-dom"; export default function Login() { const navigate = useNavigate(); - const [isSignUp, setIsSignUp] = useState(false); - - const { mutateAsync } = useCreateUser(); - const continueAuth = () => { setIsLoading(true); // send to main process @@ -32,11 +29,6 @@ export default function Login() { nirvanaApi.setGoogleIdToken(id_token); - // create user if on sign up page - if (isSignUp) { - await mutateAsync(access_token); - } - // now can go to home and get authenticated regardless of type of user navigate("/home"); } @@ -62,19 +54,10 @@ export default function Login() { ) : ( - )} - - {isSignUp ? ( - - ) : ( - )} diff --git a/yarn.lock b/yarn.lock index 3bc047e..b1f94a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6081,6 +6081,11 @@ react-dom@^17.0.2: object-assign "^4.1.1" scheduler "^0.20.2" +react-icons@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" + integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== + react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"