This project is a simple FastAPI REST service for managing messages.
The following subsections state the original test problem (in spanish).
La prueba consta del diseño de BD y un API básica para resolver una necesidad concreta de un sistema de chatbots. Con esta prueba queremos evaluar cómo se resolvería uno de los tipicos “problemas” a la hora de crear un sistema de este tipo, donde evaluaremos el conocimiento y las habilidades como analista y desarrollador. Suponiendo que queremos implementar una aplicación de chatbots, donde además de texto plano, nuestro sistema puede enviar otro tipo de mensajes, como carruseles, imágenes, y botones. Nuestra herramienta es un configurador de conversaciones donde pintamos los caminos que tiene la conversación conectados entre ellos con una condición (if/else) que nos hará decidir por qué camino sigue la conversación.
Se solicita el diseño de BD para cubrir esta necesidad únicamente (no todo el sistema) y el API CRUD necesaria para crear “mensajes” y “caminos” en la conversación
-
Diseño de BD: Tenemos que crear las entidades necesarias para almacenar mensjaes, y la entidad camino que relaciona el mensaje de origen y de destino. Estos caminos además tendrán un campo “condición” que nos indica si puede cruzar ese camino o no. Los mensajes pueden ser de varios tipos, y contendran información diferente dependiendo del tipo que sean. A continuación detallamos los campos por tipo:
-
Mensaje de texto: respuesta, imagen (optional)
-
Mensaje de botones: respuesta, imagen (optional), lista de botones (cada botón tiene: texto y valor)
-
Mensaje carrusel: respuesta, lista de tarjetas (cada tarjeta tiene: imagen, texto, lista de botones con texto y valor cada botón)
-
-
API CRUD: Crear el CRUD básico para crear mensajes y caminos entre dos mensajes.
This project was written with Python 3.10, using FastAPI, SQLAlchemy and psycopg2.
This project's file structure is a simplified, back-end-only spin on Tiangolo's Full Stack Fastapi Postgres base project that uses Pipenv instead of Poetry for dependency management.
This database structure enabled the use of all standard SQL for implementing the card
and message buttons instead of using PostgresQL specific extensions, as their Array
datatype, allowing the same models to be used regardless of specific DBMS backend.
Having "parent" tables (in the OOP sense) also allowed both the deduplication of
button
and message
columns, as well as a simple mechanism for the way
to relate
any two messages, regardless of their type.
If you wish to use a different DBMS for this project, just modify app.core.config.py
and create an appropriate .env
.
For running either the tests or the development server, the project expects a .env
file in its root containing the following variables:
DOMAIN=localhost
SERVER_NAME=$DOMAIN
SERVER_HOST=https://${DOMAIN}
PROJECT_NAME=hr-bot-factory
# Postgres
POSTGRES_SERVER=127.0.0.1
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=hr-bot-factory
You are able (and encouraged) to change their values.
Install Pipenv if you haven't already. You should probably follow their instructions, but it can be as easy as:
$ pip install pipenv
Then install the project's dependencies:
$ pipenv install
Activate the virtual environment by running pipenv shell
and then run the following
command from the root of the project:
$ pytest .
As for testing, start by activating the virtual environment and then run the following command from the root of the project:
$ uvicorn app.main:app --reload