Qué vamos a construir_

En este módulo vamos a construir una apicación completa en un entorno web, separando el BackEnd y el FrontEnd. Aprenderemos hacerca de estas trecnologías:

  • FastAPI (Python)
  • SQLAlchemy + SQLite
  • Vue.js 3 (Composition API) + Pinia (estado) + Vue Router
  • Vuetify 3 (Material Design)
  • pytest (unitarias/integración backend) + Vitest + Vue Test Utils (unitarias frontend) + Playwright (E2E)
  • Docker + Docker Compose + Nginx (local, sin cloud) + GitHub Actions simulado (CI)

Para ello, iremos estudiando los conceptos teóricos necesarios y los aplicaremos a un proyecto global que se desarrollará durante el módulo. El detalle del proyecto es el siguiente:

TaskFlow — Documento técnico de alcance del proyecto

Módulo asociado: CLM1042 — Programación de aplicaciones utilizando frameworks (DAW, 2º curso, 80h) Tipo de documento: especificación de alcance funcional y técnico (a modo de documento de arquitectura/requisitos de un proyecto real de empresa) Versión: 1.0

1. Introducción

1.1. Propósito del documento

Este documento define el alcance funcional y técnico de TaskFlow, la aplicación web que el alumnado construye de forma incremental a lo largo del módulo CLM1042. Sirve como referencia única de qué debe hacer la aplicación, qué no debe hacer (para no desviar el foco pedagógico), y qué decisiones de arquitectura se han tomado y por qué.

Este documento cumple, dentro del aula, el mismo papel que un documento de requisitos o una especificación técnica cumple en un proyecto de empresa: es el contrato de referencia entre lo que se pide y lo que se construye.

1.2. Descripción general del producto

TaskFlow es una aplicación web de gestión de tareas y proyectos para un único equipo de trabajo. Permite a un usuario autenticado crear proyectos, agrupar tareas dentro de esos proyectos, marcarlas como completadas, categorizarlas y gestionar todo el ciclo de vida de una tarea desde una interfaz web moderna, responsiva y con feedback visual inmediato.

Es intencionalmente un dominio de negocio simple y conocido (cualquier alumno entiende qué es "una tarea" y "un proyecto" sin necesidad de formación previa en un sector concreto), lo que permite dedicar el 100% del esfuerzo cognitivo a la tecnología y no al dominio del problema.

1.3. Alcance pedagógico

TaskFlow no es un producto real destinado a usuarios finales ni a producción con tráfico real. Es un vehículo didáctico: su complejidad funcional está deliberadamente acotada para que sea abarcable en 80 horas lectivas, mientras que su complejidad técnica (arquitectura en capas, autenticación, testing en 3 niveles, contenerización) sí refleja fielmente las prácticas de un proyecto profesional real.

1.4. Fuera de alcance (explícitamente)

Para mantener el proyecto abarcable en el tiempo disponible, quedan fuera del alcance del proyecto base (aunque varios se ofrecen como retos de ampliación opcionales):

  • Gestión de múltiples equipos/organizaciones (multi-tenancy).
  • Roles y permisos granulares más allá de autenticación simple (ver Reto 1.5 de ampliación para RBAC básico).
  • Notificaciones push o por email reales.
  • Comentarios o adjuntos en tareas.
  • Aplicación móvil nativa (solo web responsiva).
  • Internacionalización (i18n) — ofrecida como reto de ampliación opcional.
  • Colaboración en tiempo real (edición simultánea) — parcialmente cubierta como reto de ampliación con WebSockets.
  • Facturación, pagos o cualquier lógica comercial.
  • Cumplimiento normativo de protección de datos a nivel de producción real (RGPD aplicado a un entorno real) — se trabajan buenas prácticas de seguridad, pero no se persigue un cumplimiento normativo certificable.

2. Objetivos del proyecto

2.1. Objetivos funcionales

  1. Permitir a un usuario registrarse e iniciar sesión de forma segura.
  2. Permitir crear, consultar, editar y eliminar proyectos.
  3. Permitir crear, consultar, editar y eliminar tareas, asociadas opcionalmente a un proyecto y a una categoría.
  4. Permitir marcar una tarea como completada/pendiente.
  5. Ofrecer una interfaz visual coherente, responsiva y con feedback claro ante acciones y errores.

2.2. Objetivos técnicos (trazados a los RA del módulo)

