meteologica/README.md
2025-10-31 13:59:15 +01:00

104 lines
3.1 KiB
Markdown

# 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 <path/to/file> up --build`
```
Hacer petición POST con fichero a `/ingest/csv`
```bash
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
```bash
curl "http://<host>/cities"
curl "http://localhost:8080/cities"
```
Hacer petición GET a `/data` para obtener datos en crudo
```bash
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}`
```bash
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
- [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.