e00a439dd9
- Route handlers: /api/auth/logout (destroy sesión), /api/auth/select-account (fija la cuenta de juego elegida, valida que pertenece a la bnet en sesión). - app/[locale]/select-account: página SSR (guarda: sin bnetId -> login) + lista de cuentas de juego (SelectAccountForm cliente) -> /account. - app/[locale]/account: página protegida (sin bnetId -> login; sin username -> select-account) con datos de sesión + LogoutButton. - Textos en messages (Account, SelectAccount). Verificado: guardas locale-aware (ES /account -> /login, EN /en/account -> /en/login, 307), logout OK, select-account sin sesión 401. Redirect i18n con next-intl. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
27 lines
874 B
TypeScript
27 lines
874 B
TypeScript
import { getGameAccounts } from '@/lib/auth'
|
|
import { getSession } from '@/lib/session'
|
|
import { setGameAccountSession } from '@/lib/account-session'
|
|
|
|
export async function POST(request: Request) {
|
|
const session = await getSession()
|
|
if (!session.bnetId) {
|
|
return Response.json({ success: false, error: 'notAuthenticated' }, { status: 401 })
|
|
}
|
|
let accountId: number
|
|
try {
|
|
const body = await request.json()
|
|
accountId = Number(body.accountId)
|
|
} catch {
|
|
return Response.json({ success: false, error: 'invalidRequest' }, { status: 400 })
|
|
}
|
|
|
|
const games = await getGameAccounts(session.bnetId)
|
|
const chosen = games.find((g) => g.id === accountId)
|
|
if (!chosen) {
|
|
return Response.json({ success: false, error: 'invalidAccount' })
|
|
}
|
|
setGameAccountSession(session, chosen)
|
|
await session.save()
|
|
return Response.json({ success: true })
|
|
}
|