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:
Ú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
- Defineix un enum
UserRoleamb els valorsADMIN,USERiGUEST. - Afegeix un camp
rolede tipusUserRoleal tipusUser. - Implementa una mutació
updateUserRoleque 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.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL
