Skip to content

Repository files navigation

🎯 Prueba Técnica Backend - API de Gestión de Tareas

📋 Contexto del Proyecto

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.

🚨 Situación Actual

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:

  1. 🐛 Bugs críticos detectados por CI/CD - Endpoints fallan en tests automatizados
  2. ⚡ Performance - Queries lentas y falta de optimización
  3. 🔒 Seguridad - Vulnerabilidades en autenticación detectadas
  4. 📝 Features faltantes - Funcionalidades requeridas por el cliente
  5. 🧪 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.


🏛️ Arquitectura del Sistema

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 | ⚠️ = Necesita trabajo

🚀 Git Flow + CI/CD Pipeline

El proyecto implementa un Git Flow completo con pipelines automatizados de CI/CD:

🔄 Flujo de Trabajo (Git Flow)

feature/nueva-funcionalidad → developer → main
        ↓                         ↓        ↓
    🧪 Tests rápidos         🔍 Full CI   🚀 Deploy

1. 🌿 Feature Branches → Developer

  • 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

2. 🚀 Developer → Main (Deploy)

  • Merge automático dispara deployment a producción
  • Validación completa: Arquitectura + Tests + Seguridad
  • Docker build + Push to registry
  • Health checks post-deployment

🏛️ Validaciones de Arquitectura Hexagonal

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

🧪 Testing Pipeline Completo

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

📊 Badges de Estado

CI/CD Feature CI Architecture Go Report Card codecov

🙏 Estado Actual del CI/CD Pipeline

🎉 ¡Pipeline funcionando perfectamente! Nuestro CI/CD está detectando automáticamente todos los issues:

✅ Tests que PASAN:

  • Database Connection - PostgreSQL conecta correctamente
  • Migration - Tablas se crean sin problemas
  • Health Check - Endpoint /health responde OK
  • Authentication Flow Test - Validaciones de autorización funcionan
  • Unit Tests - Tests básicos de TaskService pasan
  • Go Vet - Código pasa análisis estático
  • Go Fmt - Código correctamente formateado
  • Architecture Validation - Estructura hexagonal correcta

❌ Issues DETECTADOS por el Pipeline:

🚨 Critical Bugs Encontrados:

  1. Registro de Usuario Falla - POST /api/auth/register retorna 400 Bad Request
  2. JWT Token No Se Genera - El registro exitoso no devuelve token
  3. Autenticación Posterior Falla - Endpoints protegidos devuelven 401 Unauthorized
  4. Panic en Tests - index out of range [0] cuando se accede a arrays vacíos

📊 Coverage Report:

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!


🎯 Desafíos a Resolver

🐛 Nivel 1: Bug Fixes (Crítico)

🤖 Issues detectados automáticamente por nuestro CI/CD:

1.1 Registro de Usuario Roto

  • Issue: POST /api/auth/register retorna 400 Bad Request en lugar de 201 Created
  • CI/CD detectó: Expected 201 but got 400
  • Probable causa: Validaciones rotas o campos faltantes
  • Prioridad: 🔴 Alta

1.2 JWT Token No Se Genera

  • Issue: El registro no devuelve token JWT
  • CI/CD detectó: suite.NotEmpty(registerResponse.Token) falla
  • Síntomas: Campo token vacío en respuesta de registro
  • Prioridad: 🔴 Alta

1.3 Middleware de Autenticación Roto

  • Issue: Todos los endpoints protegidos devuelven 401 Unauthorized
  • CI/CD detectó: Expected 201 for task creation but got 401
  • Síntomas: Tokens válidos son rechazados
  • Prioridad: 🔴 Alta

1.4 Panic en Array Access

  • 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

⚡ Nivel 2: Mejoras de Performance (Importante)

2.1 Queries N+1

  • Issue: Consultas ineficientes en obtención de tareas
  • Meta: Optimizar para manejar 1000+ tareas por usuario
  • Prioridad: 🟡 Media

2.2 Falta de Paginación

  • Issue: GET /tasks devuelve todas las tareas sin límite
  • Meta: Implementar paginación (page, limit)
  • Prioridad: 🟡 Media

📝 Nivel 3: Features Faltantes (Deseables)

3.1 Filtros de Tareas

  • Requerimiento: Filtrar por completed, date_range, search
  • Ejemplo: GET /tasks?completed=true&search=meeting
  • Prioridad: 🟢 Baja

3.2 Soft Delete

  • Requerimiento: No eliminar tareas permanentemente
  • Meta: Implementar campo deleted_at
  • Prioridad: 🟢 Baja

🧪 Nivel 4: Testing (Esencial)

4.1 Tests Unitarios

  • Requerimiento: Al menos 80% cobertura en servicios
  • Meta: Tests para AuthService y TaskService
  • Prioridad: 🟡 Media

4.2 Tests de Integración

  • Requerimiento: Tests end-to-end para flujos críticos
  • Meta: Registro → Login → Crear tarea → Listar tareas
  • Prioridad: 🟢 Baja

🔗 Endpoints Disponibles

Autenticación

POST /api/auth/register    # Registro de usuario
POST /api/auth/login       # Inicio de sesión

Tareas (Requieren JWT)

GET    /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 tarea

🛠️ Tecnologías Incluidas

Las 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

🚀 Cómo Empezar

1. Configuración Inicial

# Configurar el proyecto (crear .env, descargar dependencias)
make setup

# O manualmente:
cp .env.example .env
go mod download

2. Levantar la Base de Datos

# Iniciar PostgreSQL con Docker
make docker-up

# Ver logs de PostgreSQL (opcional)
make docker-logs

3. Ejecutar la Aplicación

# Ejecutar la aplicación
make run

# O todo junto (BD + API)
make dev

4. Probar la API

# Probar todos los endpoints automáticamente
make test-api

# O manualmente con curl (ver ejemplos más abajo)

5. Ejecutar Tests

# Tests unitarios solamente
make test

# Tests de integración
make test-integration

# Todos los tests
make test-all

6. Comandos Útiles

# Ver todos los comandos disponibles
make help

# Compilar la aplicación
make build

# Limpiar archivos generados
make clean

# Verificar dependencias
make deps

📋 Criterios de Evaluación

Básico (60%)

  • Arquitectura hexagonal implementada correctamente
  • Entidades del dominio con validaciones
  • CRUD completo de tareas funcionando
  • Autenticación JWT funcionando
  • Endpoints REST respondiendo correctamente

⭐⭐ Intermedio (80%)

  • Separación correcta entre capas
  • Manejo apropiado de errores
  • Middleware de autenticación funcionando
  • Validaciones de entrada en handlers
  • Repositorios con GORM implementados

⭐⭐⭐ Avanzado (100%)

  • Tests unitarios con mocks
  • Tests de integración
  • Código limpio y bien documentado
  • Manejo de transacciones (opcional)
  • Logs estructurados (opcional)

🧪 Ejemplos de Uso

Registro de Usuario

curl -X POST http://localhost:8080/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "password123"
  }'

Login

curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "password123"
  }'

Crear Tarea

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"
  }'

Tiempo Estimado

2-3 horas para una implementación completa.


💡 Consejos

Arquitectura Hexagonal:

  • 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

GORM Tips:

// Auto-migración
db.AutoMigrate(&domain.User{}, &domain.Task{})

// Ejemplo de query
var tasks []domain.Task
db.Where("user_id = ?", userID).Find(&tasks)

JWT Tips:

// Generar token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, _ := token.SignedString([]byte(secretKey))

🆘 ¿Necesitas Ayuda?

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! 💪


📝 Entregables

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! 🚀

About

Proyecto creado para Pruebas tecnicas para backend

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages