diff --git a/src/server/auth/helpers.ts b/src/server/auth/helpers.ts index 3a0c7559f..67a855024 100644 --- a/src/server/auth/helpers.ts +++ b/src/server/auth/helpers.ts @@ -1,7 +1,7 @@ import { VerifyCallback } from 'passport-oauth2'; import { Profile } from 'passport'; import { ObjectID } from 'mongodb'; -import { UserType, ApplicationStatus } from '../generated/graphql'; +import { UserDbInterface, UserType, ApplicationStatus } from '../generated/graphql'; import { Models } from '../models'; import { fetchUser } from '../resolvers/helpers'; import logger from '../logger'; @@ -22,8 +22,11 @@ export const verifyCallback = async ( if (email == null) { throw new Error(`Email not provided by provider ${profile}`); } + let user: UserDbInterface | undefined; if (userType == null) { + // Login must not exist. + logger.info(`inserting login for ${email} for ${profile.provider}`); await Logins.insertOne({ createdAt: new Date(), email, @@ -32,29 +35,35 @@ export const verifyCallback = async ( userType: UserType.Hacker, }); - logger.info(`inserting user ${email}`); - await Hackers.insertOne({ - _id: new ObjectID(), - application: [], - createdAt: new Date(), - dietaryRestrictions: '', - email, - eventsAttended: [], - firstName: 'New', - lastName: 'User', - logins: [], - majors: [], - modifiedAt: new Date().getTime(), - phoneNumber: '', - preferredName: '', - race: '', - secondaryIds: [], - status: ApplicationStatus.Created, - userType: UserType.Hacker, - }); + try { + // If user is truthy, then we need to insert a new user. + user = await fetchUser({ email, userType: userType || UserType.Hacker }, models); + } catch (e) { + // This way logging in with different providers uses the same backing hacker object. + logger.info(`inserting ${email} (${profile.provider}) into hacker db`); + await Hackers.insertOne({ + _id: new ObjectID(), + application: [], + createdAt: new Date(), + dietaryRestrictions: '', + email, + eventsAttended: [], + firstName: '', + lastName: '', + logins: [], + majors: [], + modifiedAt: new Date().getTime(), + phoneNumber: '', + preferredName: '', + race: '', + secondaryIds: [], + status: ApplicationStatus.Created, + userType: UserType.Hacker, + }); + } } - const user = await fetchUser({ email, userType: userType || UserType.Hacker }, models); + if (!user) user = await fetchUser({ email, userType: userType || UserType.Hacker }, models); return void done(null, user); } catch (err) { return void done(err);