Files
NightSpire/web-next/app/api/armory/suggest/route.ts
T
Inna 65f6776969 Armería: búsqueda insensible a mayúsculas, autocompletar y proxy del visor 3D
Tres arreglos:

1) Búsqueda insensible a mayúsculas/minúsculas. Las consultas usaban LIKE directo
   (sensible según la colación de la tabla), así que 'test' no encontraba 'Test'.
   Ahora comparan con LOWER(col) LIKE LOWER(?).

2) Autocompletar tipo wowhead. Nuevo /api/armory/suggest + ArmorySearchBox
   reescrito: al teclear (≥1 carácter, con debounce) muestra un desplegable con
   personajes, ítems y hermandades que coinciden; clic va directo a la ficha/wowhead.
   Enter o el botón siguen haciendo la búsqueda completa.

3) Visor 3D «no disponible». Causa: el contenido de wow.zamimg.com/modelviewer no
   envía cabeceras CORS (el propio README de wow-model-viewer pide un proxy). Se
   añade un rewrite en next.config (/modelviewer/* -> zamimg) para servirlo
   same-origin, y el visor usa esas rutas. Además, si falla la resolución de ítems
   se renderiza el personaje sin equipo, y los errores se registran en consola para
   diagnóstico.

Verificado: 'test' encuentra 'Test'; el autocompletar responde; el proxy
/modelviewer/live/viewer/viewer.min.js sirve 200 same-origin.

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

24 lines
976 B
TypeScript

import { suggest } from '@/lib/armory'
import { raceName, className } from '@/lib/wow-data'
// Sugerencias para el autocompletar de la armería (personajes, ítems, hermandades).
export async function GET(request: Request) {
const url = new URL(request.url)
const q = (url.searchParams.get('q') ?? '').trim()
const locale = url.searchParams.get('locale') === 'en' ? 'en' : 'es'
if (q.length < 1) return Response.json({ characters: [], items: [], guilds: [] })
const { characters, items, guilds } = await suggest(q, locale)
return Response.json({
characters: characters.map((c) => ({
guid: c.guid,
name: c.name,
level: c.level,
class: c.class,
sub: `${raceName(c.race, locale)} · ${className(c.class, locale)}`,
})),
items: items.map((i) => ({ entry: i.entry, name: i.name, quality: i.quality, itemLevel: i.itemLevel })),
guilds: guilds.map((g) => ({ guildid: g.guildid, name: g.name, members: g.members })),
})
}