diff --git a/package-lock.json b/package-lock.json index d14e5aa..3e0ee1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "progrrammers-only", + "name": "programmers-only", "version": "1.0.0", "lockfileVersion": 1, "requires": true, diff --git a/src/app.ts b/src/app.ts index 2d49f63..e2a6f2f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -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'; @@ -35,6 +36,7 @@ app.use(session({ secret: 'SECRET' })); +userRoute(app); googleRoute(app); githubRoute(app); diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index 37d41ab..ea4d5c9 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -3,14 +3,30 @@ import { GithubUser, GoogleUser, IUserAttached } from 'models/user/user.model'; import { UserService } from 'services/user.service'; -const getUserByEmail = (email: string): Promise => { - return UserService.getUserData(email); -} - -const getUserByRepoUrl = (repoUrl: string): Promise => { - return UserService.getUserData(repoUrl); -} - +const getUserByEmail = async (email: string): Promise => { + return await UserService.getUserByEmail(email); +}; + +const getUserByRepoUrl = async (repoUrl: string): Promise => { + return await UserService.getUserByRepoUrl(repoUrl); +}; + +const getUserById = async (id: string): Promise => { + return await UserService.getUserById(id); +}; + +export const getUserData = async (req: Request, res: Response): Promise => { + 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 => { @@ -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 => { - 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) + } -} \ No newline at end of file + res.send(user) +}; \ No newline at end of file diff --git a/src/events/user.event.ts b/src/events/user.event.ts new file mode 100644 index 0000000..3f1f7f4 --- /dev/null +++ b/src/events/user.event.ts @@ -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); \ No newline at end of file diff --git a/src/models/events/user.events.model.ts b/src/models/events/user.events.model.ts new file mode 100644 index 0000000..9fee762 --- /dev/null +++ b/src/models/events/user.events.model.ts @@ -0,0 +1,4 @@ +export enum UserEvents { + UserMerge = 'USER_MERGE', + NotUserMerge = 'NOT_USER_MERGE' +} \ No newline at end of file diff --git a/src/routes/user.ts b/src/routes/user.ts new file mode 100644 index 0000000..75b1680 --- /dev/null +++ b/src/routes/user.ts @@ -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; \ No newline at end of file diff --git a/src/services/user.service.interface.ts b/src/services/user.service.interface.ts index 8f3362f..519b250 100644 --- a/src/services/user.service.interface.ts +++ b/src/services/user.service.interface.ts @@ -1,7 +1,9 @@ import { IUser, IUserAttached } from "models/user/user.model"; export interface IUserService { - getUserData(email: string): Promise + getUserByEmail(email: string): Promise + getUserByRepoUrl(repoUrl: string): Promise + getUserById(id: string): Promise saveUserData(user: IUser): Promise deleteUserData(email: string): Promise } \ No newline at end of file diff --git a/src/services/user.service.ts b/src/services/user.service.ts index e925b90..8327cc3 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -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 => { + getUserByEmail: async(email: string): Promise => { const foundUser = await UserCollection.findOneAndUpdate( { email }, { lastLoggedIn: new Date() }); return mapUserToAttachedUser(foundUser); }, + getUserByRepoUrl: async(repoUrl: string): Promise => { + const foundUser = await UserCollection.findOneAndUpdate( + { repoUrl }, + { lastLoggedIn: new Date() }); + + return mapUserToAttachedUser(foundUser); + }, + getUserById: async(id: string): Promise => { + const foundUser = await UserCollection.findByIdAndUpdate( + id, + { lastLoggedIn: new Date() }); + + return mapUserToAttachedUser(foundUser); + }, saveUserData: async(user: IUser): Promise => { const createdUser = await UserCollection.create(user);