mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-07 19:10:12 +08:00
refactor: authController, add session types
This commit is contained in:
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
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user