Skip to content

carlosdiaz-meli/weather-predictor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Weather Predictor 🌦️

Descripción del ejercicio 🪐

En una galaxia lejana, existen tres civilizaciones. Vulcanos, Ferengis y Betasoides. Cada civilización vive en paz en su respectivo planeta.

Dominan la predicción del clima mediante un complejo sistema informático.

A continuación el diagrama del sistema solar.

Sistema solar

Premisas

  • El planeta Ferengi se desplaza con una velocidad angular de 1 grados/día en sentido horario. Su distancia con respecto al sol es de 500Km.

  • El planeta Vulcano se desplaza con una velocidad angular de 5 grados/día en sentido anti­horario. Su distancia con respecto al sol es de 1000Km.

  • El planeta Betasoide se desplaza con una velocidad angular de 3 grados/día en sentido horario. Su distancia con respecto al sol es de 2000Km.

  • Todas las órbitas son circulares.

Cuando los tres planetas están alineados entre sí y a su vez alineados con respecto al sol, el sistema solar experimenta un período de sequía.

Sequía

Cuando los tres planetas no están alineados, forman entre sí un triángulo. Es sabido que en el momento en el que el sol se encuentra dentro del triángulo, el sistema solar experimenta un período de lluvia, teniendo éste, un pico de intensidad cuando el perímetro del triángulo está en su máximo.

Lluvia

Las condiciones óptimas de presión y temperatura se dan cuando los tres planetas están alineados entre sí pero no están alineados con el sol.

Óptimo

Se debe desarrollar un programa que pueda predecir la siguiente información en los próximos 10 años:

  1. ¿Cuántos períodos de sequía habrá?
  2. ¿Cuántos períodos de lluvia habrá y qué día será el pico máximo de lluvia?
  3. ¿Cuántos períodos de condiciones óptimas de presión y temperatura habrá?

Para poder utilizar el sistema como un servicio a las otras civilizaciones, los Vulcanos requieren tener una base de datos con las condiciones meteorológicas de todos los días y brindar una API REST de consulta sobre las condiciones de un día en particular.

¿Cómo pruebo la solución de este repositorio? 🤔︎

El proyecto consta de 2 carpetas de aplicación (functions y test-server) y una carpeta para los recursos de esta documentación (assets).

Una vez se clona o descarga el proyecto, se deben seguir los comandos a continuación.

  1. Ejecutar el proyecto test-server.

    • Ubicar la consola en la carpeta test-server:

      ~\weather-predictor> cd test-server
      
    • Iniciar el servidor:

      ~\weather-predictor\test-server> go run app.go

      Esto creará un servidor web que se encuentra corriendo en http://localhost:1234/. En la consola se muestra un mensaje así:

      ~\weather-predictor\test-server> go run app.go
      Corriendo en http://localhost:1234
      inMemory

      La palabra inMemory significa que el servidor guardará la información que se genere en memoria. Para almacenar la información en MySQL se debe ejecutar:

      ~\weather-predictor\test-server> DATABASE_TYPE=MySQL go run app.go
      Corriendo en http://localhost:1234
      MySQL

    Una vez levantado el servidor, éste tendrá 2 endpoints, los cuales estarán utilizando las clases generadas en el proyecto functions.

  2. La aplicación que se encuentra en ejecución en http://localhost:1234/ contiene los siguientes endpoints:

    • Generación de los datos. Es importante ejecutar este endpoint para generar y almacenar todas las predicciones.

      • Método HTTP: GET

      • Url: http://localhost:1234/generar-prediccion

      • Controlador: SolarSystemController

      • Método: GeneratePredictions

      • Códigos de respuesta:

        201 Created: El sistema solar y los datos del clima de 10 años han sido cargados correctamente.

        {
            "created": true,
            "data": {
                "daysWithMaxRain": [
                    2808,
                    2952,
                    3492
                ],
                "dryDays": 21,
                "maxPerimeter": 6262.300354242005,
                "normalDays": 2389,
                "optimalDays": 40,
                "rainyDays": 1202
            }
        }

        200 OK: El sistema solar y los datos del clima de 10 años ya se han cargado con anterioridad.

        {
            "message": "The solar system was already created. Congrats!"
        }

        500 Internal Server Error: Ocurrió un error en el cargue de datos. El cuerpo de respuesta varía dependiendo del error. Se puede deber a conexión con la base de datos u otros procesos que no fueron controlados.

    • Consulta de los datos.

Arquitectura implementada 🌇

Hablando de código... 💻

  • ☕ Arquitectura... se implementó la arquitectura Hexagonal de la mano de DDD, CQRS sin olvidar los principios SOLID.

  • ✍️ Lenguaje/tecnología... todo esto fue desarrollado en Go.

Y la base de datos... ¿qué? ⛅

Si llevamos a cabo la ejecución del script DATABASE_TYPE=MySQL go run app.go, la aplicación al recibir la primera solicitud, sea el endpoint que sea, realizará el montaje de la base de datos MySQL, creando la tabla necesaria para el almacenamiento y consulta de las predicciones.

La gestión del repositorio se realiza en mysql.go.

Esta base de datos se ve de la siguiente forma:

  • Tabla weather_days:

    Los campos son:

    • day: Número de día. Empieza por 0.
    • condition: Corresponde a la condición climática de ese día.

Table weather_days

Data table weather_days

Consideración: Esta tabla no contiene más información debido al planteamiento del problema, el cual solo exige la consulta del estado del clima en un día específico, mas no de los demás datos.

Challenge: Invito a todxs lxs que quieran agregar nuevos repositorios a enriquecer este proyecto para usarlo de ejemplo de programación en Go y arquitecturas descritas en Hablando de código.

About

Ejercicio de arquitectura y desarrollo de software orientado a resolver la necesidad de calcular predicciones climáticas de 10 años.

Topics

Resources

Stars

Watchers

Forks

Languages