Equipo — The Good App

Mail 10 — Continuación del Mail 9 (moderación y UX de errores)

Hola equipo,

Este correo continúa la línea del Mail 9 (plan-frontend/mailnine.html): después del trabajo de suscripciones y AdMob, en este ciclo se incorporó moderación de comentarios y noticias, configuración centralizada en el panel admin (sin depender de variables de entorno para la IA), política de strikes y bloqueo de cuentas, y se alineó la app Flutter para mostrar mensajes de API en el idioma del dispositivo cuando el backend envía texto en inglés y español.

1) API Nest (good-app): moderación y bloqueos

  • La configuración de moderación (activación, lista extra, OpenAI opcional, umbral de rechazos, bloqueo automático) se lee desde la tabla Setting con clave content_moderation (JSON), no desde .env.
  • En comentarios y noticias, ante contenido rechazado la API devuelve 400 con message y messageEs, lista matchedTerms, contador de strikes y si el usuario quedó bloqueado en ese intento.
  • Campos nuevos en User: contentModerationStrikeCount y contentModerationBlockedAt. Migración Prisma aplicable con npx prisma migrate deploy.
  • Login, refresh, social login y JWT rechazan sesiones de usuarios bloqueados por moderación, con código CONTENT_MODERATION_BLOCKED y mensajes bilingües.
  • El filtro de formato de errores en rutas /api/auth/* ahora reenvía también messageEs dentro de error para que el cliente pueda localizar sin parsear cuerpos distintos.

2) Admin Laravel (admin-goodapp)

  • Nueva pestaña Content moderation en Configuración: formulario que persiste el JSON en Setting (misma base que la API).
  • Listado de usuarios bloqueados por moderación con acción Desbloquear (POST dedicado); al desbloquear se reinicia el contador de strikes.

3) Flutter (flutter-good): errores según idioma de la app

  • Antes, muchos fallos mostraban solo el mensaje en inglés (o fallback fijo) porque ApiException guardaba una sola cadena.
  • Ahora se parsean respuestas con message + messageEs (y error.messageEs en auth); AuthController.messageForError elige la cadena según localeName de AppLocalizations.
  • Repositorios de auth, suscripciones, comunidades, crear noticia/proyecto y comentarios usan un parser común; pantallas relevantes (login, alta de comentarios, suscripción, etc.) ya pasan por ese camino donde aplica.

4) Documentación y despliegue

Este archivo vive junto al Mail 9 en good-app/plan-frontend/. Recordatorio: aplicar migraciones en el entorno que comparte base entre API y admin antes de usar bloqueos en producción.

Saludos,

Correo interno — avance técnico (Mail 10)