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:
Jaume Garriga Maestre
2026-06-21 10:48:57 +02:00
commit 52e559a159
160 changed files with 29022 additions and 0 deletions

55
docker-compose.yml Normal file
View File

@@ -0,0 +1,55 @@
# Stack local de recordaLexia: PostgreSQL + backend (Spring Boot) + frontend (Nginx).
# Pensado para ejecución doméstica/homelab. Las credenciales se leen de .env
# (ver .env.example); nunca van escritas aquí en texto plano.
services:
postgres:
image: postgres:16-alpine
container_name: recordalexia-postgres
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
TZ: Europe/Madrid
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
# El backend espera a que la BD esté realmente lista, no solo arrancada.
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
backend:
build:
context: ./backend
container_name: recordalexia-backend
depends_on:
postgres:
condition: service_healthy
environment:
# Conexión a la BD: host interno del servicio postgres del compose.
DB_HOST: postgres
DB_PORT: "5432"
DB_NAME: ${DB_NAME}
# Spring enlaza estas dos sobre spring.datasource.* por binding relajado.
SPRING_DATASOURCE_USERNAME: ${DB_USER}
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
TZ: Europe/Madrid
expose:
- "8080"
restart: unless-stopped
frontend:
build:
context: ./frontend
container_name: recordalexia-frontend
depends_on:
- backend
ports:
# Acceso a la app desde la red local del homelab (tablet en modo kiosko).
- "${WEB_PORT:-8088}:80"
restart: unless-stopped
volumes:
pgdata: