Files
NightSpire/web-next/app/api/auth/select-account/route.ts
T
Inna e00a439dd9 Cierra el flujo de login: logout, selector de cuenta y /account con guardas
- 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>
2026-07-12 22:46:42 +00:00

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 })
}