diff --git a/src/server/middleware/authenticateAdmin.ts b/src/server/middleware/authenticateAdmin.ts new file mode 100644 index 0000000..b1e35aa --- /dev/null +++ b/src/server/middleware/authenticateAdmin.ts @@ -0,0 +1,47 @@ +import { NextFunction, Request, Response } from 'express'; +import passport from 'passport'; + +const authenticateAdmin = (req: Request, res: Response, next: NextFunction) => { + passport.authenticate('local', { session: true }, (err, _user, info) => { + if (err) { + return next(err); + } + + const u: any = req.user; + + if (!u) { + return res.status(401).json({ + statusCode: 401, + response: 'Error', + error: { + message: info?.message || 'Invalid authorization.', + path: req.path, + }, + }); + } + + if (!u.isAdmin) { + return res.status(403).json({ + statusCode: 403, + response: 'Error', + error: { + message: info?.message || 'Requires admin.', + path: req.path, + }, + }); + } + + req.auth = { + id: u.id, + username: u.username, + createdAt: u.createdAt, + updatedAt: u.updatedAt, + enabled: u.enabled, + isAdmin: u.isAdmin, + }; + + return next(); + })(req, res, next); +}; + +export default authenticateAdmin; diff --git a/src/server/middleware/authenticateLocal.ts b/src/server/middleware/authenticateLocal.ts index 22e384a..175315a 100644 --- a/src/server/middleware/authenticateLocal.ts +++ b/src/server/middleware/authenticateLocal.ts @@ -7,7 +7,9 @@ const authenticateLocal = (req: Request, res: Response, next: NextFunction) => { return next(err); } - if (!req.user) { + const u: any = req.user; + + if (!u) { return res.status(401).json({ statusCode: 401, response: 'Error', @@ -18,14 +20,13 @@ const authenticateLocal = (req: Request, res: Response, next: NextFunction) => { }); } - const u: any = req.user; - - req.user = { + req.auth = { id: u?.id, username: u?.username, createdAt: u?.createdAt, updatedAt: u?.updatedAt, enabled: u?.enabled, + isAdmin: u?.isAdmin, }; return next(); diff --git a/src/server/middleware/index.ts b/src/server/middleware/index.ts index 6b7ad01..5f5f46f 100644 --- a/src/server/middleware/index.ts +++ b/src/server/middleware/index.ts @@ -1,2 +1,3 @@ export { default as errorHandler } from './error-handler'; export { default as authenticateLocal } from './authenticateLocal'; +export { default as authenticateAdmin } from './authenticateAdmin'; diff --git a/src/server/types/express/index.d.ts b/src/server/types/express/index.d.ts new file mode 100644 index 0000000..5e98c2f --- /dev/null +++ b/src/server/types/express/index.d.ts @@ -0,0 +1,5 @@ +declare namespace Express { + export interface Request { + auth: any; + } +}