Una API REST robusta para gestión de tareas construida con Go, Gin, GORM y PostgreSQL.
- Autenticación JWT - Sistema seguro de autenticación con tokens
- CRUD de Tareas - Crear, leer, actualizar y eliminar tareas
- Concurrencia - Endpoint de resumen que utiliza goroutines para consultas paralelas
- Base de datos - PostgreSQL con migraciones automáticas
- Arquitectura limpia - Código organizado en capas (controllers, services, models)
- Docker ready - Contenedorización completa con Docker Compose
- Hashing seguro - Contraseñas encriptadas con bcrypt
- Go - Lenguaje de programación
- Gin - Framework web HTTP
- GORM - ORM para Go
- PostgreSQL - Base de datos relacional
- JWT - Autenticación con tokens
- Docker - Contenedorización
- bcrypt - Hashing de contraseñas
POST /auth/register
- Registrar usuarioPOST /auth/login
- Iniciar sesión
GET /tasks
- Obtener todas las tareas del usuarioPOST /tasks
- Crear nueva tareaPUT /tasks/:id
- Actualizar tareaDELETE /tasks/:id
- Eliminar tareaGET /tasks/summary
- Obtener resumen de tareas (con concurrencia)
GET /health
- Health check de la API
- Go
- PostgreSQL
- Docker (opcional)
- Make (opcional)
git clone https://github.com/ingfranciscastillo/task-manager-api
cd task-manager
make deps
# o manualmente: go mod download
cp .env.example .env
# Editar .env con tus configuraciones
createdb -U postgres taskmanager
# o usar: make db-create
make run
# o manualmente: go run cmd/server/main.go
git clone https://github.com/ingfranciscastillo/task-manager-api
cd task-manager
docker-compose up -d
La aplicación estará disponible en http://localhost:9090
curl -X POST http://localhost:9090/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@ejemplo.com",
"password": "password123"
}'
curl -X POST http://localhost:9090/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@ejemplo.com",
"password": "password123"
}'
curl -X POST http://localhost:9090/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <tu-jwt-token>" \
-d '{
"title": "Mi primera tarea",
"description": "Descripción de la tarea",
"status": "pending"
}'
curl -X GET http://localhost:9090/tasks \
-H "Authorization: Bearer <tu-jwt-token>"
curl -X GET http://localhost:9090/tasks/summary \
-H "Authorization: Bearer <tu-jwt-token>"
curl -X PUT http://localhost:9090/tasks/1 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <tu-jwt-token>" \
-d '{
"title": "Tarea actualizada",
"status": "completed"
}'
curl -X DELETE http://localhost:9090/tasks/1 \
-H "Authorization: Bearer <tu-jwt-token>"
task-manager/
├── cmd/server/ # Punto de entrada de la aplicación
├── internal/
│ ├── controllers/ # Controladores HTTP (manejo de requests)
│ ├── services/ # Lógica de negocio
│ ├── models/ # Modelos de datos (GORM)
│ ├── middleware/ # Middleware (autenticación, CORS, etc.)
│ ├── routes/ # Definición de rutas
│ └── config/ # Configuración (BD, etc.)
├── pkg/utils/ # Utilidades compartidas
└── migrations/ # Migraciones de BD (futuro)
El endpoint /tasks/summary
implementa concurrencia usando goroutines y channels:
- Ejecuta 3 consultas en paralelo:
- Total de tareas
- Tareas completadas
- Tareas pendientes
- Utiliza
sync.WaitGroup
para sincronización - Manejo de errores con channels no bloqueantes
- Contraseñas hasheadas con bcrypt (cost 12)
- JWT con expiración (24 horas)
- Middleware de autenticación para rutas protegidas
- Validación de entrada con Gin binding
- CORS configurado para desarrollo
El proyecto incluye:
- Dockerfile multi-stage para optimizar tamaño
- docker-compose.yml con PostgreSQL
- Health checks para servicios
- Volumes persistentes para datos
Variable | Descripción | Valor por defecto |
---|---|---|
DB_HOST |
Host de PostgreSQL | localhost |
DB_USER |
Usuario de BD | postgres |
DB_PASSWORD |
Contraseña de BD | password |
DB_NAME |
Nombre de BD | taskmanager |
DB_PORT |
Puerto de BD | 5432 |
JWT_SECRET |
Secreto para JWT | requerido |
PORT |
Puerto del servidor | 8080 |
GIN_MODE |
Modo de Gin | debug |
# Ejecutar tests
make test
# Con coverage
go test -cover ./...
# Test específico
go test ./internal/services -v
make run # Ejecutar servidor
make build # Compilar aplicación
make test # Ejecutar tests
make docker-build # Construir imagen Docker
make db-create # Crear BD
make db-reset # Reiniciar BD
make deps # Instalar dependencias
make help # Ver todos los comandos
- Verificar que PostgreSQL esté ejecutándose
- Revisar variables de entorno en
.env
- Verificar que la BD
taskmanager
exista
- Verificar que
JWT_SECRET
esté configurado - Verificar formato del token:
Bearer <token>
- Verificar que el puerto 8080 esté libre
- Cambiar
PORT
en.env
si es necesario
- Fork el proyecto
- Crear branch de feature (
git checkout -b feature/nueva-caracteristica
) - Commit cambios (
git commit -am 'Agregar nueva característica'
) - Push al branch (
git push origin feature/nueva-caracteristica
) - Crear Pull Request
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.
Desarrollado con ❤️ usando Go