# NATS APP Lectura de datos de sensores en un dispositivo IoT. Prueba técnica para optar por el puesto de programador Go. ## Requisitos previos - Docker - NATS CLI - Make, si prefieres la comodidad de usar Makefile ## 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: - El _logger_ usando la _stdlib log/slog_. ## Bitácora ### Quickstart y toma de contacto con NATS Lo primero que he hecho es un _quickstart_ del proyecto, con lo que siempre o casi siempre pongo en mis experimentos. Y lo siguiente, en lugar de empezar a construir el proyecto como loco he tratado de entender cómo funciona NATS. Al final ha sido muy sencillo, siguiendo esos pasos: 1. Levantar el servidor NATS en Docker 2. Instalar el CLI de NATS 2. Abrir un puñado de terminales, y en un par de ellas escribir: `nats sub "hello"` lo cual significa que se está suscribiendo al canal `hello`. Y en otra escribir: `nats pub "hello" "Hola mundo!"`, lo cual significa que está escribiendo el mensaje `Hola mundo!` en el canal `hello`. ![demo de NATS](./assets/nats-demo-1.png) ### Creación de la aplicación La parte fácil es hacer todo el _boilerplate_, hecho en solo _commit_, que no es lo ideal pero lo dicho, es puro relleno, mucho código ya viene escrito de la librería `gopher-toolbox`. En este punto el proyecto compila pero hay error en tiempo de ejecución por la falta de implementaciones en el repositorio. ### Empezando por el repositorio El almacenamiento de los datos se ha optado por el uso de `TimescaleDB`, una extensión de `PostgreSQL`, el motivo es porque ya he trabajado mucho con ese motor y tengo los _drivers_ ya escritos. Tengo entendido que está optimizado para trabajar con grandes cantidades de datos de series temporales, lo que viene siendo valores de sensores por ejemplo. Por otro lado también hay un sistema de caché muy rudimentario, en memoria que es un mapa de valores. Para el registro de valores y mantener ambos se ha usado el patrón decorador que bajo un mismo _struct_ se incluye las dos implementaciones y se llama a ambas funciones. Desde la capa servicios sólo tiene que llamar al decorador sin saber los detalles de la implementación.