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

33
backend/Dockerfile Normal file
View File

@@ -0,0 +1,33 @@
# --- Etapa 1: build ---
# Compila el jar con el Gradle wrapper del proyecto (no requiere Gradle en host).
FROM eclipse-temurin:21-jdk AS build
WORKDIR /app
# Primero solo lo necesario para resolver dependencias y aprovechar la caché de capas.
COPY gradlew settings.gradle build.gradle ./
COPY gradle ./gradle
RUN chmod +x gradlew && ./gradlew --no-daemon dependencies > /dev/null 2>&1 || true
# Ahora el código fuente y el empaquetado.
COPY src ./src
RUN ./gradlew --no-daemon clean bootJar
# --- Etapa 2: runtime ---
# Imagen mínima con JRE 21. Usuario no-root y zona horaria del negocio.
FROM eclipse-temurin:21-jre AS runtime
WORKDIR /app
ENV TZ=Europe/Madrid
# Usuario sin privilegios.
RUN useradd --system --uid 10001 --create-home appuser
USER appuser
COPY --from=build /app/build/libs/*.jar app.jar
EXPOSE 8080
# Healthcheck contra el endpoint de Actuator (solo health expuesto).
HEALTHCHECK --interval=15s --timeout=3s --start-period=40s --retries=5 \
CMD wget -qO- http://localhost:8080/actuator/health | grep -q '"status":"UP"' || exit 1
ENTRYPOINT ["java", "-jar", "/app/app.jar"]