104 lines
3.1 KiB
Markdown
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.
|