in data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLProtoSchemaMapper.java [66:125]
public void onDomainModelRegisteredEvent(@Observes DomainModelRegisteredEvent event) {
LOGGER.debug("Received new domain event: {}", event);
GraphQLSchema schema = schemaManager.getGraphQLSchema();
schemaManager.transform(builder -> {
builder.clearAdditionalTypes();
Map<String, DomainDescriptor> map = event.getAdditionalTypes().stream().collect(toMap(desc -> getTypeName(desc.getTypeName()), desc -> desc));
Map<String, GraphQLType> additionalTypes = new ConcurrentHashMap<>();
GraphQLObjectType rootType = new GraphQLObjectTypeMapper(schema, additionalTypes, map).apply(event.getDomainDescriptor());
additionalTypes.put(rootType.getName(), rootType);
GraphQLInputObjectType whereArgumentType = new GraphQLInputObjectTypeMapper(schema, additionalTypes).apply(rootType);
if (!whereArgumentType.getFields().isEmpty()) {
additionalTypes.put(whereArgumentType.getName(), whereArgumentType);
}
GraphQLInputObjectType orderByType = new GraphQLOrderByTypeMapper(schema, additionalTypes).apply(rootType);
if (orderByType != null) {
additionalTypes.put(orderByType.getName(), orderByType);
}
LOGGER.debug("New GraphQL types: {}", additionalTypes.keySet());
Set<GraphQLType> newTypes = additionalTypes.entrySet().stream().map(entry -> entry.getValue()).collect(toSet());
newTypes.addAll(schema.getAdditionalTypes().stream().filter(type -> !additionalTypes.containsKey(((GraphQLNamedType) type).getName())).collect(toSet()));
builder.additionalTypes(newTypes);
GraphQLObjectType query = schema.getQueryType();
//Should use extend instead?
query = query.transform(qBuilder -> {
if (qBuilder.hasField(rootType.getName())) {
qBuilder.clearFields();
qBuilder.fields(schema.getQueryType().getFieldDefinitions().stream().filter(field -> !rootType.getName().equals(field.getName())).collect(toList()));
}
List<GraphQLArgument> arguments = new ArrayList<>();
if (!whereArgumentType.getFields().isEmpty()) {
GraphQLQueryParserRegistry.get().registerParser(whereArgumentType);
arguments.add(newArgument().name("where").type(whereArgumentType).build());
}
if (orderByType != null) {
arguments.add(newArgument().name("orderBy").type(orderByType).build());
}
arguments.add(newArgument().name("pagination").type(new GraphQLTypeReference("Pagination")).build());
qBuilder.field(newFieldDefinition().name(rootType.getName()).type(GraphQLList.list(rootType)).arguments(arguments));
});
builder.query(query);
GraphQLObjectType subscription = schema.getSubscriptionType();
subscription = subscription.transform(sBuilder -> {
sBuilder.field(newFieldDefinition().name(rootType.getName() + "Added").type(nonNull(rootType)).build());
sBuilder.field(newFieldDefinition().name(rootType.getName() + "Updated").type(nonNull(rootType)).build());
});
builder.subscription(subscription);
GraphQLCodeRegistry registry = schema.getCodeRegistry().transform(codeBuilder -> {
codeBuilder.dataFetcher(coordinates("Query", rootType.getName()), schemaManager.getDomainModelDataFetcher(event.getProcessId()));
codeBuilder.dataFetcher(coordinates("Subscription", rootType.getName() + "Added"), schemaManager.getDomainModelAddedDataFetcher(event.getProcessId()));
codeBuilder.dataFetcher(coordinates("Subscription", rootType.getName() + "Updated"), schemaManager.getDomainModelUpdatedDataFetcher(event.getProcessId()));
});
builder.codeRegistry(registry);
});
}