From ba0d35358899e77117566f07ac9d3a1f783c403c Mon Sep 17 00:00:00 2001 From: Guillaume Dorce Date: Fri, 9 Sep 2022 12:07:38 +0200 Subject: [PATCH] add me route to get user info --- src/api/index.ts | 2 ++ src/api/me.ts | 34 ++++++++++++++++++++++++++++++++ src/controller/AuthController.ts | 4 +--- src/controller/PostController.ts | 8 +------- src/controller/UserController.ts | 15 +++++++++++++- src/lib/utils.ts | 8 ++++++++ 6 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 src/api/me.ts create mode 100644 src/lib/utils.ts diff --git a/src/api/index.ts b/src/api/index.ts index bc3a249..3dda0c8 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,10 +1,12 @@ import { Router } from 'express'; import posts from './posts'; import auth from './auth'; +import me from './me'; const api = Router(); api.use('/posts', posts); api.use('/auth', auth); +api.use('/me', me); export default api; diff --git a/src/api/me.ts b/src/api/me.ts new file mode 100644 index 0000000..b76fda1 --- /dev/null +++ b/src/api/me.ts @@ -0,0 +1,34 @@ +import { verifyToken } from "@/controller/AuthController"; +import { getUserById } from "@/controller/UserController"; +import { NextFunction, Request, Response, Router } from "express"; + +const getToken = (req: Request): string | undefined => { + const token: string | undefined = req.headers.authorization?.substring(7); // remove 'Bearer ' from token + return token; +}; + +const checkAuth = (req: Request, res: Response, next: NextFunction) => { + const token = getToken(req); + if (token === undefined) { + return res.status(401).send({ error: 'No token provided' }); + } + return verifyToken(token) + .then((decodedToken: number) => { + req.userId = decodedToken; + next(); + }) + .catch((error) => { + return res.status(401).send({ error }); + }); +}; + +const me = Router(); + +me.use(checkAuth); + +me.get("/", async (req: Request, res: Response) => { + const user = await getUserById(req.userId); + return res.status(200).send(user); +}); + +export default me; \ No newline at end of file diff --git a/src/controller/AuthController.ts b/src/controller/AuthController.ts index 60fbc88..b45d826 100644 --- a/src/controller/AuthController.ts +++ b/src/controller/AuthController.ts @@ -35,9 +35,7 @@ const genToken = (userId: number) => { const verifyToken = (token: string): Promise => { return new Promise((resolve, reject) => { jwt.verify(token, config.JWT_SECRET, async (err?, decoded?: jwt.JwtPayload | string) => { - if (err) { - reject('Unkown error'); - } else if (decoded === undefined || typeof decoded === 'string' || decoded.id === undefined) { + if (err || decoded === undefined || typeof decoded === 'string' || decoded.id === undefined) { reject('Invalid token'); } else { const prismaToken = await prisma.token.findUnique({ diff --git a/src/controller/PostController.ts b/src/controller/PostController.ts index eba2ecd..1f487ec 100644 --- a/src/controller/PostController.ts +++ b/src/controller/PostController.ts @@ -1,15 +1,9 @@ import { PrismaClient, Post as PrismaPost, Like } from '@prisma/client'; import { Post } from '@/models/PostModel'; +import { exclude } from '@/lib/utils'; const prisma = new PrismaClient(); -const exclude = (user: User, ...keys: Key[]): User => { - for (let key of keys) { - delete user[key]; - } - return user; -}; - const getPostById = async (id: number): Promise => { const post = await prisma.post.findUnique({ where: { diff --git a/src/controller/UserController.ts b/src/controller/UserController.ts index c7562d2..ac64c2a 100644 --- a/src/controller/UserController.ts +++ b/src/controller/UserController.ts @@ -1,5 +1,6 @@ import { PrismaClient } from '@prisma/client'; import { User } from '@/models/UserModel'; +import { exclude } from '@/lib/utils'; const prisma = new PrismaClient(); @@ -13,6 +14,18 @@ const getUser = (email: string) => { return user; }; +const getUserById = async (id: number) => { + const user = await prisma.user.findUnique({ + where: { + id, + }, + }); + + if (user) { + return exclude(user, 'password'); + } +}; + const isUserExist = (email: string) => prisma.user .findUnique({ @@ -48,4 +61,4 @@ const newUser = async (user: User) => { return newUser; }; -export { getUser, newUser }; +export { getUser, newUser, isUserExist, getUserById }; diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..c8a133c --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,8 @@ +const exclude = (pobj: PrismaObject, ...keys: Key[]): PrismaObject => { + for (let key of keys) { + delete pobj[key]; + } + return pobj; +}; + +export { exclude }; \ No newline at end of file