En GraphQL, los tipos de entrada (Input Types) son una característica esencial que permite a los desarrolladores definir estructuras de datos que pueden ser utilizadas como argumentos en las consultas y mutaciones. A diferencia de los tipos de salida, que definen cómo se estructuran los datos que se devuelven al cliente, los tipos de entrada definen cómo se estructuran los datos que se envían al servidor.

Conceptos Clave

  1. Definición de Tipos de Entrada: Los tipos de entrada se definen utilizando la palabra clave input en el esquema de GraphQL.
  2. Uso en Mutaciones: Los tipos de entrada son especialmente útiles en mutaciones, donde se necesita enviar datos complejos al servidor.
  3. Validación de Datos: Los tipos de entrada permiten validar la estructura de los datos antes de que lleguen a los resolvers.

Definición de un Tipo de Entrada

Para definir un tipo de entrada en GraphQL, se utiliza la palabra clave input seguida del nombre del tipo y las propiedades que contiene. A continuación, se muestra un ejemplo básico:

input UserInput {
  name: String!
  email: String!
  age: Int
}

En este ejemplo, UserInput es un tipo de entrada que contiene tres campos: name, email y age. Los campos name y email son obligatorios (indicados por !), mientras que age es opcional.

Uso de Tipos de Entrada en Mutaciones

Los tipos de entrada son particularmente útiles en mutaciones, donde se necesita enviar datos complejos al servidor. A continuación, se muestra cómo se puede utilizar el tipo de entrada UserInput en una mutación:

type Mutation {
  createUser(input: UserInput!): User
}

En este ejemplo, la mutación createUser acepta un argumento input de tipo UserInput. El argumento es obligatorio, como se indica con !.

Ejemplo Completo

A continuación, se muestra un ejemplo completo que incluye la definición del tipo de entrada, la mutación y el resolver correspondiente:

Definición del Esquema

# Definición del tipo de entrada
input UserInput {
  name: String!
  email: String!
  age: Int
}

# Definición del tipo de salida
type User {
  id: ID!
  name: String!
  email: String!
  age: Int
}

# Definición de la mutación
type Mutation {
  createUser(input: UserInput!): User
}

Implementación del Resolver

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

const resolvers = {
  Mutation: {
    createUser: (parent, args, context, info) => {
      const { input } = args;
      const newUser = {
        id: uuidv4(),
        ...input
      };
      // Aquí se puede agregar lógica para guardar el usuario en una base de datos
      return newUser;
    }
  }
};

module.exports = resolvers;

En este ejemplo, el resolver createUser recibe el argumento input, crea un nuevo usuario con un ID único y devuelve el usuario creado.

Ejercicio Práctico

Ejercicio

  1. Define un tipo de entrada ProductInput con los siguientes campos:

    • name (String, obligatorio)
    • price (Float, obligatorio)
    • description (String, opcional)
  2. Crea una mutación createProduct que acepte un argumento input de tipo ProductInput y devuelva un tipo Product con los siguientes campos:

    • id (ID, obligatorio)
    • name (String, obligatorio)
    • price (Float, obligatorio)
    • description (String, opcional)
  3. Implementa el resolver para la mutación createProduct.

Solución

Definición del Esquema

# Definición del tipo de entrada
input ProductInput {
  name: String!
  price: Float!
  description: String
}

# Definición del tipo de salida
type Product {
  id: ID!
  name: String!
  price: Float!
  description: String
}

# Definición de la mutación
type Mutation {
  createProduct(input: ProductInput!): Product
}

Implementación del Resolver

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

const resolvers = {
  Mutation: {
    createProduct: (parent, args, context, info) => {
      const { input } = args;
      const newProduct = {
        id: uuidv4(),
        ...input
      };
      // Aquí se puede agregar lógica para guardar el producto en una base de datos
      return newProduct;
    }
  }
};

module.exports = resolvers;

Conclusión

Los tipos de entrada en GraphQL son una herramienta poderosa para estructurar y validar los datos que se envían al servidor. Son especialmente útiles en mutaciones, donde se necesita enviar datos complejos. Al definir tipos de entrada, puedes asegurarte de que los datos recibidos por el servidor tengan la estructura correcta, lo que facilita la implementación de lógica de negocio y la integración con bases de datos.

En el siguiente módulo, exploraremos cómo trabajar con datos en GraphQL, incluyendo la conexión a bases de datos y estrategias de obtención de datos.

© Copyright 2024. Todos los derechos reservados