use of org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent in project kogito-apps by kiegroup.
the class GraphQLProtoSchemaMapper method onDomainModelRegisteredEvent.
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);
additionalTypes.put(whereArgumentType.getName(), whereArgumentType);
GraphQLInputObjectType orderByType = new GraphQLOrderByTypeMapper(schema, additionalTypes).apply(rootType);
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()) == false).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()) == false).collect(toList()));
}
GraphQLQueryParserRegistry.get().registerParser(whereArgumentType);
GraphQLArgument where = newArgument().name("where").type(whereArgumentType).build();
GraphQLArgument orderBy = newArgument().name("orderBy").type(orderByType).build();
GraphQLArgument pagination = newArgument().name("pagination").type(new GraphQLTypeReference("Pagination")).build();
qBuilder.field(newFieldDefinition().name(rootType.getName()).type(GraphQLList.list(rootType)).arguments(asList(where, orderBy, pagination)));
});
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);
});
}
use of org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent in project kogito-apps by kiegroup.
the class ProtoDomainModelProducer method onFileDescriptorRegistered.
public void onFileDescriptorRegistered(@Observes FileDescriptorRegisteredEvent event) {
FileDescriptor descriptor = event.getDescriptor();
String rootMessage = (String) descriptor.getOption("kogito_model").getValue();
String processId = (String) descriptor.getOption("kogito_id").getValue();
Map<String, Descriptor> map = descriptor.getMessageTypes().stream().collect(toMap(AnnotatedDescriptorImpl::getName, desc -> desc));
Descriptor rootDescriptor = map.remove(rootMessage);
DomainDescriptor domain = new DomainDescriptorMapper().apply(rootDescriptor);
List<DomainDescriptor> additionalTypes = map.values().stream().map(desc -> new DomainDescriptorMapper().apply(desc)).collect(toList());
domainEvent.fire(new DomainModelRegisteredEvent(processId, domain, additionalTypes));
}
use of org.kie.kogito.persistence.api.proto.DomainModelRegisteredEvent in project kogito-apps by kiegroup.
the class ProtoDomainModelProducerTest method onFileDescriptorRegistered.
@Test
void onFileDescriptorRegistered() {
FileDescriptor fileDescriptor = getTestFileDescriptor();
FileDescriptorRegisteredEvent event = new FileDescriptorRegisteredEvent(fileDescriptor);
protoDomainModelProducer.onFileDescriptorRegistered(event);
verify(domainEvent).fire(eq(new DomainModelRegisteredEvent(TestUtils.PROCESS_ID, TestUtils.DOMAIN_DESCRIPTOR, TestUtils.ADDITIONAL_DESCRIPTORS)));
}
Aggregations