Skip to main content

Introduction

Satélite API uses HotChocolate, a powerful .NET GraphQL server implementation, to provide a flexible and efficient API layer. This GraphQL implementation enables clients to request exactly the data they need, reducing over-fetching and improving performance.

GraphQL Server Configuration

The GraphQL server is configured in Program.cs:382-518 with comprehensive features:
Program.cs
builder.Services
    .AddGraphQLServer()
    .AddAuthorization()
    .AddQueryType<Query>()
        .AddType<CatalogoMaterialesHomologadosQuery>()
        .AddType<PlanComercialQuery>()
        .AddType<BitCuResponsabilidadQuery>()
        .AddType<ClientesQuery>()
        .AddType<RegistroConsumoQuery>()
        .AddType<DonacionQuery>()
        .AddType<MemoriaSostenibilidadQuery>()
    .AddMutationType<Mutation>()
        .AddType<PlanComercialMutation>()
        .AddType<AuthenticationMutation>()
        .AddType<DonacionMutation>()
        .AddType<MemoriaSostenibilidadMutation>()
    .AddProjections()
    .AddFiltering()
    .AddSorting()
    .SetRequestOptions(_ => new HotChocolate.Execution.Options.RequestExecutorOptions
    {
        ExecutionTimeout = TimeSpan.FromMinutes(10)
    });

Key Features

1

Query Type Extensions

Multiple query types are registered to organize different domains:
  • Catalog Queries: Materials, products, and clients
  • Business Process Queries: Plan Comercial, BitacoraCumplimiento
  • Consumption & Donations: RegistroConsumo, Donaciones
  • Sustainability: MemoriaSostenibilidad
2

Mutation Type Extensions

Mutations handle data modifications across all business domains:
  • Authentication and user management
  • Business process workflows
  • Document and file uploads
3

Advanced Features

  • Projections: Optimize database queries based on requested fields
  • Filtering: Enable complex data filtering capabilities
  • Sorting: Support for multi-field sorting
  • Extended Timeout: 10-minute execution timeout for complex operations

Query Structure

The main Query class is defined in Schema/Query/Query.cs:134-428. It uses constructor-based dependency injection to access repositories:
Schema/Query/Query.cs
public class Query
{
    private readonly UsuarioRepository _userRepository;
    private readonly RolesRepository _rolesRepository;
    private readonly ProductoRepository _productoRepository;
    private readonly ClientesRepository _clienteRepository;
    private readonly IndSupRequerimientoRepository _indSupRequerimientoRepository;
    // ... many more repositories

    public Query(
        UsuarioRepository userRepository,
        RolesRepository rolesRepository,
        ProductoRepository productoRepository,
        // ... other dependencies
    )
    {
        _userRepository = userRepository;
        _rolesRepository = rolesRepository;
        _productoRepository = productoRepository;
        // ... initialize other repositories
    }
}

Example Query Methods

[Authorize]
public async Task<IEnumerable<UsuarioDTO>> GetUsuarios()
{
    return await _userRepository.GetAll();
}

Mutation Structure

Mutations follow a similar pattern in Schema/Mutation/Mutation.cs:123-398:
Schema/Mutation/Mutation.cs
public class Mutation
{
    private readonly UsuarioRepository _usuarioRepository;
    private readonly ProductoRepository _productoRepository;
    private readonly ReembolsoRepository _reembolsoRepository;
    // ... many more repositories

    public Mutation(
        UsuarioRepository usuarioRepository,
        ProductoRepository productoRepository,
        // ... other dependencies
    )
    {
        _usuarioRepository = usuarioRepository;
        _productoRepository = productoRepository;
        // ... initialize repositories
    }
}

Example Mutation Methods

public async Task<UsuarioDTO> CreateUser(UsuarioDTO user)
{
    UsuarioDTO usuario = new UsuarioDTO()
    {
        Nombre = user.Nombre,
        Email = user.Email,
        Activo = true,
        IdRol = 6,
        CreatedAt = DateTime.UtcNow.AddHours(-5),
        UpdatedAt = DateTime.UtcNow.AddHours(-5),
    };
    usuario = await _usuarioRepository.Create(usuario);
    return usuario;
}

Projections, Filtering, and Sorting

Configured in Program.cs:512-514, these features enable powerful data querying:
Program.cs
.AddProjections()  // Optimize DB queries based on requested fields
.AddFiltering()     // Enable complex filtering on queries
.AddSorting()       // Support multi-field sorting

Usage Examples

query {
  usuarios {
    id
    nombre
    email
    # Only these fields are retrieved from database
  }
}
Performance Tip: Projections automatically optimize your database queries by only selecting the fields that are requested in the GraphQL query. This significantly reduces data transfer and improves response times.

Authorization

GraphQL queries and mutations can be protected with the [Authorize] attribute:
[Authorize]
public async Task<IEnumerable<UsuarioDTO>> GetUsuarios()
{
    return await _userRepository.GetAll();
}
Authorization is configured with JWT Bearer authentication in Program.cs:319-354.

Request Timeout

Complex operations are supported with an extended execution timeout:
Program.cs
.SetRequestOptions(_ => new HotChocolate.Execution.Options.RequestExecutorOptions
{
    ExecutionTimeout = TimeSpan.FromMinutes(10)
});
The 10-minute timeout is designed for complex batch operations and reporting queries. Most standard queries should complete in seconds. If queries consistently approach this timeout, consider optimization strategies.

Next Steps

Architecture

Learn about the layered architecture

Error Handling

Understand error handling patterns

Build docs developers (and LLMs) love