Files
NightSpire/web-next/app/api/auth/recover/route.ts
T
Inna b9803adeb9 web-next: rediseño de security-token, recover, vote-points + rename-guild
- /security-token: diseño completo del original (info + advertencia + NOTA 7 días),
  fecha en formato HH:MM:SS DD-MM-YYYY, botón "Token enviado", enlace a /recover.
- /recover: 4 opciones (contraseña por usuario, nombre de cuenta, token de seguridad
  y enlace de activación por correo); recuperación de token nueva; Turnstile por envío.
- /vote-points: caja de info con las 7 secciones Q&A + panel "Sitios de votación" con
  tarjetas inline-div (imagen, PV, último voto), botón refrescar; abre el sitio y acredita
  PV al volver. lib/vote.ts + getVoteSitesForAccount.
- /rename-guild: renombra una hermandad de la que la cuenta es Maestro por 1000 PD +
  token de seguridad; SOAP .guild rename con comillas; reembolsa los PD si SOAP falla.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:06:49 +00:00

25 lines
904 B
TypeScript

import { requestRecovery } from '@/lib/recover'
import { verifyTurnstile } from '@/lib/turnstile'
export async function POST(request: Request) {
let type = ''
let value = ''
let turnstileToken = ''
try {
const body = await request.json()
type = String(body.type ?? '')
// `value` es el nombre de usuario (password) o el correo (resto). Se acepta
// `email` por compatibilidad.
value = String(body.value ?? body.email ?? '')
turnstileToken = String(body.turnstileToken ?? '')
} catch {
return Response.json({ success: false, error: 'invalidRequest' }, { status: 400 })
}
const ip = (request.headers.get('x-forwarded-for') || '').split(',')[0].trim()
if (!(await verifyTurnstile(turnstileToken, ip))) {
return Response.json({ success: false, error: 'captchaFailed' })
}
const result = await requestRecovery(type, value)
return Response.json(result)
}