Changelogs
Foro: restaurar posts y temas borrados (moderadores)
13 de julio de 2026 a las 01:07adevopg · 8a3ba8f
- lib/forum.ts: getTopic/getPosts/countPosts aceptan includeDeleted (mods ven lo borrado); Post.deleted y TopicFull.deleted. - API: PUT /api/forum/post restaura post (mod-only); moderate action 'restore' restaura tema (usa includeDeleted al leer el tema). - UI: posts borrados atenuados con badge y botón Restaurar (PostActions); TopicModBar muestra banner + Restaurar tema cuando el tema está borrado. - i18n es/en: Forum.restore, restoreTopic, deletedMark. Verificado: build OK, PUT post y moderate restore 401 sin sesión, /forum 200.
Foro: editor rico ligero (barra de formato) en respuestas, temas y edición
13 de julio de 2026 a las 01:03adevopg · 72fdead
- components/RichTextArea.tsx: barra de formato (negrita, cursiva, subrayado, tachado, enlace, cita, lista, código) que envuelve la selección del textarea en HTML; el HTML se sanea en el servidor con cleanPostHtml. Sin dependencias pesadas (evita CKEditor y no rompe el pipeline de saneado). - Cableado en ReplyForm, NewTopicForm y PostActions (edición). - i18n es/en: namespace Editor. Verificado: build OK, /forum y home 200.
Foro: mover tema entre foros (moderadores)
13 de julio de 2026 a las 01:01adevopg · 7c1cd19
- lib/forum-write.ts: moveTopic (forum_id + moved=1). lib/forum.ts: listForumsForMove. - API /api/forum/moderate: acción 'move' con forumId, validando foro destino visible y distinto del actual. - TopicModBar: selector «Mover a» con los foros visibles (excl. el actual); tras mover, redirige al foro destino. - i18n es/en: Forum.moveTopic. Verificado: build OK, move 401 sin sesión, /forum 200.
Personajes: zona, raza/clase e imagen en el panel de cuenta
13 de julio de 2026 a las 00:59adevopg · 0247c6c
- lib/data/zone-names.json: ZONE_NAMES (9156 zonas) exportado de zone_definitions.py. - lib/character-info.ts: getZoneName, getClassCss/getClassName, getRaceName y getCharacterImage (raza/clase/género -> /races/big-*.webp, con validación de compatibilidad clase-raza y fallback unknown), portado de account.py. - lib/account.ts: Character enriquecido (race, class, zone, imageUrl, class/raceName). - account page: tarjetas con imagen de raza, color de clase WoW, nivel, raza/clase, 📍 zona y oro. globals.css: colores de clase (.class-*). - public/races: 20 imágenes de raza del tema + unknown.webp. Verificado: build OK, imágenes 200, /account 307→login. El JSON de zonas se usa solo en servidor (no infla el bundle cliente).
Stripe: webhook que entrega el servicio aunque el usuario no vuelva
13 de julio de 2026 a las 00:55adevopg · 389dac6
- app/api/stripe/webhook: verifica firma (constructEventAsync) y en checkout.session.completed registra la IP de Stripe (como Django) y ENTREGA el servicio. Idempotente frente a la página de éxito. - lib/stripe.ts: claimPaidCheckout ahora es ATÓMICO (UPDATE ... WHERE fulfilled=0 + affectedRows) para evitar doble entrega entre webhook y página de éxito; nuevo recordStripeIp. - lib/fulfill.ts: fulfillCheckoutSession compartido (reclama + resuelve servicio desde metadata.service + ejecuta). checkout guarda `service` en metadata. - service-success: usa la entrega compartida y distingue entregado/ya-procesado/error. - i18n: Paid.alreadyProcessed. Requiere configurar STRIPE_WEBHOOK_SECRET en .env.local (endpoint apuntando a /api/stripe/webhook, evento checkout.session.completed). Verificado: build OK, webhook 400 sin firma / firma inválida.


