| pkg | ||
| service_a | ||
| service_b | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Makefile | ||
| meteo.csv | ||
| README.md | ||
meteologica
Prueba técnica para el puesto de desarrollador Go/C++
Requisitos previos
- Docker
- Go
- Make, si prefieres usar la comodidad de Makefile
Rutas disponibles
Compilar todos los servicios e iniciar los contenedores Docker.
docker compose --env-file <path/to/file> up --build`
Hacer petición POST con fichero a /ingest/csv
curl -X POST "http://<host>/ingest/csv" -F "file=@<file>.csv"
curl -X POST "http://localhost:8080/ingest/csv" -F "file@meteo.csv"
Hacer petición GET a /cities para listar las ciudades
curl "http://<host>/cities"
curl "http://localhost:8080/cities"
Hacer petición GET a /data para obtener datos en crudo
curl "http://<host>/data?city=<city>&from=<yyyy-mm-dd>&to=<yyyy-mm-dd>&page=<n>&limit=<n>"
curl "http://localhost:8080/data?city=Madrid&from=2025-01-01&to=2025-12-31&page=3&limit=2"
Hacer petición GET a /weather/{city}
curl "http://<host>/weather/<city>?date=<yyyy-mm-dd>&days=<1-10>&unit=<C | F>&agg=<daily | rolling>"
curl "http://localhost:8090/weather/madrid?date=2025-11-02&days=10&unit=F&agg=rolling"
Requisitos cubiertos
Servicio A
- Base de datos
- Endpoint POST /ingest/csv
- Listar ciudades en base de datos
- Mostrar registros en crudo
- Especificación OpenAPI
Servicio B
- Especificación OpenAPI
- Endpoint GET /weather/{city} + parámetros
- Conversión entre Celsius y Fahrenheit
- Caché
- Tolerancia a fallos
Consideraciones
Hay partes de códigos que son snippets extraídos de una librería de autoría propia. Repositorio GitHub. De las cuales son:
- La conexión con la base de datos, usando el controlador pgx.
- La carga de variables de entorno mediante fichero.
- La migración de base de datos.
Diseño y arquitectura
Recientemente hice otra prueba técnica para el mismo puesto y mismo lenguaje distintas tecnologías, en ese caso era para trabajar con mensajería NATS, puedes ver más información en el repositorio. Cuyo proyecto integra un sistema de caché muy primitivo, sin embargo en este se hace uso de Ristretto.
La estructuración del proyecto es la misma, basada en dominios pero con ligeras modificaciones, no es DDD puro. Para evitar el abuso de la creación de paquetes en un mismo dominio (complejidad innecesaria y exceso de directorios), agrupo todas las partes implicadas (handlers, repos, models, services) en un directorio por dominio.
El directorio pkg contiene todo el código común a los dos servicios como la carga de variables de entorno, errores de dominio, conversiones de tipos, etc.
IA Generativa
Es evidente que con el uso de la IA, el código se hace mucho más rápido pero para la prueba como demostración de mis habilidades se ha usado lo mínimo posible, centrando en el diseño y arquitectura que la generación de código en sí. Se ha usado Claude para la generación de código y Grok para la discusión y debate de diseño.