En GraphQL, las mutaciones son operaciones que permiten modificar datos en el servidor. A diferencia de las consultas (queries), que solo leen datos, las mutaciones pueden crear, actualizar o eliminar datos. Este módulo te enseñará cómo definir y utilizar mutaciones en GraphQL.

Contenido

Definición de Mutaciones

Las mutaciones en GraphQL se definen en el esquema de la misma manera que las consultas, pero se agrupan bajo el tipo Mutation. Cada campo en el tipo Mutation representa una operación que puede modificar el estado del servidor.

Ejemplo de Definición de Mutación

type Mutation {
  createUser(name: String!, email: String!): User
}

En este ejemplo, createUser es una mutación que toma dos argumentos (name y email) y devuelve un objeto de tipo User.

Sintaxis de Mutaciones

La sintaxis para ejecutar una mutación es similar a la de una consulta, pero se utiliza la palabra clave mutation en lugar de query.

Ejemplo de Sintaxis de Mutación

mutation {
  createUser(name: "John Doe", email: "[email protected]") {
    id
    name
    email
  }
}

En este ejemplo, estamos ejecutando la mutación createUser y solicitando los campos id, name y email del usuario creado.

Ejemplo Práctico: Crear un Usuario

Vamos a implementar una mutación para crear un usuario en un servidor GraphQL.

Paso 1: Definir el Esquema

type User {
  id: ID!
  name: String!
  email: String!
}

type Mutation {
  createUser(name: String!, email: String!): User
}

Paso 2: Implementar el Resolver

const { v4: uuidv4 } = require('uuid');

const resolvers = {
  Mutation: {
    createUser: (parent, args, context, info) => {
      const newUser = {
        id: uuidv4(),
        name: args.name,
        email: args.email,
      };
      // Aquí se puede agregar el nuevo usuario a una base de datos o a una lista en memoria
      return newUser;
    },
  },
};

Paso 3: Ejecutar la Mutación

Utiliza una herramienta como GraphiQL o Apollo Playground para ejecutar la siguiente mutación:

mutation {
  createUser(name: "Jane Doe", email: "[email protected]") {
    id
    name
    email
  }
}

Ejercicio Práctico

Ejercicio: Implementar una Mutación para Actualizar un Usuario

  1. Definir el Esquema: Añade una mutación updateUser que tome id, name y email como argumentos y devuelva un objeto User.

  2. Implementar el Resolver: Escribe el resolver para updateUser que actualice un usuario existente.

  3. Probar la Mutación: Utiliza GraphiQL o Apollo Playground para probar la mutación updateUser.

Solución

Paso 1: Definir el Esquema

type Mutation {
  createUser(name: String!, email: String!): User
  updateUser(id: ID!, name: String, email: String): User
}

Paso 2: Implementar el Resolver

const users = []; // Lista en memoria para almacenar usuarios

const resolvers = {
  Mutation: {
    createUser: (parent, args, context, info) => {
      const newUser = {
        id: uuidv4(),
        name: args.name,
        email: args.email,
      };
      users.push(newUser);
      return newUser;
    },
    updateUser: (parent, args, context, info) => {
      const user = users.find(user => user.id === args.id);
      if (!user) {
        throw new Error('User not found');
      }
      if (args.name) {
        user.name = args.name;
      }
      if (args.email) {
        user.email = args.email;
      }
      return user;
    },
  },
};

Paso 3: Probar la Mutación

mutation {
  updateUser(id: "some-uuid", name: "John Smith", email: "[email protected]") {
    id
    name
    email
  }
}

Errores Comunes y Consejos

  1. No manejar errores: Asegúrate de manejar errores adecuadamente en tus resolvers.
  2. No validar entradas: Valida los datos de entrada para evitar inconsistencias en la base de datos.
  3. No actualizar el estado del cliente: Si estás utilizando un cliente como Apollo, asegúrate de actualizar el estado del cliente después de una mutación.

Conclusión

En esta sección, hemos aprendido qué son las mutaciones en GraphQL, cómo definirlas y cómo implementarlas en un servidor GraphQL. También hemos visto un ejemplo práctico y un ejercicio para reforzar los conceptos aprendidos. En el siguiente módulo, exploraremos los resolvers en mayor detalle.

© Copyright 2024. Todos los derechos reservados