63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import connectDB from '@/lib/mongodb'
|
|
import { User } from '@/models/user'
|
|
import { verifyRefreshToken } from '@/lib/jwt'
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
// Get refresh token from cookie
|
|
const refreshToken = request.cookies.get('refreshToken')?.value
|
|
|
|
if (refreshToken) {
|
|
// Verify and decode the refresh token to get user ID
|
|
const payload = verifyRefreshToken(refreshToken)
|
|
|
|
if (payload) {
|
|
// Connect to database and remove refresh token
|
|
await connectDB()
|
|
await User.findByIdAndUpdate(payload.userId, {
|
|
$unset: { refreshToken: 1 },
|
|
})
|
|
}
|
|
}
|
|
|
|
// Create response
|
|
const response = NextResponse.json({
|
|
success: true,
|
|
data: { message: 'Logged out successfully' },
|
|
})
|
|
|
|
// Clear cookies
|
|
response.cookies.set('accessToken', '', {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === 'production',
|
|
sameSite: 'lax',
|
|
maxAge: 0,
|
|
path: '/',
|
|
})
|
|
|
|
response.cookies.set('refreshToken', '', {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === 'production',
|
|
sameSite: 'lax',
|
|
maxAge: 0,
|
|
path: '/',
|
|
})
|
|
|
|
return response
|
|
} catch (error) {
|
|
console.error('Logout error:', error)
|
|
|
|
// Even if there's an error, we should still clear the cookies
|
|
const response = NextResponse.json({
|
|
success: true,
|
|
data: { message: 'Logged out successfully' },
|
|
})
|
|
|
|
response.cookies.set('accessToken', '', { maxAge: 0, path: '/' })
|
|
response.cookies.set('refreshToken', '', { maxAge: 0, path: '/' })
|
|
|
|
return response
|
|
}
|
|
}
|