# 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. ```bash docker compose --env-file up --build` ``` Hacer petición POST con fichero a `/ingest/csv` ```bash curl -X POST "http:///ingest/csv" -F "file=@.csv" curl -X POST "http://localhost:8080/ingest/csv" -F "file@meteo.csv" ``` Hacer petición GET a `/cities` para listar las ciudades ```bash curl "http:///cities" curl "http://localhost:8080/cities" ``` Hacer petición GET a `/data` para obtener datos en crudo ```bash curl "http:///data?city=&from=&to=&page=&limit=" 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}` ```bash curl "http:///weather/?date=&days=<1-10>&unit=&agg=" curl "http://localhost:8090/weather/madrid?date=2025-11-02&days=10&unit=F&agg=rolling" ``` ## Requisitos cubiertos ### Servicio A - [x] Base de datos - [x] Endpoint POST /ingest/csv - [x] Listar ciudades en base de datos - [x] Mostrar registros en crudo - [ ] Especificación OpenAPI ### Servicio B - [ ] Especificación OpenAPI - [x] Endpoint GET /weather/{city} + parámetros - [x] Conversión entre Celsius y Fahrenheit - [ ] Caché - [x] Tolerancia a fallos ## Consideraciones Hay partes de códigos que son _snippets_ extraídos de una librería de autoría propia. [Repositorio GitHub](https://github.com/zepyrshut/gopher-toolbox). De las cuales son: - La conexión con la base de datos, usando el controlador [pgx](https://github.com/jackc/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](https://git.pedroperez.dev/pedro/nats-app). 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.