SyncFlat es una aplicación web orientada a personas que comparten piso y necesitan coordinar de forma clara y justa el dinero, la organización doméstica y el tiempo. El sistema se estructura en módulos independientes pero conectados entre sí.
- Página de inicio (
/): presentación del proyecto y enlaces a los módulos. - Módulo de Gastos (
/modulos/gastos): descripción de la funcionalidad de control de gastos compartidos. - Módulo de Compra (
/modulos/compra): organización de compras y reparto flexible. - Módulo Home (
/modulos/home): panel de control centralizado del piso. - Módulo de Tareas (
/modulos/tareas): gestión de tareas domésticas con demo JavaScript interactiva (botón que añade ítems a una lista sin backend). - Módulo de Calendario (
/modulos/calendario): planificación y disponibilidad compartida. - Autores (
/autores): información sobre el autor del proyecto. - Login y seguridad: autenticación con formulario; botones de debug para login rápido (usuarios A y B).
- Administración (
/admin/): visible solo para usuarios con rol ADMIN.
- Java 21 (JDK)
- Maven 3.8+ (o usar el wrapper
mvnwsi está disponible)
# Desde la raíz del repositorio
mvn spring-boot:runLa aplicación se inicia en http://localhost:8080.
├── pom.xml # Configuración Maven
├── README.md # Este fichero
├── src/
│ ├── main/
│ │ ├── java/es/ucm/fdi/iw/
│ │ │ ├── controller/
│ │ │ │ ├── RootController.java # Endpoints principales
│ │ │ │ ├── AdminController.java # Panel de administración
│ │ │ │ ├── UserController.java # Gestión de usuarios
│ │ │ │ └── ApiController.java # API REST
│ │ │ ├── model/ # Entidades JPA
│ │ │ ├── SecurityConfig.java # Configuración de seguridad
│ │ │ ├── LoginSuccessHandler.java # Handler post-login
│ │ │ ├── StartupConfig.java # Configuración inicial
│ │ │ └── IwApplication.java # Punto de entrada
│ │ └── resources/
│ │ ├── application.properties # Configuración de la app
│ │ ├── templates/
│ │ │ ├── fragments/ # Fragmentos Thymeleaf (head, nav, footer)
│ │ │ ├── index.html # Página principal
│ │ │ ├── login.html # Formulario de login
│ │ │ ├── gastos.html, compra.html, home.html, tareas.html, calendario.html
│ │ │ ├── autores.html # Info del autor
│ │ │ └── admin.html, user.html, error.html
│ │ └── static/
│ │ ├── css/ # Estilos (Bootstrap 5.3.3 + custom.css)
│ │ ├── js/ # Scripts (Bootstrap, WebSocket, utilidades)
│ │ └── img/ # Imágenes (logo, favicon, fotos)
│ └── test/ # Tests (JUnit, Karate)
La aplicación incluye botones de login rápido (visibles solo en modo debug):
| Botón | Usuario | Contraseña | Roles |
|---|---|---|---|
| a | a |
aa |
USER, ADMIN |
| b | b |
aa |
USER |
Estos botones aparecen en la esquina superior derecha de la barra de navegación cuando no hay sesión activa.
Tras hacer login, la navbar muestra los enlaces a todos los módulos. El enlace Administrar solo es visible para usuarios con rol ADMIN.
| Ruta | Vista | Acceso |
|---|---|---|
GET / |
index.html | Público |
GET /login |
login.html | Público |
GET /modulos/gastos |
gastos.html | Requiere login (USER) |
GET /modulos/compra |
compra.html | Requiere login (USER) |
GET /modulos/home |
home.html | Requiere login (USER) |
GET /modulos/tareas |
tareas.html | Requiere login (USER) |
GET /modulos/calendario |
calendario.html | Requiere login (USER) |
GET /autores |
autores.html | Requiere login (USER) |
GET /admin/ |
admin.html | Requiere ADMIN |
GET /user/{id} |
user.html | Requiere login (USER) |
El modelo relacional consta de 15 entidades JPA y 5 enumerados, organizados en torno a la entidad central Piso. Las entidades heredadas de la plantilla (User, Message, Topic) usan GenerationType.SEQUENCE; las nuevas usan GenerationType.IDENTITY.
Enumerados: EstadoGasto, EstadoAsistencia, RolPiso, TipoAlerta, TipoTarea.
| Vista | Ruta | Estado | Detalle |
|---|---|---|---|
| index | GET / |
✅ Completa | Página principal con descripción del proyecto y enlaces a los módulos |
| login | GET /login |
✅ Completa | Formulario de login con CSRF; botones de debug para login rápido |
| gastos | GET /modulos/gastos |
📝 Descriptiva | Muestra funcionalidades previstas (registro, reparto, balance, liquidación) |
| compra | GET /modulos/compra |
📝 Descriptiva | Describe catálogo compartido, listas, reparto de gasto |
| home | GET /modulos/home |
📝 Descriptiva | Panel de control: resumen, eventos, alertas, ausencias |
| tareas | GET /modulos/tareas |
🟡 Parcial | Descripción + demo JavaScript interactiva que añade tareas dinámicamente |
| calendario | GET /modulos/calendario |
📝 Descriptiva | Vistas por horas, por integrante, conflictos y sugerencias |
| autores | GET /autores |
✅ Completa | Foto y nombre del autor |
| admin | GET /admin/ |
✅ Completa | CRUD de usuarios (habilitar/deshabilitar), tabla con DataTables, mensajes vía AJAX |
| user | GET /user/{id} |
✅ Completa | Perfil de usuario con AJAX, WebSocket para mensajería en tiempo real |
Las vistas de módulos (gastos, compra, home, calendario) son actualmente descriptivas: muestran las funcionalidades previstas pero no tienen aún funcionalidad con backend. Las entidades JPA correspondientes ya están definidas y pobladas en import.sql, por lo que la conexión entre vista y modelo de datos es directa.
La prueba Karate (src/test/java/es/ucm/fdi/iw/prueba.feature) cubre 8 escenarios que ejercitan las vistas y funcionalidades principales:
| Escenario | Vista/funcionalidad probada |
|---|---|
| 1 — capturar CSRF | login (seguridad) |
| 2 — login correcto | login → index |
| 3 — ver resumen del piso | home (contenido descriptivo) |
| 4 — ver gastos compartidos | gastos |
| 5 — ver lista de la compra | compra |
| 6 — ver tareas | tareas |
| 7 — admin accede a administración | admin (control de acceso por rol ADMIN) |
| 8 — usuario normal no accede | admin (denegación por rol USER) |
Los escenarios 7 y 8 validan específicamente la seguridad por roles: el usuario a (ADMIN) puede acceder y el usuario b (USER) recibe un 403.
El proyecto incluye herramientas de despliegue automatizado:
deploy.py: script Python que empaqueta el JAR, sube ficheros de BD/datos y despliega en un contenedor Docker de la FDI vía SSHapplication-container.properties: perfil Spring Boot para producción (puerto 80, H2 a fichero, caché activa, debug desactivado)credentials.json.template: plantilla de credenciales (no se sube al repositorio)
Para desplegar:
python deploy.pyLas carpetas demo/, jpademo/, qna/ y plantilla/ provienen del repositorio original de la asignatura y contienen material de referencia del profesorado. No forman parte del proyecto SyncFlat y pueden ignorarse durante la evaluación.
controller/ → Recibe peticiones HTTP, delega en servicios
service/ → Lógica de negocio (a crear cuando se implementen funcionalidades reales)
repository/ → Acceso a datos JPA (Spring Data)
model/ → Entidades de dominio
dto/ → Objetos de transferencia (a crear)
- Persistencia de gastos: entidad
Gastocon JPA, CRUD completo, reparto automático. - Lista de la compra: entidad
ItemCompra, listas compartidas en tiempo real (WebSocket). - Tareas con rotación: entidad
Tarea, asignación automática por turnos, historial. - Calendario compartido: entidad
Evento, vistas por semana/mes, detección de conflictos. - Notificaciones: sistema de avisos push vía WebSocket (ya preparado en la plantilla).
- Validación de entrada en todos los formularios (Bean Validation /
@Valid). - CSRF habilitado (excepto API REST).
- Autorización por roles (
@Secured,@PreAuthorize). - Sanitización de datos para evitar XSS.
- Templates: solo presentación, usando fragmentos reutilizables (
head,nav,footer). - Controllers: delegar siempre en servicios, no contener lógica de negocio.
- Servicios: encapsular lógica, transacciones y validaciones.
- Repositorios: solo acceso a datos, sin lógica.
