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:
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
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
Mutation Type Extensions
Mutations handle data modifications across all business domains:
Authentication and user management
Business process workflows
Document and file uploads
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:
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
Authorized Query
Query with Error Handling
Complex Query
[ 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
Create User
Update with Validation
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:
. AddProjections () // Optimize DB queries based on requested fields
. AddFiltering () // Enable complex filtering on queries
. AddSorting () // Support multi-field sorting
Usage Examples
Projection Example
Filtering Example
Sorting Example
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:
. 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