Objetivo técnico RA relacionado
Exponer la lógica de negocio mediante una API REST construida con un framework de servidor (FastAPI) RA1
Construir la interfaz de usuario como una aplicación de página única (SPA) con un framework de cliente (Vue.js) RA2
Empaquetar y ejecutar la aplicación en contenedores reproducibles, con un servidor web configurado (Nginx) RA3
Aplicar un framework de diseño de interfaz (Vuetify) para lograr una UI profesional, responsiva y con feedback visual RA4
Garantizar la calidad del software mediante pruebas automatizadas en tres niveles (unitarias, integración, E2E) RA5

3. Actores y roles

Actor Descripción
Usuario autenticado Único rol funcional en el alcance base. Puede gestionar sus propios proyectos, tareas y categorías. Todo usuario autenticado tiene acceso completo a la funcionalidad (no hay distinción de permisos en el alcance base).
Visitante no autenticado Solo puede acceder a las pantallas de login y registro. No puede ver ni modificar datos.

4. Requisitos funcionales

Numerados con prefijo RF-XX, agrupados por entidad de negocio.

4.1. Autenticación y sesión

  • RF-01. El sistema debe permitir registrar un nuevo usuario con nombre de usuario y contraseña.
  • RF-02. El sistema debe rechazar el registro con un nombre de usuario ya existente, informando el motivo.
  • RF-03. El sistema debe permitir iniciar sesión con usuario y contraseña, devolviendo un token de sesión válido.
  • RF-04. El sistema debe rechazar credenciales incorrectas con un mensaje claro, sin especificar si el fallo es el usuario o la contraseña (buena práctica de seguridad).
  • RF-05. El sistema debe expirar automáticamente la sesión tras un periodo de inactividad configurado (30 minutos en el alcance base).
  • RF-06. El sistema debe permitir cerrar sesión de forma explícita, invalidando el acceso a rutas protegidas del cliente.
  • RF-07. Ninguna funcionalidad de creación, edición o eliminación de proyectos/tareas/categorías debe ser accesible sin sesión iniciada.

4.2. Gestión de proyectos

  • RF-08. El sistema debe permitir crear un proyecto con nombre (obligatorio) y descripción (opcional).
  • RF-09. El sistema debe permitir listar todos los proyectos del usuario.
  • RF-10. El sistema debe permitir consultar el detalle de un proyecto, incluyendo sus tareas asociadas.
  • RF-11. El sistema debe permitir editar el nombre y la descripción de un proyecto existente.
  • RF-12. El sistema debe permitir eliminar un proyecto. Al eliminar un proyecto, el sistema debe decidir explícitamente qué ocurre con sus tareas asociadas (eliminación en cascada o desasociación), y esta decisión debe estar documentada y ser consistente en todo el sistema.

4.3. Gestión de tareas

  • RF-13. El sistema debe permitir crear una tarea con título (obligatorio, máximo 100 caracteres), descripción (opcional), proyecto asociado (opcional) y categoría asociada (opcional).
  • RF-14. El sistema debe permitir listar tareas, con filtro opcional por proyecto y por estado (completada/pendiente).
  • RF-15. El sistema debe permitir listar tareas de forma paginada.
  • RF-16. El sistema debe permitir editar cualquier campo de una tarea existente.
  • RF-17. El sistema debe permitir alternar el estado de una tarea entre pendiente y completada con una única acción (no un formulario completo).
  • RF-18. El sistema debe permitir eliminar una tarea de forma permanente.
  • RF-19. El sistema debe rechazar la creación/edición de una tarea con título vacío, mostrando un mensaje de validación claro tanto en el servidor como en el cliente.

4.4. Gestión de categorías

  • RF-20. El sistema debe permitir crear una categoría con nombre y color asociado.
  • RF-21. El sistema debe permitir listar, editar y eliminar categorías.
  • RF-22. Una tarea puede tener como máximo una categoría asociada (relación opcional 1-N desde Category hacia Task).

4.5. Interfaz de usuario

  • RF-23. La interfaz debe mostrar de forma visual y distinguible el estado de cada tarea (pendiente/completada), incluyendo color y/o icono.
  • RF-24. La interfaz debe funcionar correctamente en tres rangos de ancho de pantalla: móvil (≥375px), tablet (≥768px) y escritorio (≥1280px).
  • RF-25. La interfaz debe informar visualmente al usuario durante estados de carga (peticiones en curso) y de error (fallo de red o del servidor), nunca dejando la pantalla en un estado ambiguo o silenciosamente roto.
  • RF-26. La interfaz debe ofrecer, como mínimo, un tema visual claro y uno oscuro, seleccionable por el usuario.

