in src/Core/Configurations/RuntimeConfigValidator.cs [449:506]
public void ValidateEntitiesDoNotGenerateDuplicateQueriesOrMutation(DatabaseType databaseType, RuntimeEntities entityCollection)
{
HashSet<string> graphQLOperationNames = new();
foreach ((string entityName, Entity entity) in entityCollection)
{
if (!entity.GraphQL.Enabled)
{
continue;
}
bool containsDuplicateOperationNames = false;
if (entity.Source.Type is EntitySourceType.StoredProcedure)
{
// For Stored Procedures a single query/mutation is generated.
string storedProcedureQueryName = GraphQLNaming.GenerateStoredProcedureGraphQLFieldName(entityName, entity);
if (!graphQLOperationNames.Add(storedProcedureQueryName))
{
containsDuplicateOperationNames = true;
}
}
else
{
// For entities (table/view) that have graphQL exposed, two queries, three mutations for Relational databases (e.g. MYSQL, MSSQL etc.)
// and four mutations for CosmosDb_NoSQL would be generated.
// Primary Key Query: For fetching an item using its primary key.
// List Query: To fetch a paginated list of items.
// Query names for both these queries are determined.
string pkQueryName = GraphQLNaming.GenerateByPKQueryName(entityName, entity);
string listQueryName = GraphQLNaming.GenerateListQueryName(entityName, entity);
// Mutations names for the exposed entities are determined.
string createMutationName = $"create{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
string updateMutationName = $"update{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
string deleteMutationName = $"delete{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
string patchMutationName = $"patch{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
if (!graphQLOperationNames.Add(pkQueryName)
|| !graphQLOperationNames.Add(listQueryName)
|| !graphQLOperationNames.Add(createMutationName)
|| !graphQLOperationNames.Add(updateMutationName)
|| !graphQLOperationNames.Add(deleteMutationName)
|| ((databaseType is DatabaseType.CosmosDB_NoSQL) && !graphQLOperationNames.Add(patchMutationName)))
{
containsDuplicateOperationNames = true;
}
}
if (containsDuplicateOperationNames)
{
HandleOrRecordException(new DataApiBuilderException(
message: $"Entity {entityName} generates queries/mutation that already exist",
statusCode: HttpStatusCode.ServiceUnavailable,
subStatusCode: DataApiBuilderException.SubStatusCodes.ConfigValidationError));
}
}
}