refactor: authController, add session types

This commit is contained in:
wancat committed 2024-02-22 20:35:19 +08:00
1 parent 885f1c5b27
commit 59590639ee
3 files changed
+120 -92

No files matched your search

@@ -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',
})
})
})
@@ -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',
})
}
)
}
)
+9
View File
@@ -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
}
}