Has sido contratado para trabajar en TaskAPI, una aplicación de gestión de tareas empresarial. El proyecto ya tiene una base implementada usando Golang con arquitectura hexagonal, pero necesita mejoras críticas antes del lanzamiento.
El equipo anterior dejó el proyecto en un estado funcional básico, pero nuestro CI/CD pipeline automático ha identificado varios issues críticos que necesitas resolver:
- 🐛 Bugs críticos detectados por CI/CD - Endpoints fallan en tests automatizados
- ⚡ Performance - Queries lentas y falta de optimización
- 🔒 Seguridad - Vulnerabilidades en autenticación detectadas
- 📝 Features faltantes - Funcionalidades requeridas por el cliente
- 🧪 Testing - Tests de integración fallan, cobertura 0%
💡 ¡Buenas noticias! El pipeline de CI/CD está funcionando perfectamente y detectando automáticamente todos los problemas que necesitas arreglar.
El proyecto utiliza arquitectura hexagonal (Clean Architecture):
tecnica_backend/
├── cmd/api/main.go # ✅ Punto de entrada
├── internal/core/ # ✅ DOMINIO (Lógica de negocio)
│ ├── domain/ # ✅ Entidades (User, Task)
│ ├── ports/ # ✅ Interfaces
│ └── services/ # ✅ Casos de uso
├── internal/adapters/ # ✅ ADAPTADORES
│ ├── primary/http/ # ✅ REST API (Gin)
│ └── secondary/persistence/ # ✅ Base de datos (GORM)
├── pkg/ # ✅ Utilidades (JWT, DB)
├── tests/ # ⚠️ NECESITA IMPLEMENTACIÓN
├── docker-compose.yml # ✅ PostgreSQL
└── Makefile # ✅ Comandos útiles
✅ = Implementado |
El proyecto implementa un Git Flow completo con pipelines automatizados de CI/CD:
feature/nueva-funcionalidad → developer → main
↓ ↓ ↓
🧪 Tests rápidos 🔍 Full CI 🚀 Deploy
feature/*,feat/*,bugfix/*,hotfix/*- Validación rápida: Build + Unit tests
- PR a developer: Validación completa + Architecture check
- Auto-merge: Disponible con label
auto-merge
- Merge automático dispara deployment a producción
- Validación completa: Arquitectura + Tests + Seguridad
- Docker build + Push to registry
- Health checks post-deployment
Cada PR y push es validado automáticamente:
- ✅ Estructura de carpetas - Todas las capas requeridas presentes
- ✅ Pureza del dominio - Sin imports externos (gin, gorm, jwt)
- ✅ Dirección de dependencias - Core no importa adapters
- ✅ Interfaces (puertos) - Contratos bien definidos
- ✅ Métricas de calidad - Go vet, gofmt, coverage
| Etapa | Unit Tests | Integration Tests | Architecture | Security |
|---|---|---|---|---|
| Feature Push | ✅ Rápido | ❌ | ❌ | ❌ |
| PR → developer | ✅ Completo | ✅ Con DB | ✅ Full | ✅ Gosec |
| PR → main | ✅ Completo | ✅ Con DB | ✅ Full | ✅ Gosec |
| Deploy | ✅ + Coverage | ✅ + Report | ✅ + Metrics | ✅ + SARIF |
🎉 ¡Pipeline funcionando perfectamente! Nuestro CI/CD está detectando automáticamente todos los issues:
- Database Connection - PostgreSQL conecta correctamente
- Migration - Tablas se crean sin problemas
- Health Check - Endpoint
/healthresponde OK - Authentication Flow Test - Validaciones de autorización funcionan
- Unit Tests - Tests básicos de
TaskServicepasan - Go Vet - Código pasa análisis estático
- Go Fmt - Código correctamente formateado
- Architecture Validation - Estructura hexagonal correcta
- Registro de Usuario Falla -
POST /api/auth/registerretorna400 Bad Request - JWT Token No Se Genera - El registro exitoso no devuelve token
- Autenticación Posterior Falla - Endpoints protegidos devuelven
401 Unauthorized - Panic en Tests -
index out of range [0]cuando se accede a arrays vacíos
Coverage: 0.0% en todos los módulos principales
- handlers: 0.0% (necesita tests)
- services: 0.0% (necesita tests)
- repositories: 0.0% (necesita tests)
- middleware: 0.0% (necesita tests)
📝 Nota: El pipeline está diseñado para fallar hasta que se corrijan estos bugs. ¡Es exactamente lo que queremos en una prueba técnica!
🤖 Issues detectados automáticamente por nuestro CI/CD:
- Issue:
POST /api/auth/registerretorna400 Bad Requesten lugar de201 Created - CI/CD detectó: Expected
201but got400 - Probable causa: Validaciones rotas o campos faltantes
- Prioridad: 🔴 Alta
- Issue: El registro no devuelve token JWT
- CI/CD detectó:
suite.NotEmpty(registerResponse.Token)falla - Síntomas: Campo
tokenvacío en respuesta de registro - Prioridad: 🔴 Alta
- Issue: Todos los endpoints protegidos devuelven
401 Unauthorized - CI/CD detectó: Expected
201for task creation but got401 - Síntomas: Tokens válidos son rechazados
- Prioridad: 🔴 Alta
- Issue:
index out of range [0] with length 0 - CI/CD detectó: Runtime panic en tests de integración
- Síntomas: Código intenta acceder array[0] cuando array está vacío
- Prioridad: 🔴 Alta
- Issue: Consultas ineficientes en obtención de tareas
- Meta: Optimizar para manejar 1000+ tareas por usuario
- Prioridad: 🟡 Media
- Issue: GET /tasks devuelve todas las tareas sin límite
- Meta: Implementar paginación (page, limit)
- Prioridad: 🟡 Media
- Requerimiento: Filtrar por completed, date_range, search
- Ejemplo:
GET /tasks?completed=true&search=meeting - Prioridad: 🟢 Baja
- Requerimiento: No eliminar tareas permanentemente
- Meta: Implementar campo deleted_at
- Prioridad: 🟢 Baja
- Requerimiento: Al menos 80% cobertura en servicios
- Meta: Tests para AuthService y TaskService
- Prioridad: 🟡 Media
- Requerimiento: Tests end-to-end para flujos críticos
- Meta: Registro → Login → Crear tarea → Listar tareas
- Prioridad: 🟢 Baja
POST /api/auth/register # Registro de usuario
POST /api/auth/login # Inicio de sesiónGET /api/tasks # Listar tareas del usuario
POST /api/tasks # Crear nueva tarea
GET /api/tasks/:id # Obtener tarea específica
PUT /api/tasks/:id # Actualizar tarea
DELETE /api/tasks/:id # Eliminar tareaLas siguientes dependencias ya están configuradas en go.mod:
- gin-gonic/gin - Framework HTTP
- gorm.io/gorm - ORM
- gorm.io/driver/postgres - Driver PostgreSQL
- golang-jwt/jwt/v4 - JWT
- golang.org/x/crypto - Hashing de contraseñas
- stretchr/testify - Testing
# Configurar el proyecto (crear .env, descargar dependencias)
make setup
# O manualmente:
cp .env.example .env
go mod download# Iniciar PostgreSQL con Docker
make docker-up
# Ver logs de PostgreSQL (opcional)
make docker-logs# Ejecutar la aplicación
make run
# O todo junto (BD + API)
make dev# Probar todos los endpoints automáticamente
make test-api
# O manualmente con curl (ver ejemplos más abajo)# Tests unitarios solamente
make test
# Tests de integración
make test-integration
# Todos los tests
make test-all# Ver todos los comandos disponibles
make help
# Compilar la aplicación
make build
# Limpiar archivos generados
make clean
# Verificar dependencias
make deps- Arquitectura hexagonal implementada correctamente
- Entidades del dominio con validaciones
- CRUD completo de tareas funcionando
- Autenticación JWT funcionando
- Endpoints REST respondiendo correctamente
- Separación correcta entre capas
- Manejo apropiado de errores
- Middleware de autenticación funcionando
- Validaciones de entrada en handlers
- Repositorios con GORM implementados
- Tests unitarios con mocks
- Tests de integración
- Código limpio y bien documentado
- Manejo de transacciones (opcional)
- Logs estructurados (opcional)
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "password123"
}'curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "password123"
}'curl -X POST http://localhost:8080/api/tasks \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Mi primera tarea",
"description": "Descripción de la tarea"
}'2-3 horas para una implementación completa.
- El dominio no debe importar nada de capas externas
- Los puertos son solo interfaces
- Los adaptadores implementan los puertos
- La inyección de dependencias debe ser hacia adentro
// Auto-migración
db.AutoMigrate(&domain.User{}, &domain.Task{})
// Ejemplo de query
var tasks []domain.Task
db.Where("user_id = ?", userID).Find(&tasks)// Generar token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, _ := token.SignedString([]byte(secretKey))Si tienes dudas sobre:
- Arquitectura hexagonal - ¿Dónde va cada cosa?
- GORM - ¿Cómo hacer una query específica?
- Estructura de proyecto - ¿Cómo organizar el código?
¡Pregunta sin problema! 💪
Al finalizar, asegúrate de que:
- La aplicación compile sin errores
- Los endpoints principales funcionen
- Al menos los tests básicos pasen
- El código esté limpio y comentado
- La base de datos se inicialice correctamente
¡Buena suerte! 🚀