es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El tipo de entrada de mutación de HotChocolate utiliza int en lugar de ID.

Soy nuevo en HotChocolate y GraphQL en general, y estoy tratando de entender cómo habilitar el soporte de Nodos y/o Relay para mi API de GraphQL. Actualmente estoy usando HotChocolate v12.

Contexto:
Estoy tratando de crear una mutación que actualice una entidad (en este ejemplo, Cliente). Estoy utilizando el enfoque de código primero y tengo lo siguiente:

  1. Se define una clase/registo de entrada de la siguiente manera:
public record UpdateClientInput([ID(nameof(Client))] int Id, string Code, string Name, string Subdomain);
  1. La función de mutación que devuelve la clase de carga:
[UseAppDbContext]
public async Task<UpdateClientPayload> UpdateClientAsync(UpdateClientInput input, [ScopedService] AppDbContext context)
{
    var client = await context.Set<Client>().FirstOrDefaultAsync(x => x.Id == input.Id);

    // recortado por brevedad

    return new UpdateClientPayload(client);
}
  1. He habilitado el soporte de Nodos agregando lo siguiente en la configuración de los servicios:
builder.Services
    .AddGraphQLServer()
    .AddQueryType(d => d.Name("Query"))
    .AddMutationType(d => d.Name("Mutation"))
    // se eliminaron otros para ser breves
    .AddGlobalObjectIdentification()
    .AddQueryFieldToMutationPayloads();

Sin embargo, cuando navego por la API usando Banana Cake Pop, el objeto UpdateClientInput en la definición del esquema todavía utiliza int en lugar de ID! (ver captura de pantalla a continuación). Entonces, el cliente GraphQL que estoy usando (Strawberry Shake) genera el objeto de entrada que no utiliza el tipo ID!. ¿Me estoy perdiendo algo aquí?

Screenshot

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para habilitar el soporte para Nodos y/o Relay en tu API de GraphQL utilizando HotChocolate v12, necesitarás realizar algunas configuraciones adicionales.

    En primer lugar, deberás agregar el método UsePaging() para configurar el soporte de paginación para tu API. Esto es necesario para cumplir con las especificaciones de Relay.

    En segundo lugar, puedes agregar AddGlobalObjectIdentification() para habilitar los Nodos proporcionando IDs globalmente únicos para tus entidades. Esto permitirá una consulta eficiente de tus datos y cumplimiento de las especificaciones de Relay.

    Por último, para asegurar que el código de cliente generado por Strawberry Shake utilice el tipo ID! para los IDs de las entidades, deberás agregar AddQueryFieldToMutationPayloads() a la configuración de tus servicios. Esto garantiza que el campo de consulta node se agregue automáticamente a todos los payloads de mutaciones, permitiendo el uso del tipo ID! para identificar entidades en los tipos de entrada.

    La configuración actualizada de tus servicios se vería así:

    builder.Services
        .AddGraphQLServer()
            .AddQueryType(d => d.Name("Query"))
            .AddMutationType(d => d.Name("Mutation"))
            .UsePaging()
            .AddGlobalObjectIdentification()
            .AddQueryFieldToMutationPayloads();
    

    Con estas configuraciones en su lugar, tu objeto UpdateClientInput debería utilizar ahora el tipo ID! en la definición del esquema, permitiendo el uso de IDs de entidades compatibles con Relay.

Comments are closed.