Skip to content

FeaturesBE

Agustin MoranR edited this page Jul 22, 2020 · 16 revisions

Autenticación de usuarios: Firebase Authentication

Firebase comprende un conjunto de soluciones para el backend que permite agilizar el desarrollo web. Soportado por Google y con una capa gratuita para hacer despliegues en desarrollo, se convirtió en la opción para desarrollar In Vitro dado el tiempo inicial establecido de solo 15 días. FB Authentication nos brindaba otra ventaja y era la seguridad, ya que no teníamos que hacer encriptaciones especiales en la base de datos debido a que la información era manejada por la plataforma.

Este servicio permite la creación de usuarios con datos básicos tales como el nombre, el correo y la contraseña, incluso su estado. No requiere de un nombre de usuario ya que el correo es el identificador universal que utiliza Firebase Auth.

Base de datos: Cloud Firestore

Si bien Firebase Authentication nos facilitaba la creación y actualización de usuarios, no nos permitía añadir otra información adicional como los números de contacto, el rol del usuario o el tipo de documento de identificación. Es allí donde se añadió un paso adicional en el código para que una vez realizada la correcta creación o actualización de información del usuario, se ingresara esta información en la base de datos en una colección de Cloud Firestore. Por otro lado, la información de las historias clínicas y los exámenes se crearon también en otras colecciones, procurando mantener un solo nivel de documentos (es decir, que no existieran documentos anidados que dificultaran los query).

Se prefirió Cloud Firestore sobre Realtime Database según recomendación dadas en el curso de Cloud Functions de Platzi.

Notificaciones: Firebase Cloud Functions

Firebase cuenta con una posibilidad de ejecutar funciones de manera automática cada vez que se produce un evento dentro de la plataforma, llamado Cloud Functions. Estas funciones son útiles cuando dentro de nuestro proyecto deseamos realizar acciones cada vez que surge una modificación en la base de datos, como por ejemplo el envío de un email cada vez que:

Se crea un nuevo usuario. Se suben los resultados de los exámenes. El código de las funciones se sube directamente a la plataforma y no es necesario incluirlo dentro del backend integrado. Gracias a la opción CLI se pueden realizar todas las configuraciones (como variables de entorno), testing y despliegues desde la consola

Endpoints: NodeJS + ExpressJS

Si bien las funcionalidades de Firebase pueden añadirse directamente al Front End y desde allí hacer las llamadas a las API, se integró finalmente en un repositorio de NodeJS tanto la autenticación como las demás operaciones con base de datos. De esta manera, es posible a futuro cambiar de plataforma en el front (por ejemplo a Angular, Vue, Svelte) sin tener que readaptar el código que ejecuta la manipulación de la información.

Para el testing, nos apoyamos con Postman, de manera que no tuvimos que esperar a que el equipo de Front End terminara su parte para probar el código que se iba desarrollando.

DOCUMENTACION IN-VITRO BACKEND API

LOGIN.

INICIAR SESIÓN Y CERRAR SESIÓN

POST /login

En caso de recibir un email y un password en el body de la petición. La petición realizará la acción de Inicio de sesión

Si no recibe nada en el body. Por defecto la sesión se cerrará

Body de la petición Inicio de sesión

{
    "email": "newuser@gmail.com",
    "password": "123456"
}

En caso de que el inicio de sesión sea exitoso. La petición responderá con:

  • email: Email del usuario que inició sesión.
  • rol: rol del usuario dentro de la plataforma.

Login

En caso de no haber body. La sesión se cierra, respondiendo con:

  • message: mensaje de que la sesión fue cerrada.

log out

CREACION DE USUARIOS.

Peticiones HTTP

GET user/

LIST USERS

Un simple llamado GET a la ruta “/user” retornará un arreglo “users” con la información de todos los usuarios. (Sin incluir consultas y exámenes que pudiesen tener asignados). En formato JSON.

