Skip to content

Commit

Permalink
Fix login bug for users using multiple providers
Browse files Browse the repository at this point in the history
  • Loading branch information
leonm1 committed Oct 3, 2019
1 parent ed29e64 commit 794cad8
Showing 1 changed file with 31 additions and 22 deletions.
53 changes: 31 additions & 22 deletions src/server/auth/helpers.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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,
Expand All @@ -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);
Expand Down

0 comments on commit 794cad8

Please sign in to comment.