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
UserRole
amb els valorsADMIN
,USER
iGUEST
. - Afegeix un camp
role
de tipusUserRole
al tipusUser
. - 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.
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