API REST profesional para gestión de proyectos y tareas, con autenticación JWT, RBAC, PostgreSQL, Docker, logging, manejo global de errores, dashboard de métricas y tests automatizados.
TaskGuard API es un backend moderno construido con Python y FastAPI, diseñado para demostrar buenas prácticas en arquitectura por capas, seguridad, observabilidad básica y calidad de software.
El sistema permite registrar usuarios, autenticarse con JWT, gestionar proyectos y tareas con permisos por rol, consultar métricas en un dashboard y exponer documentación interactiva con Swagger/OpenAPI.
| Categoría | Tecnología |
|---|---|
| Lenguaje | Python 3.12 |
| Framework | FastAPI |
| Base de datos | PostgreSQL |
| ORM | SQLAlchemy |
| Validación | Pydantic |
| Configuración | Pydantic Settings |
| Contenedores | Docker, Docker Compose |
| Autenticación | JWT (python-jose) |
| Seguridad | Passlib, Bcrypt |
| Testing | Pytest, Pytest-cov, httpx |
| Observabilidad | Logging, middleware HTTP |
| Documentación | OpenAPI / Swagger |
- Registro de usuarios
- Login con JWT
- Usuario autenticado (
GET /api/auth/me) - Roles ADMIN, MANAGER y DEVELOPER
- RBAC (control de acceso basado en roles)
- CRUD de proyectos
- CRUD de tareas
- Asignación de tareas a usuarios
- Estados y prioridades de tareas
- Dashboard de métricas (personal y general)
- Manejo global de errores en formato JSON
- Logging de requests
- Middleware con header
X-Process-Time - Tests automatizados con pytest
- Documentación Swagger en
/docs
app/
├── api/ # Routers y endpoints HTTP
├── core/ # Config, seguridad, dependencias, middleware
├── db/ # Conexión SQLAlchemy e inicialización
├── exceptions/ # Handlers globales de errores
├── models/ # Modelos ORM y enums
├── repositories/ # Acceso a datos
├── schemas/ # Esquemas Pydantic (request/response)
├── services/ # Lógica de negocio
├── utils/ # Utilidades
└── main.py # Punto de entrada FastAPI
tests/
├── conftest.py
├── test_auth.py
├── test_dashboard.py
├── test_health.py
├── test_projects.py
├── test_protected.py
└── test_tasks.py
- Puede administrar todos los proyectos y tareas.
- Puede ver el dashboard general (
/api/dashboard/summary). - Puede eliminar cualquier proyecto.
- Puede ver y gestionar proyectos/tareas con permisos superiores.
- Puede ver el dashboard general.
- Puede eliminar solo proyectos propios.
- Puede crear proyectos propios.
- Puede gestionar sus tareas y proyectos permitidos.
- No puede listar todos los proyectos/tareas del sistema.
- No puede acceder a recursos administrativos ni al dashboard general.
git clone https://github.com/Brayan1262/taskguard-fastapi.git
cd taskguard-fastapipython -m venv venvWindows (CMD):
venv\Scripts\activateLinux / macOS:
source venv/bin/activatepip install -r requirements.txtCopia .env.example a .env y ajusta los valores si es necesario:
APP_NAME=TaskGuard API
APP_VERSION=1.0.0
APP_ENV=development
DATABASE_URL=postgresql://postgres:postgres@localhost:5435/taskguard_db
JWT_SECRET_KEY=taskguard-super-secret-key
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=1440Nota: El archivo
.envno se sube a GitHub por seguridad. Usa.env.examplecomo plantilla.
docker compose up -duvicorn app.main:app --reloadLa API estará disponible en: http://127.0.0.1:8000
Levantar PostgreSQL:
docker compose up -dVerificar contenedor:
docker ps| Servicio | Contenedor | Puerto |
|---|---|---|
| PostgreSQL | taskguard_postgres |
5435 → 5432 |
Documentación interactiva:
Para endpoints protegidos, haz login en POST /api/auth/login, copia el access_token y en Authorize pega:
Bearer TU_TOKEN_AQUI
| Método | Endpoint | Descripción |
|---|---|---|
| GET | / |
Health básico de la API |
| GET | /api/test |
Endpoint de prueba |
| GET | /api/health/db |
Estado de conexión a BD |
| GET | /api/health/tables |
Verificación de tablas |
| POST | /api/auth/register |
Registro de usuario |
| POST | /api/auth/login |
Login y obtención de JWT |
| GET | /api/auth/me |
Perfil del usuario autenticado |
| GET | /api/protected/* |
Rutas protegidas por rol |
| CRUD | /api/projects |
Gestión de proyectos |
| CRUD | /api/tasks |
Gestión de tareas |
| GET | /api/dashboard/me |
Dashboard personal |
| GET | /api/dashboard/summary |
Dashboard general (ADMIN/MANAGER) |
curl -X POST "http://127.0.0.1:8000/api/auth/register" \
-H "Content-Type: application/json" \
-d "{\"first_name\":\"Brayan\",\"last_name\":\"Chavez\",\"email\":\"brayan@gmail.com\",\"password\":\"12345678\"}"curl -X POST "http://127.0.0.1:8000/api/auth/login" \
-H "Content-Type: application/json" \
-d "{\"email\":\"brayan@gmail.com\",\"password\":\"12345678\"}"curl -X POST "http://127.0.0.1:8000/api/projects" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{\"name\":\"Sistema Interno\",\"description\":\"Proyecto backend\",\"status\":\"ACTIVE\"}"curl -X POST "http://127.0.0.1:8000/api/tasks" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{\"title\":\"Implementar módulo\",\"description\":\"CRUD de tareas\",\"status\":\"TODO\",\"priority\":\"HIGH\",\"project_id\":1}"curl -X GET "http://127.0.0.1:8000/api/dashboard/me" \
-H "Authorization: Bearer TOKEN"Asegúrate de tener PostgreSQL corriendo (docker compose up -d) y el entorno virtual activado.
pytestCon cobertura:
pytest --cov=appLos tests usan emails únicos (UUID) para evitar conflictos en la base de datos local.
Versión 1.0 — Funcional
Módulos completados:
- Setup FastAPI y estructura profesional
- PostgreSQL + Docker + SQLAlchemy
- Modelos y relaciones
- Autenticación JWT
- Usuario autenticado + RBAC
- CRUD de proyectos
- CRUD de tareas
- Dashboard de métricas
- Manejo global de errores + logging
- Tests con pytest
- README profesional + GitHub
- Refresh token
- Recuperación de contraseña
- Integración con servicios externos
- Retries y circuit breaker
- Observabilidad avanzada
- Cloud Logging / Cloud Trace
- Deploy en GCP
- CI/CD con GitHub Actions
Brayan Jair Chavez Oscor
- GitHub: https://github.com/Brayan1262
- LinkedIn: https://www.linkedin.com/in/brayan-chavez-218088334/
- Portafolio: https://brayan1262.github.io/portafolio-brayan/
Este proyecto fue desarrollado con fines educativos y de portafolio profesional.