Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import session from 'express-session';

import dotenv from 'dotenv';

import userRoute from './routes/user';
import googleRoute from './routes/google.auth';
import githubRoute from './routes/github.auth';

Expand Down Expand Up @@ -35,6 +36,7 @@ app.use(session({
secret: 'SECRET'
}));

userRoute(app);
googleRoute(app);
githubRoute(app);

Expand Down
51 changes: 37 additions & 14 deletions src/controllers/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,30 @@ import { GithubUser, GoogleUser, IUserAttached } from 'models/user/user.model';
import { UserService } from 'services/user.service';


const getUserByEmail = (email: string): Promise<IUserAttached | null> => {
return UserService.getUserData(email);
}

const getUserByRepoUrl = (repoUrl: string): Promise<IUserAttached | null> => {
return UserService.getUserData(repoUrl);
}

const getUserByEmail = async (email: string): Promise<IUserAttached | null> => {
return await UserService.getUserByEmail(email);
};

const getUserByRepoUrl = async (repoUrl: string): Promise<IUserAttached | null> => {
return await UserService.getUserByRepoUrl(repoUrl);
};

const getUserById = async (id: string): Promise<IUserAttached | null> => {
return await UserService.getUserById(id);
};

export const getUserData = async (req: Request, res: Response): Promise<void> => {
const user = await getUserByEmail(req.body?.email);
if (user) res.send(user);
res.status(401).send('User does not exist!');
};

export const mergeUser = async (req: Request, res: Response) => {
await UserService.saveUserData({
email: req.body.email,
lastLoggedIn: new Date(),
});
};

export const loginUserViaGoogle = async (verifiedUser: GoogleUser, req: Request, res: Response): Promise<void> => {

Expand All @@ -21,19 +37,26 @@ export const loginUserViaGoogle = async (verifiedUser: GoogleUser, req: Request,
if (!user) {
const savedUser = await UserService.saveUserData({email: verifiedUser.emails[0].value, lastLoggedIn: new Date()});
res.send(savedUser);
} else res.send(user)
}

}
res.send(user)
};

export const loginUserViaGithub = async (verifiedUser: GithubUser, req: Request, res: Response): Promise<void> => {

if (!verifiedUser) res.status(401).send('User does not exist!');

const user = await getUserByRepoUrl(verifiedUser.profileUrl);
const userEmail = verifiedUser._json.email;
let user: IUserAttached | null = null;

if (userEmail){
user = await getUserByEmail(userEmail);
res.sendStatus(303).send("User exist already in database - would you like to merge user data?");
}
if (!user) user = await getUserByRepoUrl(verifiedUser.profileUrl);
if (!user) {
const savedUser = await UserService.saveUserData({repoUrl: verifiedUser.profileUrl, lastLoggedIn: new Date()});
res.send(savedUser);
} else res.send(user)
}

}
res.send(user)
};
14 changes: 14 additions & 0 deletions src/events/user.event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { EventEmitter } from 'events';
import { UserEvents } from 'models/events/user.events.model';
export const userEvents = new EventEmitter();

const mergeUser = () => {
console.log('Merged!');
}

const notMergeUser = () => {
console.log("Not merge!")
}

userEvents.on(UserEvents.UserMerge, mergeUser);
userEvents.on(UserEvents.NotUserMerge, notMergeUser);
4 changes: 4 additions & 0 deletions src/models/events/user.events.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export enum UserEvents {
UserMerge = 'USER_MERGE',
NotUserMerge = 'NOT_USER_MERGE'
}
9 changes: 9 additions & 0 deletions src/routes/user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Express } from 'express';
import * as userController from 'controllers/user.controller'

const userRoute = (app: Express) => {
app.get('/user', userController.getUserData);
app.post('/user/merge', userController.mergeUser);
};

export default userRoute;
4 changes: 3 additions & 1 deletion src/services/user.service.interface.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { IUser, IUserAttached } from "models/user/user.model";

export interface IUserService {
getUserData(email: string): Promise<IUserAttached | null>
getUserByEmail(email: string): Promise<IUserAttached | null>
getUserByRepoUrl(repoUrl: string): Promise<IUserAttached | null>
getUserById(id: string): Promise<IUserAttached | null>
saveUserData(user: IUser): Promise<IUserAttached | null>
deleteUserData(email: string): Promise<void>
}
16 changes: 15 additions & 1 deletion src/services/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,27 @@ import { mapUserToAttachedUser, UserCollection } from "models/user/user.schema"
import { IUserService } from "./user.service.interface";

export const UserService: IUserService = {
getUserData: async(email: string): Promise<IUserAttached | null> => {
getUserByEmail: async(email: string): Promise<IUserAttached | null> => {
const foundUser = await UserCollection.findOneAndUpdate(
{ email },
{ lastLoggedIn: new Date() });

return mapUserToAttachedUser(foundUser);
},
getUserByRepoUrl: async(repoUrl: string): Promise<IUserAttached | null> => {
const foundUser = await UserCollection.findOneAndUpdate(
{ repoUrl },
{ lastLoggedIn: new Date() });

return mapUserToAttachedUser(foundUser);
},
getUserById: async(id: string): Promise<IUserAttached | null> => {
const foundUser = await UserCollection.findByIdAndUpdate(
id,
{ lastLoggedIn: new Date() });

return mapUserToAttachedUser(foundUser);
},

saveUserData: async(user: IUser): Promise<IUserAttached | null> => {
const createdUser = await UserCollection.create(user);
Expand Down