Creación de productos con mutations e inputs en GraphQL

Clase 13 de 24Curso de GraphQL con Node.js

Resumen

¿Qué es una mutation en GraphQL?

Las mutations en GraphQL son un concepto clave para alterar o manipular datos en una base de datos. A diferencia de las queries, que sólo buscan información, las mutations permiten crear, actualizar o eliminar datos. Este proceso es fundamental en aplicaciones que requieren persistencia y manejo dinámico de datos, como en el caso de crear productos que se almacenan en una base de datos de Postgres.

¿Cómo se define una mutation?

Para definir una mutation, iniciamos en el esquema de GraphQL declarando un nuevo type llamado mutation, que sigue la misma estructura que query. A través de funciones, se especifican operaciones, como la de agregarProducto, que puede recibir argumentos y devolver un producto. Esto es crucial para asegurar que las operaciones de escritura en la base de datos sean adecuadas y se refleje la estructura deseada.

¿Qué son los inputs en GraphQL?

Los inputs nos permiten organizar múltiples argumentos de manera más clara y manejable, especialmente cuando un método requiere varias entradas. Estos inputs se definen utilizando el sistema de tipos de GraphQL con la palabra reservada input. En el contexto de agregar un producto, agrupa el nombre, precio, descripción e imagen del producto. Esta agrupación facilita la lectura y evita la confusión en escenarios con muchos parámetros.

input CreateProductInput {
  nombre: String!
  precio: Int!
  descripción: String
  imagen: String
  categoríaId: ID!
}

Implementación de una mutation: agregar un producto

¿Cómo conectar el input con la mutation?

Para que la función de agregarProducto funcione correctamente, se conecta el input definido como CreateProductInput al campo de la mutation, asegurando que cada dato necesario esté presente antes de ejecutar una acción en la base de datos.

Aplicación de lógica en la función de mutation

Para implementar la lógica de agregar un producto, se utiliza una función asíncrona que recibe el input, que luego se utiliza para crear un nuevo producto a través del servicio correspondiente.

async function agregarProducto(_, { input }) {
  const nuevoProducto = await productService.create(input);
  return nuevoProducto;
}

Esta función se añade a la capa de servicios y se exporta desde el índice de resolvers, permitiendo su integración en el esquema general de GraphQL y asegurando que pueda invocarse en el backend al momento de realizar una operación de mutation.

Pruebas de mutation en el GraphQL Playground

¿Cómo realizar pruebas en el Playground?

El GraphQL Playground permite interactuar y probar las mutations y queries definidas. Para iniciar una mutation, se utiliza la palabra reservada mutation seguida por la operación deseada.

mutation {
  agregarProducto(input: {
    nombre: "Nuevo Producto",
    precio: 100,
    descripción: "Descripción del producto",
    imagen: "url_de_imagen",
    categoríaId: "1"
  }) {
    id
    nombre
    descripción
  }
}

A través del Playground, es posible visualizar los resultados de estas operaciones, asegurando que la lógica y funcionalidad se desempeñan como se espera.

Consideraciones al implementar mutations

¿Cuál es el reto principal?

Uno de los retos al implementar una mutation es manejar adecuadamente los errores y las validaciones para garantizar que los datos cumplan con las expectativas y estructura definidas, evitando posibles inconsistencias o fallos en el sistema de base de datos.

La clave para un manejo eficiente de datos es entender los roles de mutations e inputs, y cómo pueden integrarse para lograr aplicaciones robustas. ¡Continúa explorando y desarrollando tus habilidades en GraphQL para alcanzar el dominio total en desarrollo backend!