You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/docs/implementacion-2026-09-11.md

123 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Implementación de la revisión de Senza Paura
Fecha: 11 de septiembre de 2026. Rama: `codex/redisenio-dominio-musical`.
Este documento registra los cambios realizados a partir del
[informe de auditoría](analisis-aplicacion-2026-09-11.md). El informe original
se conserva para poder contrastar los hallazgos con la implementación.
## Resultado
Se han corregido los problemas de autorización, conservación de compras y
créditos, entrega MP3, publicación de versiones, caché entre procesos, apertura
de pagos, mantenimiento, límites de subida, modal y textos. El despliegue
prepara ahora las dos aplicaciones y conserva una release anterior recuperable.
El panel añade créditos completos, portadas y fotografías con previsualización
y recorte central, audio propio por versión, revisión del catálogo, conciliación
de pagos y concesiones manuales de suscripción. Las listas se pueden renombrar,
reordenar y eliminar con confirmación.
La implementación está en el repositorio. No se ha desplegado en el servidor ni
se han aplicado las nuevas migraciones a la base compartida. Las pruebas de
PostgreSQL utilizan tablas y funciones temporales de sesión, con Stripe simulado.
No se han realizado cobros, reembolsos ni envíos de correo.
## Correcciones por hallazgo
| Hallazgo | Cambio implementado | Límite o puesta en marcha |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| H01 Autorización | El hook exige administrador antes de resolver rutas protegidas; las acciones repiten la guarda. | Pruebas unitarias de roles y peticiones HTTP anónimas, tanto HTML como JSON. |
| H02 Escucha interceptada | El ejemplo Nginx envía `/escucha` a Node, que autoriza y sirve Range. | Sustituir la configuración efectiva al desplegar. |
| H03 Despliegue incompleto | Builds de sitio y panel, releases separadas, rutas persistentes, entorno comprobado, migración en destino y restauración del enlace anterior ante fallo. | Requiere instalar las dos unidades y ensayar la recuperación en el servidor. |
| H04 Créditos ausentes | El auditor denuncia publicaciones sin intérprete; el panel permite asignar créditos y muestra las incidencias. | No se han inventado intérpretes: faltan los nombres reales de las 11 canciones existentes. |
| H05 Pérdida de créditos | El guardado conserva instrumento y acreditación de los intérpretes principales que permanecen seleccionados. | Quitar explícitamente un intérprete elimina ese crédito. |
| H06 Biblioteca incompleta | La biblioteca consulta compras, títulos históricos y representaciones, independientemente de la visibilidad del catálogo. | Incluye versiones publicadas o retiradas; las versiones en borrador no se entregan. |
| H07 Entrega incorrecta | Cada nuevo ingreso genera una descarga MP3 separada. Un MP3 real se conserva; otros códecs se convierten a MP3 a 320 kbps. | El catálogo existente ya tenía másteres MP3; se aceptan como entrega mientras no haya una representación explícita. |
| H08 Publicación desigual | Se validan las versiones en transacción. Nuevas guardas diferidas de PostgreSQL exigen intérprete principal, escucha, letra cuando corresponde y MP3 comercial. | Aplicar `0025_guardas_publicacion.sql`. Las importaciones deben completar las relaciones en la misma transacción. |
| H09 Caché desincronizada | La memoria se comparte dentro de una petición, sin caché global de 60 segundos. | Los datos ya mostrados en una pestaña cambian al refrescar o navegar; no se ha añadido actualización en directo. |
| H10 Pagos duplicados | Intención persistida antes de Stripe, clave idempotente estable, sesión reutilizable, datos de precio congelados y creación idempotente de pedido. | Aplicar `0024_intenciones_pago.sql`. Una intención incierta caducada exige conciliación; no se sustituye silenciosamente. |
| H11 Webhooks bloqueados | El webhook atraviesa el modo de espera y mantiene la verificación de firma. | No abre otras rutas API. |
| H12 Límite multipart | Archivo máximo de 256 MiB y cuerpo del panel de 260 MiB; configuración Nginx y documentación alineadas. | Procesado síncrono limitado a uno por proceso; el proxy administrativo permite 900 segundos. |
| H13 Modal horizontal | Al ocultar la ilustración, el marco pasa a una sola columna. | Verificado a 812 × 375. |
| H14 Tamaño del pack | La biblioteca usa `CANCIONES_POR_PACK`. | La tienda mantiene packs de diez canciones. |
| H15 Señal de calidad | Vitest conserva módulos virtuales de Kit sin arrancar su servidor SSR; formato corregido y nuevas regresiones. | Las pruebas PostgreSQL se ejecutan explícitamente con `TEST_DATABASE_URL`; no dependen del catálogo de producción. |
| H16 Documentación | README corregido a PostgreSQL, panel independiente, rutas legales y procedimiento nuevo. | La configuración fiscal y los textos comerciales siguen siendo decisiones del proyecto. |
Se corrigió además una comprobación de favoritos que no esperaba la promesa de
`obtenerCancion`, y se reforzó la compensación de archivos: una respuesta incierta
de COMMIT no provoca la eliminación de medios que pueden haber quedado registrados.
## Refactorizaciones
- **R01:** las rutas editoriales y de cuenta dejan de recibir el catálogo completo.
La biblioteca comprada tiene su propio modelo. El pago obtiene las compras en
lote y reutiliza la consulta de catálogo de la petición. En las pantallas
musicales se conserva el contrato compartido para tarjetas, discos y reproductor;
no se ha sustituido todo el catálogo por un sistema de consultas paginadas.
- **R02:** se separan validadores de canciones, registro y compensación de audio,
detalle del título de una fila, biblioteca comprada y editor de listas. Los
componentes grandes de capítulos y géneros mantienen su estructura; no se han
dividido por tamaño sin una responsabilidad clara que extraer.
- **R03:** publicación protegida también en PostgreSQL, validación compartida de
canciones y créditos, servicio de Checkout e ingreso común de las representaciones.
- **R04:** manifiestos de procesado con estados, límite de concurrencia por proceso,
publicación sin sobrescritura y herramienta de reconciliación. Conserva archivos
registrados incluso si se pierde la respuesta de la transacción. No es todavía
una cola distribuida con trabajadores independientes; esa ampliación corresponde
a un uso frecuente o a regeneraciones masivas, como indicaba la auditoría.
## Funciones añadidas
| Propuesta | Disponible |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A01 Alta musical | Artistas seleccionables en el alta; créditos con papel, instrumento, acreditación y orden; audio de versiones; imágenes de canción, álbum o artista con previsualización y recorte central. La imagen se asigna desde su pantalla del panel. |
| A02 Compras y pedidos | Biblioteca con formato, tamaño y disponibilidad; pedidos pendientes, pagados y cancelados en la cuenta; conciliación en el panel y consulta del importe reembolsado en Stripe. Los reembolsos se tramitan en Stripe; no se ha automatizado la retirada de derechos ni una descarga ZIP. |
| A03 Listas | Renombrado, borrado confirmado y orden mediante botones accesibles. La propiedad se comprueba en servidor. |
| A04 Suscripción | Concesión manual por cuenta y días, vencimiento, revocación y consulta del último periodo. La cuenta explica cómo solicitar o gestionar el acceso. No hay contratación ni renovación con cobro recurrente. |
| A05 Descubrimiento | Llamada de primera escucha antes del tocadiscos en móvil y enlace a intérpretes desde Música. |
| A06 Operación | Estado del catálogo con créditos, archivos de escucha y descarga, ondas, portadas y trabajos de procesado pendientes. Detecta existencia física; no certifica la calidad artística ni decodifica todo el almacén en cada visita. |
## Validación
- Tipos: sitio y panel sin errores ni advertencias de Svelte.
- Formato y ESLint: comprobados sobre el repositorio.
- Pruebas unitarias y de componentes: 402 aprobadas.
- PostgreSQL: 11 pruebas aprobadas en tablas y funciones TEMP. Incluyen reintento
de pago incierto, conservación de compras retiradas, créditos, publicación,
propiedad de listas, suscripción manual e imágenes reales procesadas con ffmpeg.
- Builds de producción: sitio y panel terminan con salida 0.
- Navegador: 61 pruebas aprobadas. Navegación y responsive existentes, nueva portada móvil, modal
horizontal, carga del taller y protección HTTP del panel. Se excluye la prueba
que solicita un código por correo.
- Shell: los scripts de despliegue pasan la comprobación de sintaxis de Bash.
Las comprobaciones de navegador necesitaron acceso a la base desde el proceso
local de preview. Los primeros intentos con acceso de red restringido devolvían
500 por falta de conexión; no se usaron como evidencia de corrección funcional.
El proveedor de pagos y el servidor Linux de producción no se han ensayado en vivo.
## Puesta en marcha y datos pendientes
1. Confirmar el intérprete de Dorina y los de Cupido sin flechas. Con esos datos,
asignar los créditos reales desde el panel. El auditor debe dejar de indicar
publicaciones sin intérprete.
2. Aplicar las migraciones 0024 y 0025 junto al despliegue. Son aditivas: no rellenan
datos ni eliminan tablas. La 0025 añade guardas que rechazan nuevas escrituras
incompatibles con una publicación completa.
3. Preparar `.env` y `.env.panel`, la misma base y rutas absolutas compartidas de
medios. Seguir [el procedimiento de despliegue](../despliegue/LEEME.md).
4. Comprobar con las cuentas reales de prueba la pasarela, la firma del webhook,
las unidades de servicio, TLS y la recuperación. Las pruebas del repositorio
no sustituyen este ensayo operativo.
## Capturas verificadas
Primera escucha en móvil, 375 × 667:
![Portada móvil con la primera escucha visible](assets/implementacion-portada-movil.png)
Modal horizontal, 812 × 375:
![Modal de acceso en una sola columna](assets/implementacion-modal-horizontal.png)

Powered by TurnKey Linux.