in src/Service.GraphQLBuilder/Queries/QueryBuilder.cs [51:114]
public static DocumentNode Build(
DocumentNode root,
Dictionary<string, DatabaseType> databaseTypes,
RuntimeEntities entities,
Dictionary<string, InputObjectTypeDefinitionNode> inputTypes,
Dictionary<string, EntityMetadata>? entityPermissionsMap = null,
Dictionary<string, DatabaseObject>? dbObjects = null,
bool _isAggregationEnabled = false
)
{
List<FieldDefinitionNode> queryFields = new();
List<ObjectTypeDefinitionNode> returnTypes = new();
foreach (IDefinitionNode definition in root.Definitions)
{
if (definition is ObjectTypeDefinitionNode objectTypeDefinitionNode && IsModelType(objectTypeDefinitionNode))
{
NameNode name = objectTypeDefinitionNode.Name;
string entityName = ObjectTypeToEntityName(objectTypeDefinitionNode);
Entity entity = entities[entityName];
if (entity.Source.Type is EntitySourceType.StoredProcedure)
{
// Check runtime configuration of the stored procedure entity to check that the GraphQL operation type was overridden to 'query' from the default 'mutation.'
bool isSPDefinedAsQuery = entity.GraphQL.Operation is GraphQLOperation.Query;
IEnumerable<string> rolesAllowedForExecute = IAuthorizationResolver.GetRolesForOperation(entityName, operation: EntityActionOperation.Execute, entityPermissionsMap);
if (isSPDefinedAsQuery && rolesAllowedForExecute.Any())
{
if (dbObjects is not null && dbObjects.TryGetValue(entityName, out DatabaseObject? dbObject) && dbObject is not null)
{
queryFields.Add(GraphQLStoredProcedureBuilder.GenerateStoredProcedureSchema(name, entity, dbObject, rolesAllowedForExecute));
}
}
}
else
{
IEnumerable<string> rolesAllowedForRead = IAuthorizationResolver.GetRolesForOperation(entityName, operation: EntityActionOperation.Read, entityPermissionsMap);
bool isAggregationEnabledForEntity = _isAggregationEnabled && AggregationEnabledDatabaseTypes.Contains(databaseTypes[entityName]);
ObjectTypeDefinitionNode paginationReturnType = GenerateReturnType(name, isAggregationEnabledForEntity);
if (rolesAllowedForRead.Any())
{
queryFields.Add(GenerateGetAllQuery(objectTypeDefinitionNode, name, paginationReturnType, inputTypes, entity, rolesAllowedForRead));
queryFields.Add(GenerateByPKQuery(objectTypeDefinitionNode, name, databaseTypes[entityName], entity, rolesAllowedForRead));
}
if (paginationReturnType is not null)
{
returnTypes.Add(paginationReturnType);
}
}
}
}
List<IDefinitionNode> definitionNodes = new()
{
new ObjectTypeDefinitionNode(location: null, new NameNode("Query"), description: null, new List<DirectiveNode>(), new List<NamedTypeNode>(), queryFields),
};
definitionNodes.AddRange(returnTypes);
return new(definitionNodes);
}