5. Requisitos no funcionales

Numerados con prefijo RNF-XX.

ID Requisito Categoría
RNF-01 Las contraseñas nunca se almacenan en texto plano; se aplica una función de hash de un solo sentido (bcrypt). Seguridad
RNF-02 Toda comunicación entre cliente y servidor en el entorno de despliegue final debe poder cifrarse (HTTPS, aunque sea con certificado autofirmado en el entorno de aula). Seguridad
RNF-03 Los endpoints de escritura (POST/PUT/DELETE) deben exigir autenticación válida mediante token. Seguridad
RNF-04 La API debe documentarse automáticamente (OpenAPI/Swagger) sin mantenimiento manual adicional. Mantenibilidad
RNF-05 Los cambios en el esquema de base de datos deben quedar versionados mediante migraciones, nunca aplicados manualmente. Mantenibilidad
RNF-06 El sistema debe arrancar íntegramente (backend + frontend + base de datos) con un único comando en el entorno de despliegue. Operabilidad
RNF-07 La suite de pruebas automatizadas debe poder ejecutarse íntegramente con un máximo de 2 comandos (uno por proyecto: backend/frontend) y debe completarse en menos de 5 minutos en un equipo estándar de aula. Calidad / CI
RNF-08 Toda funcionalidad de escritura debe contar con al menos una prueba automatizada que la cubra (unitaria o de integración). Calidad
RNF-09 La aplicación debe seguir siendo usable (sin scroll horizontal, sin elementos solapados) en el rango de anchos definido en RF-24. Usabilidad
RNF-10 El tiempo de respuesta de los endpoints de lectura (GET) no debe superar 500ms en el entorno de desarrollo local con un volumen de datos de prueba razonable (<1000 tareas). Rendimiento
RNF-11 El código fuente debe seguir una convención de estilo consistente por lenguaje (PEP8 en Python, convención estándar de Vue/ESLint en JavaScript). Mantenibilidad
RNF-12 Ningún secreto (claves, contraseñas de servicio) debe estar escrito de forma literal en el código fuente versionado en Git. Seguridad

6. Modelo de dominio

6.1. Entidades principales

User
 ├─ id: int (PK)
 ├─ username: string (único)
 └─ hashed_password: string

Project
 ├─ id: int (PK)
 ├─ name: string
 ├─ description: string (opcional)
 └─ owner_id: int (FK → User)   [según decisión de alcance, ver 6.3]

Category
 ├─ id: int (PK)
 ├─ name: string
 └─ color: string (código hex o nombre de color)

Task
 ├─ id: int (PK)
 ├─ title: string (máx. 100 caracteres)
 ├─ description: string (opcional)
 ├─ completed: boolean (por defecto false)
 ├─ created_at: datetime
 ├─ project_id: int (FK → Project, opcional)
 └─ category_id: int (FK → Category, opcional)

6.2. Relaciones

  • User 1 — N Project (un usuario tiene varios proyectos; en el alcance mínimo puede simplificarse a un espacio de trabajo compartido por todos los usuarios autenticados, según decisión docente — ver 6.3).
  • Project 1 — N Task (relación opcional: una tarea puede no pertenecer a ningún proyecto).
  • Category 1 — N Task (relación opcional: una tarea puede no tener categoría).

6.3. Decisión de alcance abierta (a resolver por el docente/alumnado antes de UD1)

El modelo permite dos variantes igualmente válidas pedagógicamente:

  1. Variante simple (recomendada para el ritmo de 80h): todos los usuarios autenticados comparten el mismo espacio de proyectos/tareas (no hay owner_id, cualquier usuario ve y edita todo). Reduce la complejidad de autorización a "autenticado sí/no".
  2. Variante con propiedad (recomendada solo si el grupo tiene nivel alto, ver evaluación inicial): cada proyecto/tarea pertenece a un usuario (owner_id), y un usuario solo puede ver/editar sus propios recursos. Añade una dimensión más de autorización (no solo "¿estás autenticado?" sino "¿es tuyo este recurso?").

