← back to IWasCute
src/app/api/auth/route.ts
73 lines
import { NextRequest, NextResponse } from 'next/server'
import { query } from '@/lib/db'
import { cookies } from 'next/headers'
export async function POST(request: NextRequest) {
const body = await request.json()
const { action, email, password } = body
if (action === 'login') {
if (!email || !password) {
return NextResponse.json({ error: 'Email and password required' }, { status: 400 })
}
const result = await query(
`SELECT id, email, display_name, role
FROM users
WHERE email = $1 AND password_hash = crypt($2, password_hash)`,
[email, password]
)
if (result.rows.length === 0) {
return NextResponse.json({ error: 'Invalid credentials' }, { status: 401 })
}
const user = result.rows[0]
// Create session
const session = await query(
`INSERT INTO sessions (user_id) VALUES ($1) RETURNING token, expires_at`,
[user.id]
)
const cookieStore = await cookies()
cookieStore.set('iwascute-session', session.rows[0].token, {
httpOnly: true,
sameSite: 'lax',
path: '/',
maxAge: 60 * 60 * 24 * 7, // 7 days
})
return NextResponse.json({ user })
}
if (action === 'logout') {
const cookieStore = await cookies()
const token = cookieStore.get('iwascute-session')?.value
if (token) {
await query('DELETE FROM sessions WHERE token = $1', [token])
cookieStore.delete('iwascute-session')
}
return NextResponse.json({ success: true })
}
return NextResponse.json({ error: 'Unknown action' }, { status: 400 })
}
export async function GET() {
const cookieStore = await cookies()
const token = cookieStore.get('iwascute-session')?.value
if (!token) {
return NextResponse.json({ user: null })
}
const result = await query(
`SELECT u.id, u.email, u.display_name, u.role
FROM sessions s JOIN users u ON s.user_id = u.id
WHERE s.token = $1 AND s.expires_at > NOW()`,
[token]
)
return NextResponse.json({ user: result.rows[0] || null })
}