Skip to content

Commit 4920a0f

Browse files
committed
Send limited user info from backend router and accept in AuthManager, returning UnregisteredUserPage if necessary
1 parent 9023eb5 commit 4920a0f

2 files changed

Lines changed: 63 additions & 9 deletions

File tree

frontend/src/components/AuthManager/AuthManager.tsx

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ import Toast from '../ConfirmationToast/ConfirmationToast';
1515

1616
import AdminRoutes from '../../pages/Admin/Routes';
1717
import RiderRoutes from '../../pages/Rider/Routes';
18-
import { Admin, Rider } from '../../types/index';
18+
import { Admin, Rider, UnregisteredUser } from '../../types/index';
1919
import { ToastStatus, useToast } from '../../context/toastContext';
2020
import { createPortal } from 'react-dom';
2121
import CryptoJS from 'crypto-js';
2222
import axios, { setAuthToken } from '../../util/axios';
23+
import UnregisteredUserPage from '../Onboarding/UnregisteredUserPage';
2324

2425
const secretKey = `${process.env.REACT_APP_ENCRYPTION_KEY!}`;
2526

@@ -46,9 +47,17 @@ const AuthManager = () => {
4647
const [refreshUser, setRefreshUser] = useState(() =>
4748
createRefresh(id, localStorage.getItem('userType') || '', jwtValue())
4849
);
50+
const [unregisteredUser, setUnregisteredUser] =
51+
useState<UnregisteredUser | null>(null);
4952

5053
const navigate = useNavigate();
5154

55+
// Handler to go back from unregistered screen
56+
const handleBackFromUnregistered = () => {
57+
setUnregisteredUser(null);
58+
logout();
59+
};
60+
5261
useEffect(() => {
5362
const token = jwtValue();
5463
if (token) {
@@ -119,7 +128,17 @@ const AuthManager = () => {
119128
})
120129
.catch((error) => {
121130
console.error('Login error:', error);
122-
logout();
131+
132+
if (
133+
error.response?.status === 400 &&
134+
error.response?.data?.err === 'User not found'
135+
) {
136+
setUnregisteredUser({
137+
...error.response?.data?.user,
138+
});
139+
} else {
140+
logout();
141+
}
123142
});
124143
}
125144
}
@@ -163,6 +182,15 @@ const AuthManager = () => {
163182

164183
const { visible, message, toastType } = useToast();
165184

185+
if (unregisteredUser) {
186+
return (
187+
<UnregisteredUserPage
188+
user={unregisteredUser}
189+
onBack={handleBackFromUnregistered}
190+
/>
191+
);
192+
}
193+
166194
if (!signedIn) {
167195
return (
168196
<Routes>

server/src/router/auth.ts

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { OAuth2Client } from 'google-auth-library';
77
import { oauthValues } from '../config';
88
import { ModelType } from 'dynamoose/dist/General';
99
import { Item } from 'dynamoose/dist/Item';
10+
import { UnregisteredUserType } from '../util/types';
1011

1112
const router = express.Router();
1213

@@ -50,12 +51,14 @@ function getUserType(table: string) {
5051
* @param model - The model to query (Rider, Admin, or Driver).
5152
* @param table - Name of the user table (used to derive userType).
5253
* @param email - The email address to look up.
54+
* @param userInfo - Optional user info from Google OAuth (name, etc.).
5355
*/
5456
function findUserAndSendToken(
5557
res: express.Response,
5658
model: ModelType<Item>,
5759
table: string,
58-
email: string
60+
email: string,
61+
userInfo?: Partial<UnregisteredUserType>
5962
) {
6063
model.scan({ email: { eq: email } }).exec((err, data) => {
6164
if (err) {
@@ -95,14 +98,35 @@ function findUserAndSendToken(
9598
.status(200)
9699
.send({ jwt: jwt.sign(userPayload, process.env.JWT_SECRET!) });
97100
} else {
98-
res.status(400).send({ err: 'User not found' });
101+
const unregisteredUser: UnregisteredUserType = {
102+
email: email,
103+
name: userInfo?.name || 'User',
104+
};
105+
res.status(400).send({
106+
err: 'User not found',
107+
user: unregisteredUser,
108+
});
99109
}
100110
} else {
101-
res.status(400).send({ err: 'User not found' });
111+
const unregisteredUser: UnregisteredUserType = {
112+
email: email,
113+
name: userInfo?.name || 'User',
114+
};
115+
res.status(400).send({
116+
err: 'User not found',
117+
user: unregisteredUser,
118+
});
102119
}
103120
});
104121
} else {
105-
res.status(400).send({ err: 'User not found' });
122+
const unregisteredUser: UnregisteredUserType = {
123+
email: email,
124+
name: userInfo?.name || 'User',
125+
};
126+
res.status(400).send({
127+
err: 'User not found',
128+
user: unregisteredUser,
129+
});
106130
}
107131
});
108132
}
@@ -131,10 +155,12 @@ router.post('/', async (req, res) => {
131155
});
132156
const idToken = req.body.idToken || (await getIdToken(client, code));
133157
const result = await client.verifyIdToken({ idToken, audience });
134-
const email = result.getPayload()?.email;
158+
const payload = result.getPayload();
159+
const email = payload?.email;
160+
const name = payload?.name;
135161
const model = getModel(table);
136162
if (model && email) {
137-
findUserAndSendToken(res, model, table, email);
163+
findUserAndSendToken(res, model, table, email, { name });
138164
} else if (!model) {
139165
res.status(400).send({ err: 'Table not found' });
140166
} else if (!email) {
@@ -154,7 +180,7 @@ if (process.env.NODE_ENV === 'test') {
154180
try {
155181
const model = getModel(table);
156182
if (model && email) {
157-
findUserAndSendToken(res, model, table, email);
183+
findUserAndSendToken(res, model, table, email, { name: email });
158184
} else if (!model) {
159185
res.status(400).send({ err: 'Table not found' });
160186
} else if (!email) {

0 commit comments

Comments
 (0)