{
"User": [
    {
        "id": "MOORO25631EREW25",
        "UserData": {
            "lastName": "User",
            "name": "New",
            "numberContact": 555555,
            "email": "newuser@gmail.com",
            "rol": "Admin",
            "identityNumber": "MOORO25631EREW25",
            "userStatus": true,
            "documentType": "INE"
        }
    }
],
    "message": "Users listed correctly"
}
DONDE:

email, name, lastName, numberContact: son información personal del paciente.

documentType: Es el tipo de identificación personal con la que el usuario realizará su registro.

identityNumber: Es un número de identificación único presente en el "documentType" del usuario.

rol: Define la función que cumple el usuario dentro de la plataforma. Y sus permisos dentro de la misma.

userStatus: Define si el usuario se encuentra vigente dentro de la plataforma. Los usuarios NO DEBEN ser eliminados. Por lo que se tiene la opción de desactivarlos para denegar su acceso al sitio.

GET user/userId

GET ONE USER

Retorna la información completa de un usuario (es decir, incluye sus consultas y exámenes asignados al paciente).

{
"User": [
    {
        "id": "MOORO25631EREW25",
        "UserData": {
            "lastName": "User",
            "name": "New",
            "numberContact": 555555,
            "email": "newuser@gmail.com",
            "rol": "Admin",
            "identityNumber": "MOORO25631EREW25",
            "userStatus": true,
            "documentType": "INE"
        },
        "ClinicHistory": [],
        "Exams": []
    }
],
    "message": "Users listed correctly"
}

POST user/

Realiza la creación y autenticación de un usuario en Firebase Authentication y Firestore.

  • Durante la creación de un usuario ocurren múltiples procesos:
    • Autenticación en firestore con email y contraseña.
    • Nuevo Documento (con la información contenida en el body de la petición). dentro de la colección “user” en firestore. Tomando el número de identificación “identityNumber” como ID del documento.
    • Nuevo Documento dentro de la colección “clinicHistory” en firestore. Tomando el número de identificación “identityNumber” como ID del documento.
    • Nuevo Documento dentro de la colección “exam” en firestore. Tomando el número de identificación “identityNumber” como ID del documento.
Body de la petición.
{
    "email": "newuser@gmail.com",
    "name": "New",
    "lastName": "User",
    "documentType": "INE",
    "identityNumber": "MOORO25631EREW25",
    "numberContact": 555555,
    "rol": "Admin"
}

Al concluir, la API retorna el Email, el Número de Identidad y el status message de la petición.

{
    "email": "newuser@gmail.com",
    "identityNumber": "MOORO25631EREW25",
    "result": "User created correctly"
}

PUT user/userId

UPDATE USER

A partir de la información que se recibe en el body de la petición se ejecuta una acción.

HABILITAR Y DESHABILITAR USUARIOS

Habilita o deshabilita una cuenta dentro de firebase authentication. (Si una cuenta está deshabilitada no tendrá acceso a la aplicación).

Body de la petición.
{
    "email": "newuser@gmail.com",
    "disabled": true
}

Si el valor de disable es "true" entonces se deshabilita al usuario. Si es "false" Entonces se habilita nuevamente.

Este estatus también se verá reflejado en el perfil del usuario en firestore. cambiando la propiedad “userStatus”.

ACTUALIZA EMAIL

Actualiza el email de un usuario en firebase authentication y en su documento en firestore. Es necesario que el usuario envié su correo actual y su nuevo correo.

Body de la petición.
{
    "currentEmail": "newuser@gmail.com",
    "newEmail": "new@email.com"
}

ACTUALIZAR INFORMACIÓN DEL USUARIO

En caso de que se requiera actualizar alguno de los campos que conforman a la información personal del usuario. (name, lastName, numberContact). (Por el momento no es posible actualizar el rol y el número de identificación “identityNumber”).

Body de la petición.
{
    “name”: “New Name”,
    “lastName”: “New Last Name”,
    “numberContact”: 5584852325
}

