Jorge Armand Olivero
Geovanny Sneyder Paez Pabon
¿Cómo implementar anidamiento en GradQL para API eficaces?
La implementación de anidamiento en GradQL es una herramienta poderosa que eleva las capacidades de consulta al permitir un manejo más preciso y adaptable de la data. Esta técnica es especialmente útil cuando se trata de entidades relacionadas, como productos vinculados a categorías. Con este enfoque, podemos optimizar cómo solicitamos y entregamos la información desde el backend, ajustándola a las necesidades específicas de cada cliente o aplicación.
¿Cómo se define una relación en GradQL?
Para definir una relación entre entidades en GradQL, primero es esencial expresarla explícitamente en el esquema de tipos. Esto nos permite describir cómo las entidades interactúan y se relacionan entre sí.
Definición del tipo de categoría:
type Category { id: ID! name: String! image: String }
Relación de producto a categoría: Al agregar esta relación, determinamos cómo los tipos están interconectados.
type Product { id: ID! name: String! category: Category }
En este ejemplo, hemos añadido un nuevo tipo, Category, que tiene su propio ID, nombre e imagen. Luego, la relación entre Product y Category se establece agregando el tipo Category al tipo Product.
¿Por qué las consultas en GradQL son más eficientes?
El uso de GradQL permite solicitar dinámicamente solo los datos necesarios, lo cual es una ventaja significativa sobre las API REST tradicionales. En un REST API, por ejemplo, al realizar un request se podrían recibir todos los datos, incluso aquellos que no necesitamos. GradQL, por el contrario, ofrece una manera de hacer consultas más específicas.
Consulta simple de productos:
{ products { id name } }
Consulta con anidamiento de categoría:
{ products { id name category { id name } } }
La utilización de GradQL permite responder a las necesidades particulares del cliente. Por ejemplo, una aplicación móvil podría solicitar solo los datos estrictamente necesarios, reduciendo la cantidad de información transferida y optimizando tiempos de respuesta y uso de datos.
¿Cómo afecta GradQL diferentes aplicaciones cliente?
GradQL es especialmente eficaz para aplicaciones que interactúan con diversas plataformas, desde aplicaciones móviles hasta web y de escritorio. Las solicitudes de datos pueden personalizarse según el contexto de uso:
Optimización para móviles: Solicitan únicamente campos esenciales, como el nombre y la imagen del producto, reduciendo el payload y mejorando la eficiencia.
Funcionalidad web completa: Las aplicaciones web pueden aprovechar sus mayores capacidades de procesamiento y solicitar más datos, como precios adicionales y nombres de categorías.
Estas capacidades personalizables hacen de GradQL una herramienta flexible y eficiente para gestionar datos entre diferentes clientes, proporcionando justo la información necesaria para su propósito específico.
Con estas ventajas claras, la implementación de GradQL en sistemas de API modernos promete un uso más estratégico y efectivo de la data, resaltando el potencial de optimización que un backend bien diseñado puede proporcionar.
Jorge Armand Olivero
Geovanny Sneyder Paez Pabon
Andrés Esteban Rodríguez Jiménez
Enrique Ruvalcaba
Enrique Ruvalcaba
Daniel Enrique Noriega Chajón
John albert Rodríguez field
Y si en el servicio no se estableciera la relación de los productos con las categorías, es decir, que la consulta a la base de datos no realizara el join sql que realiza sequelize entre estas dos tablas a pesar de que están relacionadas , no se podria realizar los mismo pero desde la lógica del los resolver?
Creo que si se podria hacer en los resolvers utilizando el servicio de categories, pero haria doble consulta a la base de datos, creo que seria mejor una sola consulta donde retorne todas las relaciones y asi que con graphQl decidimos que datos queremos recibir.
Anidamiento
Para manejar el anidamiento en GraphQL, lo tenemos que expresar que existe esta relación desde el motor de GraphQL.
para hacer esto, vamos a crear un nuevo tipo en el esquema:
# expresamos una relación entre producto y categoria, añadiendola en su tipo type Product { id: ID! name: String! price: Float! description: String! image: String! createdAt: String! categoryId: ID! category: Category! } # creamos el tipo de la categoria type Category { id: ID! name: String! image: String! }
Si probamos realizar entonces la query obteniendo la categoría del producto:
{ products { id name category { name } } }
Veríamos que lo podemos hacer sin ningún problema. Esto es increíble porque expresar la relación de los productos se puede hacer solo definiéndola de manera explicita en el esquema, sin necesidad de que definamos los resolvers, esto debido a que GraphQL no se mete directamente con el backend, simplemente es un lenguaje de consulta, y esto es posible ya que ya tenemos definido en nuestro backend las relaciones en nuestros productos, y definiéndolas en el esquema, lo hacemos evidente a la hora de que GraphQL lo consulte.
Esto es muy útil para que desde el lado del cliente no tengamos demasiada información innecesaria, lo cual es un problema constante a la hora de usar REST API, pero con GraphQL podemos pedir solo la información que necesitamos y no toda la información.
Se queda cargando el video xd
Lo resolví desactivando la extensión Privacy Badger
Si recordamos clases anteriores, también podemos hacer anidamiento de una categoría y regresa todos los productos con esa categoría, ¿De qué manera lo hacemos? Bueno la forma en la que lo realice fue esta:
1 Creamos un archivo dentro de la carpeta de graphql que se llame category.resolvers.js, luego agregamos para mostrar una categoria por su ID y otro para obtener todas las categorias:
const CategoryService = require('./../services/category.service'); const service = new CategoryService(); const category = (_, { id }) => { return service.findOne(id); } const categories = (_, args) => { return service.find({}); } module.exports = { category, categories }
2.En el archivo de schema.graphql agregamos el type de Categorías:
type Category { id: ID! name: String! image: String! products: [Product!] }
type Query { hello: String! product(id: ID!): Product products: [Product!]! category(id: ID!): Category categories: [Category!]! }
const { categories, category } = require('./category.resolvers')
const resolvers = { Query: { hello: () => "Hello World", product, products, category, categories }, Mutation: { addProduct, updatedProduct, deletedProduct } }
query getCategory($categoryId: ID!) { resultados:category(id: $categoryId) { id name products { name } } }
Las variables tú te encargas de colocarlas.
query getAllCategories { categories { id name } }
Espero te sirva 💚
está caído este video?