feat: app completa recordaLexia (fases 1-5)
App web familiar de rutinas visuales para niños con TDAH: muestra cada día el material del cole y las rutinas de tarde, con gamificación por monedas y tienda de recompensas. Multi-niño y bilingüe ES/CA. Uso doméstico/homelab. Backend (Spring Boot 3.5 / Java 21 / Gradle): - Dominio por capas, PostgreSQL + Liquibase, datos semilla. - API REST con DTOs: /today, toggle con monedas y bonos de bloque/día, monedero, tienda/canje, ajustes y CRUD del panel de padres. - Seguridad ligera por PIN (BCrypt + sesion en memoria), sin Keycloak. - Tests JUnit: generacion del dia, monedas/bonos con reversion, canje, seguridad. Frontend (Angular 19, standalone + signals): - Perfiles, Home (Tablero y Foco), Tienda y panel de padres (5 pestañas). - Tipografia OpenDyslexic conmutable (accesibilidad), i18n ES/CA, TTS y sonido. - Tokens de diseño fieles al handoff (paleta, animaciones, monedas voladoras). Empaquetado: - Docker multi-stage + docker-compose (PostgreSQL + backend + Nginx). - Decisiones de arquitectura documentadas en docs/adr.
This commit is contained in:
114
docs/prompt-claude-code-backend-rutinas-tdah.md
Normal file
114
docs/prompt-claude-code-backend-rutinas-tdah.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Backend de recordaLexia (app de rutinas para niños con TDAH) — Spring Boot 3 / Java 21
|
||||
|
||||
## Objetivo
|
||||
Implementa el backend de una app web familiar (uso doméstico, homelab) que presenta
|
||||
a niños con TDAH sus tareas del día: material para el cole por la mañana y rutinas de
|
||||
la tarde, con gamificación por monedas y tienda de recompensas. Los padres configuran
|
||||
horario, eventos y premios. Es MULTI-NIÑO y BILINGÜE (español / catalán).
|
||||
|
||||
Trabajas en LOCAL. No despliegues en nube ni asumas infraestructura corporativa.
|
||||
|
||||
## Stack (NADA corporativo: ni Keycloak, ni Gravitee, ni Camunda, ni K8s, ni Jenkins)
|
||||
- Java 21, Spring Boot 3.x, Gradle 8.
|
||||
- PostgreSQL (Liquibase para el esquema).
|
||||
- Spring Web (REST), Spring Data JPA, Spring Security (auth ligera, ver abajo).
|
||||
- Arquitectura limpia por capas (controller / service / repository / domain). No hace
|
||||
falta hexagonal completa, pero mantén el dominio aislado de JPA donde sea razonable.
|
||||
- Docker multi-stage + docker-compose (postgres + backend; deja hueco para el frontend
|
||||
Angular tras Nginx).
|
||||
- Comenta el código en español, sobre todo la lógica de negocio.
|
||||
|
||||
## i18n (requisito derivado del diseño)
|
||||
La UI es ES/CA. Todos los textos visibles para el niño (materiales, actividades,
|
||||
rutinas, premios, tipos de evento) deben almacenarse con sus dos variantes:
|
||||
campos `labelEs` y `labelCa` (o una tabla de traducciones, a tu criterio). La API
|
||||
devuelve ambas y el frontend elige según el idioma activo.
|
||||
|
||||
## Modelo de dominio
|
||||
- Child: id, name, mascot (emoji), accentColor, age, coins (saldo),
|
||||
departureTime (hora de salida de la mañana, para el temporizador),
|
||||
y ajustes: viewMode (BOARD | FOCUS), soundEnabled, ttsEnabled, language (ES | CA).
|
||||
- ParentUser: credenciales del panel de padres (PIN configurable, no hardcodeado).
|
||||
- Activity (actividad del cole, p. ej. "Gimnasia"): id, labelEs, labelCa, icon (emoji),
|
||||
color.
|
||||
- MaterialItem: id, labelEs, labelCa, icon (emoji), color, categoría. Relación N:M con
|
||||
Activity (Gimnasia -> equipación, zapatillas, toalla, agua).
|
||||
- WeeklyTemplateEntry: plantilla recurrente. childId, dayOfWeek (LUN–VIE),
|
||||
slot (MORNING | AFTERNOON), referencia a Activity (mañana) o a una rutina de tarde,
|
||||
order (para reordenar), coinsReward. Define "lo normal" de cada día.
|
||||
- AfternoonRoutine: rutina de tarde recurrente. childId, dayOfWeek, labelEs, labelCa,
|
||||
icon, color, order. (Reordenables en el panel de padres.)
|
||||
- SpecialEvent: childId, date, type (EXAM | HOMEWORK), titleEs, titleCa, icon, color.
|
||||
- DailyTask: INSTANCIA de un día. childId, date, slot, labelEs, labelCa, icon, color,
|
||||
status (PENDING | DONE), coinsReward, completedAt, origen (plantilla o evento).
|
||||
- CoinTransaction: childId, date, amount (positivo al ganar, negativo al canjear), motivo.
|
||||
- Reward: premio canjeable. labelEs, labelCa, icon, color, cost (monedas), active.
|
||||
- RewardRedemption: childId, rewardId, date, cost.
|
||||
|
||||
## Lógica de negocio clave
|
||||
- Generación del día: al pedir el día de hoy (o vía scheduler matutino), si no existen
|
||||
DailyTask para childId+fecha, se generan desde (a) WeeklyTemplateEntry y rutinas del
|
||||
dayOfWeek y (b) SpecialEvent de esa fecha. Idempotente.
|
||||
- Marcar DailyTask como DONE: cambiar estado, registrar completedAt, sumar coinsReward,
|
||||
crear CoinTransaction. Si se desmarca, revertir de forma coherente.
|
||||
- Bono por completar bloque (mañana/tarde) y por completar el día entero: aplica
|
||||
coinsPerBlock / coinsPerDay configurables (ver gamificación).
|
||||
- Tienda: al canjear, validar saldo suficiente, descontar, crear CoinTransaction
|
||||
(negativa) y RewardRedemption. Si no llega, devolver error claro ("te faltan N").
|
||||
- Progreso del día por slot y global, por niño.
|
||||
- Zona horaria fija (Europe/Madrid) para decidir qué es "hoy".
|
||||
- Conservar histórico de DailyTask y canjes (no borrar al pasar el día).
|
||||
|
||||
## Gamificación (configurable)
|
||||
Parámetros por niño (o globales con override por niño): coinsPerTask (def. 5),
|
||||
coinsPerBlock (def. 10), coinsPerDay (def. 20). Expónlos para que el panel de padres
|
||||
los edite.
|
||||
|
||||
## API REST (orientativa, ajústala con criterio)
|
||||
- GET /api/children -> perfiles (con mascot, color, edad, coins).
|
||||
- GET /api/children/{id}/today -> { morning[], afternoon[], specialEvents[],
|
||||
progress, wallet, timer } (timer derivado de departureTime).
|
||||
- POST /api/tasks/{taskId}/toggle -> marca/desmarca y ajusta monedas.
|
||||
- GET /api/children/{id}/wallet -> saldo + historial.
|
||||
- GET /api/children/{id}/rewards -> tienda visible para ese niño.
|
||||
- POST /api/rewards/{rewardId}/redeem -> canje (valida saldo, descuenta).
|
||||
- PUT /api/children/{id}/settings -> viewMode, sound, tts, language, departureTime.
|
||||
- Panel de padres (requiere auth):
|
||||
- CRUD de Child.
|
||||
- CRUD de Activity y MaterialItem (con icon, color, labelEs/labelCa, asociaciones).
|
||||
- CRUD de WeeklyTemplateEntry (horario por niño).
|
||||
- CRUD de AfternoonRoutine (con order).
|
||||
- CRUD de SpecialEvent.
|
||||
- CRUD de Reward.
|
||||
- PUT de parámetros de gamificación.
|
||||
|
||||
## Seguridad (ligera, doméstica)
|
||||
- Modo kiosko (niño): lectura + marcar tareas + canjear, sin login molesto
|
||||
(token de dispositivo o sesión persistente del kiosko).
|
||||
- Panel de padres: protegido por PIN configurable. Roles CHILD y PARENT.
|
||||
- Sin Keycloak/OAuth2 en esta fase; déjalo encapsulado por si se externaliza luego.
|
||||
|
||||
## Datos semilla (reproducir el prototipo de Claude Design)
|
||||
- Niños: Nora 🦊 (#F2A65A, 7, 42 monedas), Leo 🐢 (#5BC0BE, 9, 28),
|
||||
Mía 🦉 (#A78BD0, 6, 55).
|
||||
- Material de cole (ES/CA): estuche/estoig ✏️, libro de mates/llibre de mates 📘,
|
||||
flauta 🎵, ropa de gimnasia/roba d'EF 👕, zapatillas/sabatilles 👟, almuerzo/esmorzar 🍎.
|
||||
- Rutinas de tarde: deshacer la mochila/buidar la motxilla 🎒, merendar/berenar 🥪,
|
||||
hacer los deberes/fer els deures 📝, practicar piano 🎹, recoger la mesa/parar taula 🍽️.
|
||||
- Actividades: Gimnasia 🤸 (equipación, zapatillas, toalla, agua), Música 🎵
|
||||
(flauta, libreta), Matemáticas 📘 (libro, regla, estuche), Lengua 📖 (lectura, cuaderno).
|
||||
- Premios (ES/CA): 30 min tablet/tauleta 🎮 (20), peli en familia/pel·lícula 🍿 (50),
|
||||
tarde en el parque/tarda al parc 🛝 (40), elijo la cena/trio el sopar 🍕 (30),
|
||||
30 min más despierto/més despert 🌙 (60), sorpresa dino 🦖 (80).
|
||||
- Una semana de plantilla de ejemplo y un par de eventos (Examen de Lengua 📋,
|
||||
Ficha de mates 📎) para poder probar /today al arrancar.
|
||||
- PIN de padres por defecto 1234 (configurable).
|
||||
|
||||
## Entregables
|
||||
- Proyecto Gradle compilable, estructura por capas.
|
||||
- Entidades JPA + Liquibase + datos semilla anteriores.
|
||||
- Controladores REST con DTOs (no exponer entidades), con labelEs/labelCa.
|
||||
- Tests unitarios de generación del día, marcado/monedas (incl. bonos de bloque/día)
|
||||
y canje de premios (JUnit 5 + Mockito; integración con MockMvc en endpoints clave).
|
||||
- Dockerfile multi-stage + docker-compose.yml (postgres + backend).
|
||||
- README breve: arranque local y notas para el homelab.
|
||||
Reference in New Issue
Block a user