# Bases de datos modernas

La idea original era ampliar [esta entrada](https://blog.karlosencalada.dev/desarrollo-x), pero para el [segundo reto](https://github.com/webreactiva-devs/backend-de-la-suerte-2023#reto-2-o%C3%ADdo-cocina) del **Backend de la Suerte 2023** tuve que realizar algunas cosas adicionales y al final decidí crear una nueva entrada para esta mini saga.

### Ampliando la base de datos

Para cumplir el requerimiento cree varias tablas, al igual que la primera vez, lo hice desde la web de Xata. El editor es sencillo pero suficiente para lo que necesito.

![esquema de la base de datos](https://cdn.hashnode.com/res/hashnode/image/upload/v1679709140573/1af8017e-d5ef-489e-90ee-cf0aa99b6ef0.png align="center")

Para manejar las *ordenes* tal cual se especifica en el README del reto, me pareció conveniente utilizar el concepto de **objeto** dentro de una tabla. Lo intente desde el editor web pero no me funcionó (luego encontré el por qué en la documentación\*) así que opte por cargar el schema desde un .json 😵

> \*While the API supports the object type, the Web UI and CLI do not expose it as an option yet. There is still work in progress.

Lo primero fue instalar el [cliente](https://xata.io/docs/getting-started/installation) de xata, seguir los pasos para autenticarlo con la cuenta y ejecutar los comandos deseados. Para no perder la definición de las tablas creadas, primero un dump, agregar la definición de la tabla ordenes y luego un upload.

```powershell
xata schema dump
xata shema upload C:\coding\xata\CocinaZombie.json
```

Acá el schema completo

```json
{

  "tables": [
    {
      "name": "comanda",
      "columns": [
        {
          "name": "FechaHora",
          "type": "datetime",
          "defaultValue": "2023-03-09T12:00:00Z"
        }
      ]
    },
    {
      "name": "cocina",
      "columns": [
        {
          "name": "Limite",
          "type": "int",
          "defaultValue": "0"
        }
      ]
    },
    {
      "name": "menu",
      "columns": [
        {
          "name": "nombre",
          "type": "string"
        },
        {
          "name": "detalle",
          "type": "text"
        },
        {
          "name": "especial",
          "type": "bool"
        }
      ]
    },

    {
      "name": "order",
      "columns": [
        {
          "name": "table",
          "type": "int"
        },
        {
          "name": "createdAt",
          "type": "datetime"
        },
		{
          "name": "dishes",
          "type": "object",
          "columns": [
            {
              "name": "name",
              "type": "string"
            },
            {
              "name": "quantity",
              "type": "int"
            }
          ]
        }
      ]
    }
  ]
}
```

Primera vez que trabajo con una base de datos en esta modalidad, me parece casi magia y sobre todo al leer un poco más la documentación, se me ocurren varias cosas que podría hacer con la posibilidad de crear nuevas columnas en una tabla utilizando el API REST 🤯

### Querys con APIs

Primero, unas pruebas con Insomnia para tener claro los endpoints y métodos. Ahí me di cuenta que definir *dishes* como objeto no me sirve, ya que solo permite un elemento. Entonces veo dos opciones:

* Utilizar un campo texto y almacenar la colección de platos en formato json
    
* Crear una tabla subordinada
    

En un desarrollo de los que estoy acostumbrado me iría por la segunda opción sin pensarlo, pero como la idea del reto es probar cosas nuevas me decidí por la primera.

Así que eliminé las dos columnas **dishes.name** y **dishes.quantity**, y las reemplacé por un campo texto **dishes**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1679712947091/83292954-5bc1-4ad9-9f4b-5539f52bcbda.png align="center")

### Un poco de LowCode

Ya con las tablas listas, hay que utilizarlas en la aplicación. Primero pensé en modificar el mismo web panel del reto 1 ([ver acá](https://cocina-zombie.karlosencalada.dev/comandas.aspx)), pero al final terminé creando uno nuevo con:

* un botón para crear nueva orden
    
* una grilla con el listado de las órdenes creadas
    
* un popup para ver el menú y crear la orden
    

El resultado se lo puede ver [aquí](https://cocina-zombie.karlosencalada.dev/gestionordenes.aspx).

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1679794284134/11ddf4e0-52fc-4336-8254-2acdeb7ad66e.png align="center")

Un detalle que descubrí al hacer el deploy, es que si se hace el push desde línea de comandos a un repositorio que no existe da error, pero si se lo hace desde Docker Desktop se crea el repositorio. [Acá](https://hub.docker.com/r/karlos7/backend-de-la-suerte-2023) el repositorio con las imágenes.

Nota de color, el menú 'zombie' es una muestra de la gastronomía ecuatoriana 😁

![listado de platos típicos de la cocina ecuatoriana](https://cdn.hashnode.com/res/hashnode/image/upload/v1679712094592/f2985b72-71f8-4a16-b17f-63ae3c36acc2.png align="center")
