private void handleConnectionTypes()

in src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java [407:443]


    private void handleConnectionTypes(ObjectTypeDefinition typeDefinition, TypeDefinitionRegistry typeRegistry) {
        for (FieldDefinition fieldDefinition : typeDefinition.getFieldDefinitions()) {
            Directive directive = fieldDefinition.getDirectives().stream().filter( i -> "connection".equals(i.getName())).findFirst().orElse(null);
            if (directive != null) {
                if (directive.getArgument(CONNECTION_FOR) != null) {
                    String forType = ((StringValue) directive.getArgument(CONNECTION_FOR).getValue()).getValue();
                    Optional<TypeDefinition> forTypeDefinition = typeRegistry.getType(forType);
                    if (!forTypeDefinition.isPresent()) {
                        throw new SlingGraphQLException("Type '" + forType + "' has not been defined.");
                    }
                    TypeDefinition<?> forOTD = forTypeDefinition.get();
                    ObjectTypeDefinition edge = ObjectTypeDefinition.newObjectTypeDefinition().name(forOTD.getName() + "Edge")
                            .fieldDefinition(new FieldDefinition("cursor", new TypeName(TYPE_STRING)))
                            .fieldDefinition(new FieldDefinition("node", new TypeName(forOTD.getName())))
                            .build();
                    ObjectTypeDefinition connection = ObjectTypeDefinition.newObjectTypeDefinition().name(forOTD.getName() +
                            "Connection")
                            .fieldDefinition(new FieldDefinition("edges", new ListType(new TypeName(forType + "Edge"))))
                            .fieldDefinition(new FieldDefinition("pageInfo", new TypeName(TYPE_PAGE_INFO)))
                            .build();
                    if (!typeRegistry.getType(TYPE_PAGE_INFO).isPresent()) {
                        ObjectTypeDefinition pageInfo = ObjectTypeDefinition.newObjectTypeDefinition().name(TYPE_PAGE_INFO)
                                .fieldDefinition(new FieldDefinition("hasPreviousPage", new NonNullType(new TypeName(TYPE_BOOLEAN))))
                                .fieldDefinition(new FieldDefinition("hasNextPage", new NonNullType(new TypeName(TYPE_BOOLEAN))))
                                .fieldDefinition(new FieldDefinition("startCursor", new TypeName(TYPE_STRING)))
                                .fieldDefinition(new FieldDefinition("endCursor", new TypeName(TYPE_STRING)))
                                .build();
                        typeRegistry.add(pageInfo);
                    }
                    typeRegistry.add(edge);
                    typeRegistry.add(connection);
                } else {
                    throw new SlingGraphQLException("The connection directive requires a 'for' argument.");
                }
            }
        }
    }