EasyFeedback Arquitectura
Tags: micronaut, feedback, oopensource
Published: 2021-01-08 16:41:57

En este segundo post sobre EasyFeedback voy a describir de forma resumida la arquitectura general que he utilizado para el MVP de esta aplicación

Como todo buen MVP EasyFeedback pretende ser lo más sencillo tanto en usabilidad como en requisitos sin incurrir en gastos innecesarios

En lo relativo a usabilidad, ofrece un editor mínimo donde poder especificar un título, hasta cuatro opciones así como guardar y recuperar una encuesta pero corresponde al usuario anotar en algún sitio los identificadores. Así mismo el interface gráfico busca ser completo pero escueto.

En lo relativo a requisitos técnicos se pretende que desde el primer momento cuente con una dirección web asociada al proyecto, fácil de recordar y operativa, es decir, no sólo el lan.ding Page debe alojarse en esta URL sino la aplicación.

Adicionalmente se busca una solución que no requiera de bases de datos ni manejadas ni en cloud, al menos en esta primera fase, por lo que usaremos simples ficheros de texto guardados en  algún storage que se mantenga tras los despliegues sucesivos.

Por último, todo EasyFeedback creado por un usuario puede ser accedido por este para gestionarlo como por su audiencia la cual no necesitará identificarse. Se opta pues por usar un autentificador externo OAuth tipo Google, Github, etc siendo el elegido para este MVP Google

Todo ello deberá ejecutarse en sistemas que cuenten con una capa gratuita suficiente para poder ofrecer un servicio mínimo de varios usuarios simultáneos. Por experiencias previas optaremos por Netlify y/o Okteto

## Arquitectura

Tras un par de pruebas de concepto usando Rust así como Node y viendo que la curva de aprendizaje es algo mayor de lo esperado se ha optado por un backend en Micronaut con Groovy y un front en Vue con JavaScript

La aplicación JavaScript permitirá tanto la edición como la votación invocando vía Rest las acciones oportunas en el backend. Así pues existirá un modelo de dominio común entre ambos sistemas que mantenga al menos:

- el título
- las preguntas ordenadas
- los votos de cada una
- el estado de la encuesta

Para la parte backend desplegaremos una app en Okteto con un storage asociado para guardar los Easyfeedbacks, mientras que la parte frontend .la desplegaremos en Netlify porque nos permite asociar proyectos a dominios personales (lo cual ya nos advierte que tendremos que lidiar con temas de CORS al hacer dialogar dos aplicaciones alojadas en dominios diferentes)

## Backend

Además de ofrecer un interface para guardar y recuperar objetos de dominio de forma securizada, el backend es también responsable de actualizar los votos de los asistentes a la vez que notifica a todos ellos la evolución de los mismos. Además controlará el estado de la encuesta permitiendo el conteo una vez que el moderador comienza la misma y hasta que decida pararla.

Para ello aplicará un patrón Command sincronizado que ejecutará en orden de llegada los comandos recibidos sobre la encuesta

## Frontend

Por su parte, el front manejará un mismo objeto de dominio para toda la aplicación (la edición, moderación y voto) usando diferentes componentes para mostrarlo según la parte de la aplicación en que nos encontremos

## Infraestructura

Como ya se ha comentado cada parte se despliega en un proveedor diferente (como aplicación kubernetes el backend y como static site en Vue el front)

Ambos proyectos se alojan en Gitlab y se despliegan de forma automática ante merges en master gracias a los pipelines de Gitlab

Así mismo se usa Netlify para gestionar y asociar el dominio  https://easy-feedback.app con el front