CREACION DE MULTIPLES USUARIOS MEDIANTE ARCHIVO CSV.

POST CSV FILE

POST /uploadcsv

La creación de múltiples usuarios se hace mediante un archivo con extensión “.csv” con el siguiente formato, donde las columnas son los campos de cada usuario y en las filas se encuentran los valores de dichos campos.

name lastName documentType identityNumber email password numberContact rol
Nombres Apellidos CC/TI/DNI Numero de identificación Correo > a 6 digitos Telefono Rol

Ejemplo de como debe estar el archivo .CSV

CSV example

Este archivo csv debe ser enviado en formato “form-data”. Donde el Key tiene el valor de “usersCSV”.Y el archivo csv como value.

csv form-data

Por cada usuario dentro del archivo .csv. Se realizan los mismos procesos que en la creación de un usuario.

Como respuesta se obtiene el email de cada usuario y el status de su creación.

{
    "data": [
        {
            "email": "another@user.com",
            "result": "Successfully created"
        }
    ],
    "message": "users created correctly"
}

CREACION DE CONSULTAS.

CREAR CONSULTA

POST /consult/userId

En el body tendremos la “información de la consulta” que se define por:

details: Define toda la información relevante a consideración del médico que recaude a lo largo de la consulta.

Body de la Petición
{
    "details": "El paciente presenta dolor de estomago frecuente..."	
}

En caso de que la consulta se cree exitosamente. La petición responderá con:

  • userId: id del usuario al que se le asigno la consulta.
  • consultId: Id de la consulta que se acaba de crear.

Consult response

A continuación, al documento del historial clínico del usuario. se le creará un subDocumento dentro de una subcolección llamada “consults”que contendrá la información de la consulta.

Firestore 
        + |Collection|      |Document|       |Sub-Collection|      |Sub-Document|
        +
        + ClinicHistory-----UserDocument---------Consults----------consultDocument   

Visualmente En Firestore.

consults

Consults Firestore

ASIGNACION DE EXAMENES.

ASIGNAR EXÁMEN.

POST exam/userId

Dentro del body enviaremos la información que define al examen clínico:

  • Indications: Son las indicaciones que el médico le asigne al paciente
  • AditionalData: Información menos relevante que el médico considere añadir al examen (Puede ser enviado como null)
  • type: define el tipo de examen que el médico le esta asignando al paciente
Body de la petición.
{
    "indications": "Favor de acudir al área de exámenes clínico en ayunas de más de 6hrs",
    "aditionalData": "Seguir con el tratamiento asignado previamente",
    "type": "sangre"
}

En caso de que el examen se asigne correctamente. La petición responderá con:

  • userId: id del usuario al cual se le asigno el examen.
  • examId: id del examen que acaba de ser asignado al usuario.

Exam assigend

A continuación, al documento de los exámenes del usuario. se le creará un subDocumento dentro de una subcolección llamada “examsAssigned”que contendrá la información del examen que se acaba de asignar.

Firestore 
        + |Collection|      |Document|       |Sub-Collection|      |Sub-Document|
        +
        + Exam-----UserDocument---------examsAssigned----------ExamDocument   

Visualmente en Firestore.

ExamsAssigned Firestore

CARGA DE RESULTADOS.

POST RESULTS

POST /result/userId

Esa petición recibe dos valores en el form-data:

  • results → Archivo de los resultados de un examen en formato .pdf.
  • examId → Id del exámen al que se le están asignando los resultados.

Result form-data

Esta consulta retornará:

  • userId: Número de identificación (identityNumber) del usuario.
  • ExamId: El id del examen al cual le fueron asignados los resultados.
  • downloadURL: Es la url de descarga para el archivo .pdf

Result response

Al concluir este proceso el archivo estará almacenado en el servicio de Firebase Storage

storage

Y el status del examen en Firestore cambiará a true. Lo cual activará una Cloud Function Para enviar una notificación en tiempo real.