Els enums (enumeracions) són un tipus especial de dades en GraphQL que permeten definir un conjunt limitat de valors possibles per a un camp. Són útils quan es vol restringir els valors que un camp pot prendre, assegurant així la integritat de les dades i facilitant la validació.

Conceptes Clau

  • Definició d'Enums: Els enums es defineixen en l'esquema de GraphQL amb el tipus enum.
  • Valors d'Enums: Cada enum té un conjunt de valors literals que són els únics valors que el camp pot prendre.
  • Ús d'Enums: Els enums es poden utilitzar en qualsevol lloc on es pugui utilitzar un tipus escalar, com en els tipus d'entrada, els tipus de sortida, etc.

Definició d'Enums

Per definir un enum en GraphQL, utilitzem la paraula clau enum seguida del nom de l'enum i el conjunt de valors literals que pot prendre. A continuació es mostra un exemple de definició d'un enum per representar els estats d'una comanda:

enum OrderStatus {
  PENDING
  SHIPPED
  DELIVERED
  CANCELLED
}

Ús d'Enums en l'Esquema

Els enums es poden utilitzar en els tipus d'entrada i sortida de l'esquema. A continuació es mostra un exemple d'ús de l'enum OrderStatus en un tipus de sortida Order i en un tipus d'entrada UpdateOrderStatusInput:

type Order {
  id: ID!
  status: OrderStatus!
  items: [OrderItem!]!
}

input UpdateOrderStatusInput {
  id: ID!
  status: OrderStatus!
}

type Mutation {
  updateOrderStatus(input: UpdateOrderStatusInput!): Order!
}

Exemple Pràctic

Suposem que tenim un servidor GraphQL configurat i volem implementar la mutació updateOrderStatus. A continuació es mostra com es podria implementar el resolver per aquesta mutació en JavaScript:

const { ApolloServer, gql } = require('apollo-server');

// Definició de l'esquema
const typeDefs = gql`
  enum OrderStatus {
    PENDING
    SHIPPED
    DELIVERED
    CANCELLED
  }

  type Order {
    id: ID!
    status: OrderStatus!
    items: [OrderItem!]!
  }

  input UpdateOrderStatusInput {
    id: ID!
    status: OrderStatus!
  }

  type Mutation {
    updateOrderStatus(input: UpdateOrderStatusInput!): Order!
  }

  type OrderItem {
    id: ID!
    name: String!
    quantity: Int!
  }
`;

// Dades simulades
let orders = [
  { id: '1', status: 'PENDING', items: [{ id: '1', name: 'Item 1', quantity: 2 }] },
  { id: '2', status: 'SHIPPED', items: [{ id: '2', name: 'Item 2', quantity: 1 }] },
];

// Implementació dels resolvers
const resolvers = {
  Mutation: {
    updateOrderStatus: (_, { input }) => {
      const order = orders.find(order => order.id === input.id);
      if (!order) {
        throw new Error('Order not found');
      }
      order.status = input.status;
      return order;
    },
  },
};

// Configuració del servidor Apollo
const server = new ApolloServer({ typeDefs, resolvers });

// Inici del servidor
server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

Exercici Pràctic

Exercici

  1. Defineix un enum UserRole amb els valors ADMIN, USER i GUEST.
  2. Afegeix un camp role de tipus UserRole al tipus User.
  3. Implementa una mutació updateUserRole que permeti actualitzar el rol d'un usuari.

Solució

enum UserRole {
  ADMIN
  USER
  GUEST
}

type User {
  id: ID!
  name: String!
  role: UserRole!
}

input UpdateUserRoleInput {
  id: ID!
  role: UserRole!
}

type Mutation {
  updateUserRole(input: UpdateUserRoleInput!): User!
}
const { ApolloServer, gql } = require('apollo-server');

// Definició de l'esquema
const typeDefs = gql`
  enum UserRole {
    ADMIN
    USER
    GUEST
  }

  type User {
    id: ID!
    name: String!
    role: UserRole!
  }

  input UpdateUserRoleInput {
    id: ID!
    role: UserRole!
  }

  type Mutation {
    updateUserRole(input: UpdateUserRoleInput!): User!
  }
`;

// Dades simulades
let users = [
  { id: '1', name: 'Alice', role: 'USER' },
  { id: '2', name: 'Bob', role: 'ADMIN' },
];

// Implementació dels resolvers
const resolvers = {
  Mutation: {
    updateUserRole: (_, { input }) => {
      const user = users.find(user => user.id === input.id);
      if (!user) {
        throw new Error('User not found');
      }
      user.role = input.role;
      return user;
    },
  },
};

// Configuració del servidor Apollo
const server = new ApolloServer({ typeDefs, resolvers });

// Inici del servidor
server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

Resum

En aquesta secció, hem après què són els enums en GraphQL, com es defineixen i com s'utilitzen en l'esquema. També hem vist un exemple pràctic d'implementació d'una mutació que utilitza enums i hem realitzat un exercici per reforçar els conceptes apresos. Els enums són una eina poderosa per assegurar la integritat de les dades i facilitar la validació en les nostres aplicacions GraphQL.

© Copyright 2024. Tots els drets reservats