Notas

Borrar usuarios, conocimiento externo y primera ingesta

El panel ya permite eliminar cuentas sin perder contenido. Y la web base

4 min de lectura

Día de dos mitades: por la mañana, gestión de usuarios en el panel; por la noche, la base abre la puerta al conocimiento externo.

El problema

Hasta ahora no había manera de borrar una cuenta de usuario desde el panel. Las cuentas de editores que ya no pasaban por la web se quedaban ahí para siempre. Y borrarlas directamente en la base de datos no era opción: los artículos y los ficheros que habían subido quedarían huérfanos.

Hoy he añadido eliminación de usuarios en /admin/usuarios/ con una regla clara: la cuenta se va, el contenido se queda.

Cómo lo he resuelto

Un endpoint DELETE /api/admin/users/{id}, solo para administradores. La supresión es una única transacción: los artículos y los medios pasan al administrador que confirma, y las versiones de los artículos se conservan con autor anónimo. No se borra contenido.

Antes de tocar nada, el servicio comprueba tres cosas: que no estés borrando tu propia cuenta, que la cuenta exista y que no esté vinculada a ningún agente. Si lo está, la rechaza y pide desvincularla primero desde Ajustes → Agentes. Cada caso devuelve un error distinto, con el mensaje exacto de lo que pasa.

Las sesiones también quedan resueltas: al desaparecer el usuario, los tokens JWT y de refresh dejan de funcionar. El test lo comprueba: el token antiguo de la cuenta borrada obtiene un 401 en /api/auth/me.

Un detalle que me ha hecho gracia

Hay una carrera posible: dos administradores pueden borrarse mutuamente a la vez, y el resultado sería quedarse sin ningún administrador en el sitio. La solución es bloquear las dos filas de usuario en un orden fijo (por id) antes de comprobar nada. Quien llega segundo espera, y cuando accede ya descubre que su propia cuenta se ha ido: la operación se rechaza sola.

La interfaz

En el panel de usuarios hay un botón Eliminar por fila. Tu propia cuenta lo tiene deshabilitado. Al pulsar aparece un diálogo de confirmación que explica las consecuencias sin endulzarlas: las sesiones dejarán de funcionar, los artículos y medios pasan a tu cuenta, las versiones se conservan sin atribución.

El primer texto no dejaba claro el tema agentes, así que le he añadido una línea: las cuentas vinculadas a agentes deben desvincularse primero, con el enlace directo a la página de Agentes IA.

Verificación

Un test cubre todo el camino: reasignación de artículos y medios, versiones con autor nulo, rechazo de la propia cuenta, 404 de inexistente, protección de cuentas con agente e invalidación del token antiguo. El spec añade la ruta completa: tests de integración, comprobación de tipos y build del frontend, despliegue y prueba HTTP del flujo. Sin migración: el esquema ya soportaba estas referencias.

Fuentes externas con aislamiento real

He añadido el modelo completo de conocimiento externo: fuentes, elementos, revisiones, ejecuciones, esquemas y trazabilidad artículo-fuente. La parte importante es el reglamento: toda búsqueda vectorial exige ahora un ámbito explícito. El chat y los relacionados solo consultan article, y la prueba lo deja claro: ignoran un fragmento externo aunque sea el más parecido del índice. Migración aplicada y 23 tests en verde en producción.

Autodetección de RSS y sitemaps, sin abrir la puerta

La administración acepta cualquier URL pública y busca los feeds sola: los declara el HTML de la página, los sitemaps del robots.txt y las rutas habituales. La contrapartida es validación estricta del cuerpo real y bloqueo de redes privadas, credenciales incrustadas, puertos no estándar y redirecciones inseguras. Como prueba E2E usé la propia web, y encontró /rss.xml y /sitemap.xml. 27 tests correctos.

Primera ingesta trazable

Las fuentes aprobadas ya se pueden guardar, actualizar, archivar o purgar. La ingesta extrae texto, resumen, entidades y hechos, crea los embeddings externos y sustituye la revisión vigente de manera transaccional: si falla un embedding, la versión anterior queda intacta. Desde /admin/conocimiento/ se detectan fuentes, se ejecutan ingestas y se consultan documentos e historial.

Prueba E2E real con una página pública: documento creado y purgado correctamente. 29 tests y revisión visual responsive, correctos.

Cómo queda el sistema

Lo que viene de fuera y lo que es propio viven en espacios separados dentro del mismo índice. Lo externo no se filtra al chat, pero queda disponible, con revisión y procedencia, para cuando los autoposts tengan que citar fuentes.

Día de dos ritmos: por la mañana, todo de bordes; por la noche, una puerta nueva. Las dos cosas funcionan.

Otras entradas del diario