Estos tendrían relaciones semánticas dentro del dominio o entre dominios. Y esencialmente se convertirían en los tipos de nuestro esquema de GraphQL, ¿verdad? Aún no hemos definido los métodos y eso es a lo que vamos a llegar a continuación.
La primera categoría de métodos que podemos tener son las consultas, ¿verdad? Y debido a que es una API de data, habrá algunas expectativas y convenciones comunes que podemos establecer, ¿verdad? ¿Estamos obteniendo un solo elemento? ¿Un solo modelo? ¿Una lista de modelos, paginando a través de ellos, ordenándolos, filtrándolos? Las agregaciones son especialmente importantes para las API de data, ¿verdad? Entonces, podemos comenzar a crear una convención que diga, una vez que tenemos un modelo de lectura, estos son los métodos comunes que podemos tener para leer esos modelos, ¿verdad? Y eso aborda el lado de las consultas de nuestra API.
Y ahora, cuando pensamos en el lado derecho de nuestra API, especialmente cuando pensamos en las mutaciones gráficas, ¿verdad? Tal vez también algunas consultas, cuando pensamos en las mutaciones gráficas, entonces la forma en que lo pensamos es que invocamos un comando. El comando hará algo, pero eventualmente devolverá una referencia a un modelo de lectura o a una lista de modelos de lectura, ¿verdad? Y eso nos da una forma de pensar en el diseño del lado derecho de nuestra API, especialmente en las mutaciones gráficas. Aunque, como dije, algunos comandos también podrían ser comandos de consulta. Pero es la misma idea, solo que la estamos visualizando en el contexto de múltiples dominios, ¿verdad?
Podríamos tener múltiples dominios, cada dominio tiene modelos, comandos, ¿verdad? Y usamos eso para crear nuestra API de GraphQL, ¿verdad? Entonces, en esta capa, en la capa de la API de GraphQL, podemos comenzar a centralizar parte de la infraestructura en la forma en que mapeamos estos modelos, los convertimos en tipos, en la forma en que creamos API de lectura comunes en estos dominios y en la forma en que invocamos ciertos comandos. Entonces, si podemos centralizar la infraestructura aquí, ¿verdad?, podemos aprovechar todos los beneficios que las personas obtienen de una API de GraphQL, podemos centralizar gran parte del esfuerzo que estamos poniendo en la construcción de la API. Y podemos enfocarnos más dentro de cada uno de esos dominios, podemos enfocarnos en el modelado, podemos enfocarnos en la lógica real que podría ejecutarse y afectar esos modelos, ¿verdad? Entonces, lo que vamos a explorar a continuación es un poco más en ese mapeo de modelos en las API, la API de lectura y la API de escritura un poco, solo para ver cómo podría verse eso. ¿Correcto? Entonces, obtengamos los modelos, cuando pensamos en modelos, lo más importante es poder mapear lo que queremos en el modelo que queremos exponer, los modelos que tenemos dentro de nuestro dominio, ¿verdad? Entonces, si tienes un dominio de tipo database, ¿verdad?, tenemos modelos físicos, estos modelos de data podrían ser modelos físicos, podrían ser tablas, ¿verdad? O modelos lógicos, donde los datos exactos en la tabla en realidad no se correlacionan con el modelo que quieres tener en la API, ¿verdad? Entonces, podrías tener un modelo físico o un modelo lógico. Pero básicamente se representan en un modelo gráfico que deseas al final del día. Si no es una database, sino más bien una fuente, podrías tener un modelo que proviene de un servicio de API, ¿verdad? Entonces, la capa de mapeo que tenemos en nuestra infraestructura gráfica, en la configuración del marco de código, lo que sea, debería ayudar a resolver este problema de mapeo para traer ciertos modelos de una de una fuente de datos de un dominio de data de la manera más fácil posible. Lo segundo que queremos hacer para asegurarnos de representar, ¿verdad?, que queremos agregar configuración o código alrededor, es asegurarnos de poder modelar las relaciones entre estos modelos que tenemos, ¿verdad? Y debido a que finalmente será JSON, la forma en que la relación se mostrará en la API será, ya sabes, tal vez tenga un objeto anidado agregado, por lo que tienes muchos para ser un objeto anidado, o quieres que sea una matriz anidada, ¿verdad? Incluso puedes tener campos que en realidad son una relación que proviene de un modelo diferente. ¿Y cada uno de esos modelos también debe tener herramientas de autorización que determinen qué campos son accesibles, y qué entidades de ese modelo son realmente legibles por un consumidor de API en particular, ¿verdad? Entonces, eso es, estas tres piezas de trabajo, mapeo, relaciones y autorizaciones, políticas, ¿verdad? Esta es la información mínima que necesitamos para llevar un modelo desde nuestro dominio de data, ¿verdad?, desde una de nuestras fuentes de data, ¿verdad?, a la API, ¿verdad?, y en este punto ahora tenemos una buena forma de pensar en los tipos de nuestro esquema de GraphQL y la forma en que esos tipos se mostrarán, ¿verdad? No todos los tipos, algunos de los tipos, ¿verdad?, la forma en que eso se mostrará. Entonces, esa es la primera pieza de la API de data que hemos resuelto, ¿verdad?
Y si miras este ejemplo que tengo aquí donde tengo el tipo artistas, ¿verdad? Estoy viendo que mi modelo de GraphQL es id y name. En el modelo físico, podría ser nombre y apellido, mi modelo de API, mi modelo de GraphQL me gustaría que se llame, ese es mi modelo de lectura, ¿verdad? Y luego podría tener álbumes, ¿verdad?, del artista como una etiqueta, el artista está firmado en la etiqueta, la etiqueta podría tener su propia información, ¿verdad? Entonces, eso es un objeto anidado. El artista tiene varios álbumes, por lo que sería una matriz anidada. Entonces, álbumes y etiqueta serían modelos diferentes y tendrían relaciones con el modelo de álbumes y con el modelo de etiqueta, ¿verdad? Y aquí es donde he hecho el mapeo del propio modelo de artista. Entonces, estamos viendo la parte de mapeo, estamos viendo relaciones, ¿verdad? Y luego, por supuesto, tenemos reglas de autorización que determinan qué campos podemos acceder realmente. Entonces, así es como se mostrará en el esquema de la API, lo cual es bueno porque ahora podemos ver qué modelos interconectados tenemos, ¿verdad? La segunda pieza es la lectura. Entonces, lo que queremos hacer es crear convenciones sobre cómo vamos a leer estos modelos, ¿verdad? Entonces, podemos crear convenciones sobre la paginación, el orden y el filtrado, ¿verdad? Queremos crear una convención sobre las agregaciones y luego queremos componerlas con una relación, queremos representar esas relaciones en nuestras consultas, ¿verdad? Entonces, queremos poder leer modelos a través de relaciones. También queremos asegurarnos de que nuestras consultas puedan representar agregaciones, ordenar o filtrar que puedan hacer referencia a objetos padre e hijo, ¿verdad? Entonces, echemos un vistazo rápido, como ejemplo, solo te mostraré cómo lo pensamos en Hasura y cómo se ve esa API de lectura, cómo se ve esa convención de lectura cuando lo pensamos en Hasura, la forma en que lo pensamos en Hasura, ¿verdad?
Tengo aquí una aplicación de demostración que se está ejecutando en mi máquina, y me he conectado a una fuente de Postgres y a una fuente de SQL Server. Estos son mis dos dominios de data. Y tengo un modelo llamado artistas, que tiene ID y nombre, ¿verdad? Entonces, estamos viendo esa información aquí. Echemos un vistazo a cómo se ve la API. Entonces, tengo paginación, ¿verdad? Paginación basada en desplazamiento o paginación basada en cursor. Tenemos una forma de filtrar cosas.
Comments