REST API para gestión de tareas con autenticación JWT, construida con FastAPI, SQLModel y SQLite.
- FastAPI — Framework web moderno y de alto rendimiento
- SQLModel — ORM basado en SQLAlchemy + Pydantic
- SQLite — Base de datos ligera (archivo
database.db) - bcrypt — Hashing seguro de contraseñas
- PyJWT — Generación y validación de tokens JWT
├── main.py # Entrada de la aplicación
├── database.py # Configuración de la DB y sesión
├── segurity.py # Hashing, JWT y autenticación
├── models/
│ ├── user.py # Modelo SQLModel - User
│ └── task.py # Modelo SQLModel - Task
├── schemas/
│ ├── user.py # Schemas Pydantic - User
│ └── task.py # Schemas Pydantic - Task
├── routes/
│ ├── user.py # Rutas /user
│ └── task.py # Rutas /task
└── .env # Variables de entorno
1. Clonar el repositorio
git clone <url-del-repo>
cd <nombre-del-proyecto>2. Crear y activar entorno virtual
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows3. Instalar dependencias
pip install fastapi uvicorn sqlmodel bcrypt pyjwt python-dotenv4. Configurar variables de entorno
Crear un archivo .env en la raíz del proyecto:
SECRET_KEY=tu_clave_secreta_muy_segura5. Ejecutar el servidor
uvicorn main:app --reloadLa API estará disponible en http://localhost:8000.
Documentación interactiva en http://localhost:8000/docs.
La API utiliza JWT Bearer Tokens. El flujo es el siguiente:
- Registrar un usuario en
POST /user/create - Iniciar sesión en
POST /user/loginpara obtener el token - Incluir el token en las requests protegidas:
Authorization: Bearer <token>
Los tokens expiran a los 30 minutos.
| Método | Ruta | Descripción | Auth requerida |
|---|---|---|---|
POST |
/user/create |
Registrar nuevo usuario | ❌ |
POST |
/user/login |
Iniciar sesión y obtener token | ❌ |
// Body
{
"username": "juanperez",
"password": "mipass123",
"password_repeat": "mipass123"
}
// Response 200
{
"msg": "usuario creado",
"id": 1
}// Body
{
"username": "juanperez",
"password": "mipass123"
}
// Response 200
{
"msg": "Log success",
"token": "<jwt_token>"
}Todos los endpoints de tareas requieren autenticación. Cada usuario solo puede ver y gestionar sus propias tareas.
| Método | Ruta | Descripción | Auth requerida |
|---|---|---|---|
POST |
/task/ |
Crear nueva tarea | ✅ |
GET |
/task/ |
Obtener todas las tareas del usuario | ✅ |
PATCH |
/task/{id_task} |
Alternar estado de la tarea (pending ↔ complete) | ✅ |
DELETE |
/task/{id_task} |
Eliminar una tarea | ✅ |
// Body
{
"title": "Mi tarea",
"description": "Descripción detallada de la tarea"
}
// Response 201
{
"status": "success",
"message": "Tarea creada exitosamente",
"task": {
"id": 1,
"title": "Mi tarea",
"description": "Descripción detallada de la tarea",
"status": "pending",
"created_at": "2024-01-01T00:00:00",
"user_id": 1
}
}// Response 200
{
"tasks": [
{
"id": 1,
"title": "Mi tarea",
"description": "Descripción detallada de la tarea",
"status": "pending",
"created_at": "2024-01-01T00:00:00",
"user_id": 1
}
]
}Alterna el estado de la tarea entre pending y complete.
// Response 200
{
"task": {
"id": 1,
"status": "complete",
...
}
}// Response 200
{
"msg": "Task deleted successfully"
}| Campo | Tipo | Descripción |
|---|---|---|
id |
Integer (PK) | ID autogenerado |
username |
String (único) | Nombre de usuario |
password |
String | Contraseña hasheada con bcrypt |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Integer (PK) | ID autogenerado |
title |
String (max 20) | Título de la tarea |
description |
String (max 50) | Descripción de la tarea |
status |
String | Estado: pending o complete |
created_at |
DateTime | Fecha de creación (UTC) |
user_id |
Integer (FK) | Referencia al usuario dueño |
username: mínimo 6 caracteres, máximo 20password: mínimo 6 caracteres, máximo 20title: mínimo 6 caracteres, máximo 20description: mínimo 10 caracteres, máximo 100- Las contraseñas deben coincidir al registrarse
- No se pueden registrar dos usuarios con el mismo
username - Un usuario no puede modificar ni eliminar tareas de otros usuarios