Proyecto Ordinario - Microservices Architecture

Especificaciones

Inicio

Crear un nuevo repositorio para el proyecto final en la cuenta de cualquiera de los miembros del equipo.

Los miembros restantes deberán de crear un fork de este repositorio y contribuir en él conforme se vaya desarrollando la práctica.

Al final cada elemento del equipo deberá de subir un link al repositorio del proyecto final en su propia carpeta de alumno dentro de un archivo .md el cual deberá de estar bajo una nueva sub-carpeta que se llame Ordinario.

Desarrollo

Crear un archivo docker-compose.yml por medio del cual se instancien múltiples contenedores que satisfagan la siguiente propuesta de problema.

Necesitamos construir una API sencilla que nos permita registrar transacciones de usuario y tener un panorama general de como usan su dinero.

Para llevar esto a cabo, tienes que implementar una API que nos permita almacenar transacciones de usuario.

Cada transacción tiene referencia (única), fecha, total, tipo y categoría, y luce de la siguiente manera:

{
    "reference": "000051",
    "date": "2020-01-13",
    "amount": "-51.13",
    "type": "outflow",
    "category": "groceries",
    "user_email": "janedoe@email.com"
}

Se tienen que tomar en cuenta los siguientes puntos:

  • La referencia de una transacción es única
  • Solamente existen dos tipos de transacción: inflow y outflow
  • Todas las transacciones de tipo outflow son numeros decimales negativos
  • Todas las transacciones de tipo inflow son numeros decimales positivos
  • Es posible recibir transacciones en masa también, ya sea por medio de un archivo externo o dentro de una misma petición
  • Las transacciones que recibamos pueden ya existir en nuestro sistema, por lo que es necesario validarlas para evitar duplicados en nuestra base de datos

Objetivos

Dado el siguiente ejemplo de entrada de datos:

[
    {
        "reference": "000051",
        "date": "2020-01-03",
        "amount": "-51.13",
        "type": "outflow",
        "category": "groceries",
        "user_email": "janedoe@email.com"
    },
    {
        "reference": "000052",
        "date": "2020-01-10",
        "amount": "2500.72",
        "type": "inflow",
        "category": "salary",
        "user_email": "janedoe@email.com"
    },
    {
        "reference": "000053",
        "date": "2020-01-10",
        "amount": "-150.72",
        "type": "outflow",
        "category": "transfer",
        "user_email": "janedoe@email.com"
    },
    {
        "reference": "000054",
        "date": "2020-01-13",
        "amount": "-560.00",
        "type": "outflow",
        "category": "rent",
        "user_email": "janedoe@email.com"
    },
    {
        "reference": "000051",
        "date": "2020-01-04",
        "amount": "-51.13",
        "type": "outflow",
        "category": "other",
        "user_email": "johndoe@email.com"
    },
    {
        "reference": "000689",
        "date": "2020-01-10",
        "amount": "150.72",
        "type": "inflow",
        "category": "savings",
        "user_email": "janedoe@email.com"
    }
]

1.- Queremos ser capaces de ver un resumen que nos muestre el inflow y outflow total por usuario. Ejemplo:

GET /transactions?group_by=type

[
    {
        "user_email": "janedoe@email.com",
        "total_inflow": "2651.44",
        "total_outflow": "-761.85"
    },
    {
        "user_email": "johndoe@email.com",
        "total_inflow": "0.00",
        "total_outflow": "-51.13"
    }
]

2.- Queremos poder ver un resumen de usuario por categoría que muestre la suma de cantidades por categoría de transacción. Ejemplo:

GET /transactions/{user_email}/summary

{
    "inflow": {
        "salary": "2500.72",
        "savings": "150.72"
    },
    "outflow": {
        "groceries": "-51.13",
        "rent": "-560.00",
        "transfer": "-150.72"
    }
}

Expectativas

  • Construye la aplicación utilizando Python
  • Los endpoints o rutas son solo ejemplos, siéntete libre de cambiarlos de acuerdo a tus necesidades, solamente se espera que sigas el formato de respuesta
  • Agrega test unitarios y/o de integración
  • Optimiza en función del tiempo disponible y no del rendimiento de la aplicación
  • Dockeriza tu aplicación en base a lo visto en clase 😉
  • Utiliza Flask (y flask-restful), FastApi o Django (y DRF) como alguno de los frameworks para tu API
  • La base de datos es libre

Opcional - Puntos Extra

Los siguientes puntos son opcionales, sin embargo implementarlos provee 3 puntos extra por cada uno sobre la calificación total final.

  • Utilizar Swagger en tu proyecto y agregar un contenedor nuevo con el Swagger UI de la aplicación
  • Agregar RabbitMQ para alguna o todas las operaciones CRUD de la aplicación
  • Agregar un contenedor extra que provea un frontend (GUI) que consuma la API que creaste. Acá puedes utilizar tecnologías como HTML, CSS, Javascript, Bootstrap, Vue, Angular o ReactJS para hacer más rápido este proceso. Queda a tu criterio, imaginación y creatividad el cómo luzca la interfaz final 😉
  • Agregar testing y/o automatización de pruebas por medio de https://github.com/testcontainers/testcontainers-python

Conclusión

Crear un archivo README.md en el que se incluya lo siguiente:

  • Un diagrama de la arquitectura de tu proyecto y un diagrama de la base de datos (DER). Pueden apoyarse de algunas herramientas como https://github.com/mingrammer/diagrams o https://app.diagrams.net/ para generar los diagramas del proyecto. Este diagrama también debe de incluirse como imágen dentro del proyecto final
  • Los pasos a seguir detallados y concisos que indiquen como hacer funcionar el proyecto, de tal manera que pueda ser revisado sin mayores complicaciones

Finalmente, agreguen un video en equipo, en donde se exponga a detalle su proyecto y se hagan pruebas con él. Queda a criterio del propio equipo el como llevar a cabo la presentación, pero sí es necesario que cada miembro participe en la misma.

  • Llevar a cabo este punto por medio de MS Teams y subir el archivo .mp4 a algún drive público adjuntando el link de acceso al video al archivo README.md
  • La exposición no debe tener una duración mayor a 15 minutos

Recursos

Arquitectura

Librerías

Deadline

  • Domingo 12 de Junio a las 11:59pm