web-next: change-race/faction/level-up/gold por SumUp + rastreador de misiones

- /change-race-character (3€), /change-faction-character (5€, valida condiciones:
  sin hermandad/correo/subastas/capitán-arena y oro <= cap por nivel),
  /level-up-character (10€), /gold-character (oro por correo SOAP). Cada uno borra
  su ruta antigua y actualiza el link del panel.
- SumUp: hook precheck en PaidServiceConfig (condiciones cambio de facción);
  columna home_stripelog.metadata para campos extra (gold_amount).
- /quest-character: rastreador de estado de misiones/cadenas (clase, Hijos de
  Hodir, misión por ID) en personaje offline; cooldowns por categoría, Turnstile,
  IDs de misión verificados en wotlkdb 3.3.5a. Tabla home_questsearchhistory.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 12:39:28 +00:00
parent f7a376bd7c
commit eaae16e33a
24 changed files with 1154 additions and 112 deletions
@@ -27,6 +27,12 @@ export async function POST(request: Request, { params }: { params: Promise<{ ser
return Response.json({ success: false, error: 'invalidCharacter' })
}
// Comprobación previa al pago (condiciones del servicio, p.ej. cambio de facción).
if (cfg.precheck) {
const pc = await cfg.precheck(session.accountId, character)
if (!pc.ok) return Response.json({ success: false, error: 'ineligible', message: pc.message })
}
// Campos extra del servicio (gold_amount, destination_account...) -> metadata.
// `service` va en metadata para que el webhook sepa qué entregar sin la URL.
const metadata: Record<string, string> = { service }
@@ -60,6 +66,7 @@ export async function POST(request: Request, { params }: { params: Promise<{ ser
returnUrl: `${site}/service-success?service=${service}&provider=sumup&ref=${reference}`,
service,
characterName: character,
metadata,
})
if (!r.success || !r.url) return Response.json({ success: false, error: r.error || 'sumupError' })
return Response.json({ success: true, url: r.url })