From 5e8df7ae01b3a716bec969995e2dc4eb13f5cbcd Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 19 Feb 2024 19:08:21 +0800 Subject: [PATCH] refactor: middlewares --- server/src/auth/passport.ts | 22 +++++++++---------- server/src/middleware/authRequired.js | 9 -------- server/src/middleware/authRequired.ts | 15 +++++++++++++ server/src/middleware/error.js | 13 ----------- server/src/middleware/error.ts | 20 +++++++++++++++++ .../{rateLimiter.js => rateLimiter.ts} | 10 +++++---- .../src/middleware/{session.js => session.ts} | 0 .../middleware/{validator.js => validator.ts} | 3 ++- 8 files changed, 53 insertions(+), 39 deletions(-) delete mode 100644 server/src/middleware/authRequired.js create mode 100644 server/src/middleware/authRequired.ts delete mode 100644 server/src/middleware/error.js create mode 100644 server/src/middleware/error.ts rename server/src/middleware/{rateLimiter.js => rateLimiter.ts} (56%) rename server/src/middleware/{session.js => session.ts} (100%) rename server/src/middleware/{validator.js => validator.ts} (63%) diff --git a/server/src/auth/passport.ts b/server/src/auth/passport.ts index bb13161..8b86d5b 100644 --- a/server/src/auth/passport.ts +++ b/server/src/auth/passport.ts @@ -7,12 +7,6 @@ import googleStrategy from './googleStrategy.js' import githubStrategy from './githubStrategy.js' import logger from '../utils/logger.js' -interface SerializedUser extends Express.User { - _id: string - username: string - email: string -} - passport.use(passwordStrategy) passport.use(jwtStrategy) @@ -32,21 +26,25 @@ if (githubStrategy !== null) { passport.use(githubStrategy) } -passport.serializeUser((user: Express.User, done: any) => { +passport.serializeUser((user: Express.User, done) => { process.nextTick(async () => { try { - const serializedUser = user as SerializedUser - if (!(await UserProfile.exists({ user: serializedUser._id }))) { - await UserProfile.create({ user: serializedUser._id }) + const id = (user as any)._id + if (!id) { + done(new Error('User has no _id')) + return } - done(null, serializedUser) + if (!(await UserProfile.exists({ user: id }))) { + await UserProfile.create({ user: id }) + } + done(null, user) } catch (err) { done(err) } }) }) -passport.deserializeUser((user: SerializedUser, done) => { +passport.deserializeUser((user: Express.User, done) => { process.nextTick(() => { done(null, user) }) diff --git a/server/src/middleware/authRequired.js b/server/src/middleware/authRequired.js deleted file mode 100644 index df0c937..0000000 --- a/server/src/middleware/authRequired.js +++ /dev/null @@ -1,9 +0,0 @@ -export default function authRequired(req, res, next) { - if (req.isAuthenticated() && !req.session.newUser) { - next() - return - } - res.status(401).json({ - message: 'not authenticated', - }) -} diff --git a/server/src/middleware/authRequired.ts b/server/src/middleware/authRequired.ts new file mode 100644 index 0000000..c7eb3d3 --- /dev/null +++ b/server/src/middleware/authRequired.ts @@ -0,0 +1,15 @@ +import type { Request, Response, NextFunction } from 'express' + +export default function authRequired( + req: Request, + res: Response, + next: NextFunction +) { + if (req.isAuthenticated() && !('newUser' in req.session)) { + next() + return + } + res.status(401).json({ + message: 'not authenticated', + }) +} diff --git a/server/src/middleware/error.js b/server/src/middleware/error.js deleted file mode 100644 index 51847e1..0000000 --- a/server/src/middleware/error.js +++ /dev/null @@ -1,13 +0,0 @@ -import logger from '../utils/logger.js' - -export function asyncHandler(fn) { - return (req, res, next) => { - fn(req, res, next).catch(next) - } -} - -// eslint-disable-next-line no-unused-vars -export default function errorHandler(err, req, res, next) { - logger.error(err) // Log error stack trace to the console - res.status(500).send({ message: 'Something broke!' }) // Send error response -} diff --git a/server/src/middleware/error.ts b/server/src/middleware/error.ts new file mode 100644 index 0000000..84081cf --- /dev/null +++ b/server/src/middleware/error.ts @@ -0,0 +1,20 @@ +import type { Request, Response, NextFunction } from 'express' +import logger from '../utils/logger.js' + +export function asyncHandler(fn: any) { + return (req: Request, res: Response, next: NextFunction) => { + fn(req, res, next).catch(next) + } +} + +// eslint-disable-next-line no-unused-vars +export default function errorHandler( + err: any, + req: Request, + res: Response, + // eslint-disable-next-line no-unused-vars + next: NextFunction +) { + logger.error(err) // Log error stack trace to the console + res.status(500).send({ message: 'Something broke!' }) // Send error response +} diff --git a/server/src/middleware/rateLimiter.js b/server/src/middleware/rateLimiter.ts similarity index 56% rename from server/src/middleware/rateLimiter.js rename to server/src/middleware/rateLimiter.ts index f8dcc32..88ac95f 100644 --- a/server/src/middleware/rateLimiter.js +++ b/server/src/middleware/rateLimiter.ts @@ -1,9 +1,11 @@ import rateLimit from 'express-rate-limit' +import type { Options } from 'express-rate-limit' +import type { Request, Response, NextFunction } from 'express' import config from '../config.js' -function createRateLimiter(options) { +function createRateLimiter(options: Partial) { if (config.testing.enabled) { - return (req, res, next) => next() + return (req: Request, res: Response, next: NextFunction) => next() } return rateLimit(options) } @@ -21,7 +23,7 @@ export const authenticateRateLimit = createRateLimiter({ export const sessionRateLimit = createRateLimiter({ windowMs: 10 * 1000, max: 1, - keyGenerator: (req) => { - return req.user ? req.user._id : req.ip + keyGenerator: (req: Request) => { + return req.user ? (req.user as any)._id : req.ip || '' }, }) diff --git a/server/src/middleware/session.js b/server/src/middleware/session.ts similarity index 100% rename from server/src/middleware/session.js rename to server/src/middleware/session.ts diff --git a/server/src/middleware/validator.js b/server/src/middleware/validator.ts similarity index 63% rename from server/src/middleware/validator.js rename to server/src/middleware/validator.ts index 891886b..54dfd3b 100644 --- a/server/src/middleware/validator.js +++ b/server/src/middleware/validator.ts @@ -1,6 +1,7 @@ import { validationResult } from 'express-validator' +import type { Request, Response, NextFunction } from 'express' -export function noError(req, res, next) { +export function noError(req: Request, res: Response, next: NextFunction) { const result = validationResult(req) if (result.isEmpty()) { next()