Els tipus d'entrada (input types) en GraphQL són una manera de definir estructures de dades que es poden passar com a arguments a les consultes i mutacions. A diferència dels tipus de sortida (output types), que defineixen com es veuran les dades retornades, els tipus d'entrada defineixen com es veuran les dades que s'envien al servidor.

Conceptes Clau

  1. Definició de Tipus d'Entrada: Els tipus d'entrada es defineixen utilitzant la paraula clau input en l'esquema de GraphQL.
  2. Ús en Mutacions: Els tipus d'entrada són especialment útils en mutacions, on sovint es necessita passar estructures de dades complexes com arguments.
  3. Validació: Els tipus d'entrada permeten validar les dades d'entrada abans de processar-les, assegurant que compleixin amb l'estructura esperada.

Definició de Tipus d'Entrada

Els tipus d'entrada es defineixen de manera similar als tipus d'objecte, però utilitzant la paraula clau input. Aquí teniu un exemple bàsic:

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

En aquest exemple, UserInput és un tipus d'entrada que conté tres camps: name, email i age. Els camps name i email són obligatoris (indicat pel signe d'exclamació !), mentre que age és opcional.

Ús en Mutacions

Els tipus d'entrada són especialment útils en mutacions, on sovint es necessita passar estructures de dades complexes com arguments. Aquí teniu un exemple de com utilitzar un tipus d'entrada en una mutació:

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

En aquest exemple, la mutació createUser accepta un argument input de tipus UserInput i retorna un objecte de tipus User.

Exemple Pràctic

Vegem un exemple complet que inclou la definició d'un tipus d'entrada, una mutació que utilitza aquest tipus d'entrada i un resolver per a la mutació.

Esquema

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

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

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

type Query {
  users: [User]
}

Resolver

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

let users = [];

const resolvers = {
  Query: {
    users: () => users,
  },
  Mutation: {
    createUser: (_, { input }) => {
      const newUser = { id: uuidv4(), ...input };
      users.push(newUser);
      return newUser;
    },
  },
};

module.exports = resolvers;

Explicació del Codi

  1. Definició del Tipus d'Entrada: Hem definit un tipus d'entrada UserInput amb els camps name, email i age.
  2. Mutació createUser: La mutació createUser accepta un argument input de tipus UserInput i retorna un objecte de tipus User.
  3. Resolver createUser: El resolver per a la mutació createUser crea un nou usuari amb un ID únic, afegeix l'usuari a la llista users i retorna el nou usuari.

Exercici Pràctic

Exercici

Defineix un tipus d'entrada ProductInput amb els següents camps:

  • name: String!
  • price: Float!
  • inStock: Boolean

Crea una mutació addProduct que accepti un argument input de tipus ProductInput i retorni un objecte de tipus Product.

Solució

Esquema

type Product {
  id: ID!
  name: String!
  price: Float!
  inStock: Boolean
}

input ProductInput {
  name: String!
  price: Float!
  inStock: Boolean
}

type Mutation {
  addProduct(input: ProductInput!): Product
}

type Query {
  products: [Product]
}

Resolver

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

let products = [];

const resolvers = {
  Query: {
    products: () => products,
  },
  Mutation: {
    addProduct: (_, { input }) => {
      const newProduct = { id: uuidv4(), ...input };
      products.push(newProduct);
      return newProduct;
    },
  },
};

module.exports = resolvers;

Conclusió

Els tipus d'entrada en GraphQL són una eina poderosa per definir estructures de dades que es poden passar com a arguments a les consultes i mutacions. Permeten validar les dades d'entrada i assegurar que compleixin amb l'estructura esperada, facilitant així la gestió de dades complexes en les aplicacions GraphQL.

© Copyright 2024. Tots els drets reservats