From 59590639eeef08e5963260938cb9ed63dac2aff3 Mon Sep 17 00:00:00 2001 From: wancat Date: Thu, 22 Feb 2024 20:35:19 +0800 Subject: [PATCH] refactor: authController, add session types --- server/src/api/controllers/authController.js | 92 --------------- server/src/api/controllers/authController.ts | 111 +++++++++++++++++++ server/src/types/express-session.d.ts | 9 ++ 3 files changed, 120 insertions(+), 92 deletions(-) delete mode 100644 server/src/api/controllers/authController.js create mode 100644 server/src/api/controllers/authController.ts create mode 100644 server/src/types/express-session.d.ts diff --git a/server/src/api/controllers/authController.js b/server/src/api/controllers/authController.js deleted file mode 100644 index abfb053..0000000 --- a/server/src/api/controllers/authController.js +++ /dev/null @@ -1,92 +0,0 @@ -import { matchedData } from 'express-validator' -import { genJWT } from '../../utils/auth.js' -import { createUser } from '../../models/userManager.js' -import { asyncHandler } from '../../middleware/error.js' -import logger from '../../utils/logger.js' - -export const issueToken = asyncHandler(async (req, res) => { - const { user } = req - const token = await genJWT({ - _id: user.id, - username: user.username, - email: user.email, - }) - res.json({ token }) -}) - -export const register = asyncHandler(async (req, res, next) => { - const { username, password, email } = matchedData(req) - - const user = await createUser(username, email, { password }) - req.login(user, (err) => { - if (err) { - next(err) - return - } - res.status(201).json({ - message: 'user created', - }) - }) -}) - -export function logout(req, res) { - req.logout((err) => { - if (err) { - logger.error(err) - res.status(500).json({ - message: 'error logging out', - }) - return - } - res.status(200).json({ - message: 'logged out', - }) - }) -} - -export function checkSession(req, res) { - res.json({ - loggedIn: req.isAuthenticated() && !req.session.newUser, - }) -} - -export function socialLoginHandler(req, res) { - const { newUser } = req.user - if (newUser) { - req.session.newUser = newUser - res.redirect('/choose-username') - return - } - res.redirect('/') -} - -export const registerFromSession = asyncHandler(async (req, res, next) => { - const { username } = matchedData(req) - const { newUser } = req.session - - if (!newUser) { - res.status(401).json({ - message: 'no new user found', - }) - return - } - - const { email, socialLogin } = newUser - - if (!socialLogin) { - throw new Error('Socail Login not found') - } - - const user = await createUser(username, email, { socialLogin }) - - req.login(user, (err) => { - if (err) { - next(err) - return - } - delete req.session.newUser - res.status(201).json({ - message: 'user created', - }) - }) -}) diff --git a/server/src/api/controllers/authController.ts b/server/src/api/controllers/authController.ts new file mode 100644 index 0000000..a86f0fb --- /dev/null +++ b/server/src/api/controllers/authController.ts @@ -0,0 +1,111 @@ +import type { Request, Response, NextFunction, Express } from 'express' +import { matchedData } from 'express-validator' +import { genJWT } from '../../utils/auth.js' +import { createUser } from '../../models/userManager.js' +import { asyncHandler } from '../../middleware/error.js' +import logger from '../../utils/logger.js' + +export const issueToken = asyncHandler(async (req: Request, res: Response) => { + const user = req.user as Express.ExistingUser + const token = await genJWT({ + _id: user.id, + username: user.username, + email: user.email, + }) + res.json({ token }) +}) + +export const register = asyncHandler( + async (req: Request, res: Response, next: NextFunction) => { + const { username, password, email } = matchedData(req) + + const user = await createUser(username, email, { password }) + req.login( + { + id: user.id, + username: user.username, + email: user.email, + }, + (err) => { + if (err) { + next(err) + return + } + res.status(201).json({ + message: 'user created', + }) + } + ) + } +) + +export function logout(req: Request, res: Response) { + req.logout((err) => { + if (err) { + logger.error(err) + res.status(500).json({ + message: 'error logging out', + }) + return + } + res.status(200).json({ + message: 'logged out', + }) + }) +} + +export function checkSession(req: Request, res: Response) { + res.json({ + loggedIn: req.isAuthenticated() && !req.session.newUser, + }) +} + +export function socialLoginHandler(req: Request, res: Response) { + const { newUser } = req.user as Express.NewUser + if (newUser) { + req.session.newUser = newUser + res.redirect('/choose-username') + return + } + res.redirect('/') +} + +export const registerFromSession = asyncHandler( + async (req: Request, res: Response, next: NextFunction) => { + const { username } = matchedData(req) + const { newUser } = req.session + + if (!newUser) { + res.status(401).json({ + message: 'no new user found', + }) + return + } + + const { email, socialLogin } = newUser + + if (!socialLogin) { + throw new Error('Socail Login not found') + } + + const user = await createUser(username, email, { socialLogin }) + + req.login( + { + id: user.id, + username: user.username, + email: user.email, + }, + (err) => { + if (err) { + next(err) + return + } + delete req.session.newUser + res.status(201).json({ + message: 'user created', + }) + } + ) + } +) diff --git a/server/src/types/express-session.d.ts b/server/src/types/express-session.d.ts new file mode 100644 index 0000000..efc60b3 --- /dev/null +++ b/server/src/types/express-session.d.ts @@ -0,0 +1,9 @@ +/* eslint-disable no-undef */ +/* eslint-disable no-unused-vars */ +import 'express-session' + +declare module 'express-session' { + interface SessionData { + newUser?: Express.PendingUser // Adjust the type according to your newUser structure + } +}