Recomendación: partir de la variante simple en el proyecto base de clase, y ofrecer la variante con propiedad como extensión del Reto 1.5 (RBAC) para quien quiera profundizar.

7. Arquitectura técnica

7.1. Diagrama de componentes (alto nivel)

┌─────────────────────┐        HTTPS/JSON        ┌──────────────────────┐
│   Cliente (SPA)      │ ────────────────────────▶ │   Servidor Nginx      │
│   Vue 3 + Vuetify    │ ◀──────────────────────── │  (reverse proxy +     │
│   + Pinia (estado)   │                            │   estáticos)          │
└─────────────────────┘                            └──────────┬───────────┘
                                                                 │ /api/*
                                                                 ▼
                                                     ┌──────────────────────┐
                                                     │   API FastAPI          │
                                                     │   (Uvicorn)            │
                                                     │   + SQLAlchemy ORM     │
                                                     │   + Auth JWT           │
                                                     └──────────┬───────────┘
                                                                 │
                                                                 ▼
                                                     ┌──────────────────────┐
                                                     │   Base de datos        │
                                                     │   SQLite (volumen      │
                                                     │   persistente Docker)  │
                                                     └──────────────────────┘

7.2. Justificación de las decisiones de arquitectura

Decisión Justificación pedagógica y técnica
API REST separada del frontend (no server-side rendering) Refleja la arquitectura más habitual en el mercado actual (SPA + API) y permite trabajar backend y frontend como dos proyectos independientes con su propio ciclo de vida, tal como ocurre en equipos reales con especialización front/back.
SQLite como motor de base de datos Elimina la necesidad de gestionar un servidor de base de datos aparte durante el aprendizaje, permitiendo que el alumnado se centre en el ORM y las migraciones sin fricción de infraestructura. Documentado como decisión consciente (ver Reto 5.2 de ampliación para migrar a PostgreSQL).
JWT sin estado en servidor (stateless) Evita depender de sesiones en memoria/servidor, acercándose al patrón de autenticación más usado en APIs REST modernas, y siendo compatible con escalado horizontal (aunque no se explote en el alcance del aula).
Nginx como reverse proxy único punto de entrada Refleja el patrón real de despliegue donde un único servidor web expone tanto los estáticos del frontend como el proxy hacia el backend, evitando problemas de CORS en producción y centralizando TLS/cabeceras de seguridad.
Contenerización con Docker Compose (no Kubernetes) Nivel de complejidad de orquestación adecuado para 14h de formación y para un despliegue local de aula; Kubernetes queda fuera de alcance por desproporcionado para el tiempo disponible.
Testing en 3 niveles (unit/integración/E2E) Refleja la pirámide de testing estándar de la industria, permitiendo cubrir el RA5 de forma completa sin sobre-invertir tiempo en un único nivel de pruebas.

7.3. Stack tecnológico completo

Capa Tecnología Versión de referencia
Lenguaje backend Python 3.11+
Framework backend FastAPI última estable
Servidor ASGI Uvicorn última estable
ORM SQLAlchemy 2.x
Migraciones Alembic última estable
Base de datos SQLite incluida en Python
Autenticación JWT (python-jose) + passlib[bcrypt] última estable
Framework frontend Vue.js 3.x (Composition API)
Bundler frontend Vite última estable
Gestión de estado Pinia última estable
Enrutado Vue Router 4.x
Cliente HTTP Axios última estable
Librería de componentes UI Vuetify 3.x
Testing backend pytest + pytest-cov última estable
Testing frontend unitario Vitest + Vue Test Utils última estable
Testing E2E Playwright última estable
Contenerización Docker + Docker Compose última estable
Servidor web / proxy Nginx alpine
Integración continua GitHub Actions —

8. Interfaces de la API (contrato REST resumido)

Método Ruta Descripción Auth requerida
POST /auth/register Registra un nuevo usuario No
POST /auth/login Inicia sesión, devuelve token JWT No
GET /tasks Lista tareas (filtros: project_id, completed; paginación: skip, limit) Sí
GET /tasks/{id} Detalle de una tarea Sí
POST /tasks Crea una tarea Sí
PUT /tasks/{id} Edita una tarea Sí
DELETE /tasks/{id} Elimina una tarea Sí
GET /projects Lista proyectos Sí
GET /projects/{id} Detalle de proyecto (con sus tareas) Sí
POST /projects Crea un proyecto Sí
PUT /projects/{id} Edita un proyecto Sí
DELETE /projects/{id} Elimina un proyecto Sí
GET /categories Lista categorías Sí
POST /categories Crea una categoría Sí
PUT /categories/{id} Edita una categoría Sí
DELETE /categories/{id} Elimina una categoría Sí
GET /health Estado del servicio (sin datos de negocio) No

Formato de error estándar (aplicado de forma consistente en todos los endpoints):

{
  "detail": "Descripción del error legible para el desarrollador consumidor de la API"
}

9. Casos de uso principales (narrativa)

CU-01 — Registro e inicio de sesión

Un visitante accede a la aplicación, no tiene cuenta, se registra con usuario y contraseña, y a continuación inicia sesión. El sistema le redirige automáticamente a la vista de tareas. En visitas posteriores, si la sesión sigue vigente, no se le vuelve a pedir el login.

CU-02 — Crear y organizar un proyecto con tareas

Un usuario autenticado crea un proyecto nuevo ("Rediseño web"). A continuación crea varias tareas dentro de ese proyecto, algunas con categoría asignada ("Diseño", "Desarrollo"). Ve la lista de tareas del proyecto, filtrable por estado.

CU-03 — Gestión diaria de tareas

Un usuario abre la aplicación, ve sus tareas pendientes destacadas visualmente, marca varias como completadas con un solo clic, y crea una tarea nueva rápidamente desde un formulario simple con validación en tiempo real.

CU-04 — Uso en dispositivo móvil

Un usuario accede desde su teléfono. La interfaz se adapta automáticamente: la navegación pasa a un menú desplegable, las tarjetas de tareas se apilan en una sola columna, y todos los botones son accesibles sin necesidad de hacer zoom.

CU-05 — Fallo de red gestionado con elegancia

Durante el uso normal, la conexión al backend falla temporalmente (simulado en pruebas con page.route). La interfaz no se congela ni muestra una pantalla en blanco: informa al usuario del problema y le permite reintentar la acción cuando la conexión se restablece.

10. Criterios de aceptación del proyecto completo

El proyecto TaskFlow se considera funcionalmente completo cuando:

  1. Todos los requisitos funcionales (RF-01 a RF-26) están implementados y verificables mediante demo en vivo.
  2. Todos los requisitos no funcionales de seguridad (RNF-01 a RNF-03, RNF-12) están cumplidos y verificados en la auditoría cruzada de UD5.
  3. La aplicación completa arranca con un único comando (docker compose up) desde un repositorio recién clonado, sin pasos manuales adicionales no documentados.
  4. La suite de pruebas automatizada (unit + integración + E2E) se ejecuta en verde antes de cada entrega.
  5. La aplicación es usable, sin defectos visuales bloqueantes, en los tres rangos de pantalla definidos en RF-24.
  6. Existe documentación mínima (README) que permite a una persona ajena al proyecto levantarlo y entender su arquitectura en menos de 10 minutos de lectura.

11. Trazabilidad con la programación didáctica del módulo

Documento relacionado Relación con este documento
CLM1042-programacion-didactica.md Define en qué UD y sesión se implementa cada parte de esta especificación.
CLM1042-unidades-didacticas.md Detalla objetivos y contenidos de cada bloque que construye una porción de este alcance.
CLM1042-guiones-practicas.md Instrucciones paso a paso que implementan, sesión a sesión, los requisitos aquí descritos.
CLM1042-rubricas-evaluacion.md Evalúa el grado de cumplimiento de los RF/RNF de este documento.
CLM1042-retos-ampliacion.md Extiende funcionalidades explícitamente marcadas como "fuera de alcance" en la sección 1.4.

12. Glosario

Término Definición
SPA (Single Page Application) Aplicación web que carga una única página HTML y actualiza el contenido dinámicamente sin recargar el navegador.
API REST Interfaz de comunicación entre cliente y servidor basada en recursos, verbos HTTP y formato JSON.
ORM Capa de software que traduce objetos del lenguaje de programación a filas de una base de datos relacional.
JWT (JSON Web Token) Token firmado digitalmente que permite verificar la identidad de un usuario sin consultar una base de datos de sesiones.
Reverse proxy Servidor que recibe peticiones externas y las redirige internamente al servicio adecuado.
CI (Integración Continua) Práctica de ejecutar automáticamente pruebas y construcción del proyecto en cada cambio subido al repositorio.