API REST en Laravel 12 para gestionar tareas con autenticación JWT. Diseñada en capas (controllers → services → repositories → models) para mantener el dominio desacoplado de la infraestructura. Lista para Docker y con suite de tests en GitHub Actions.
- CRUD de tareas vía API REST.
- Autenticación JWT con
tymon/jwt-auth(register, login, refresh, logout). - Arquitectura en capas: el controlador delega en un servicio, que usa un repositorio (interfaz) — inversión de dependencias vía contenedor de Laravel.
- Validación con Form Requests.
- Tests de feature (API + auth) y unitarios (servicio) con PHPUnit.
El portafolio mencionaba "Sanctum": la autenticación real usa
tymon/jwt-auth(tokens JWT con TTL configurable).
app/
├── Http/
│ ├── Controllers/ TaskController, AuthController (capa de entrada, delgada)
│ └── Requests/ StoreTaskRequest, UpdateTaskRequest (validación)
├── Services/ TaskService (lógica de aplicación)
├── Repositories/ TaskRepositoryInterface + TaskRepository (persistencia)
├── Exceptions/ TaskNotFoundException (render 404 JSON)
└── Models/ Task, User
El binding TaskRepositoryInterface → TaskRepository se registra en
AppServiceProvider, así el servicio depende de la interfaz, no de Eloquent.
| Método | Ruta | Auth | Descripción |
|---|---|---|---|
POST |
/api/register |
público | Crea usuario y devuelve token |
POST |
/api/login |
público | Devuelve token JWT |
POST |
/api/refresh |
JWT | Renueva el token |
POST |
/api/logout |
JWT | Invalida el token |
GET |
/api/tasks |
JWT | Lista tareas |
POST |
/api/tasks |
JWT | Crea tarea |
GET |
/api/tasks/{id} |
JWT | Detalle de tarea |
PUT |
/api/tasks/{id} |
JWT | Actualiza tarea |
DELETE |
/api/tasks/{id} |
JWT | Elimina tarea |
Las rutas protegidas requieren Authorization: Bearer <token>. El campo
status de una tarea acepta pendiente o completada.
composer install
cp .env.example .env
php artisan key:generate
php artisan jwt:secret # genera JWT_SECRET
touch database/database.sqlite # .env trae DB_CONNECTION=sqlite
php artisan migrate
php artisan serve # http://localhost:8000cp .env.example .env # ajusta DB_* y pon DB_CONNECTION=pgsql
docker compose up -d --build
docker compose exec app php artisan migrate --seedEl seeder crea un usuario de prueba test@example.com / password.
php artisan test # corre la suite (SQLite en memoria, vía phpunit.xml)Cubren registro/login/refresh, protección por JWT y el CRUD completo de tareas,
además de tests unitarios del TaskService con repositorio simulado (Mockery).
La suite corre en GitHub Actions (.github/workflows/ci.yml).
PHP 8.2 · Laravel 12 · tymon/jwt-auth · PostgreSQL 15 / SQLite ·
PHPUnit 11 · Docker
MIT