All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dev.soffa.foundation.commons.graphql.GraphQLUtil Maven / Gradle / Ivy

There is a newer version: 0.17.31
Show newest version
package dev.soffa.foundation.commons.graphql;

import dev.soffa.foundation.commons.Logger;
import dev.soffa.foundation.commons.Mappers;
import dev.soffa.foundation.commons.TextUtil;
import dev.soffa.foundation.error.ErrorUtil;
import graphql.language.Definition;
import graphql.language.Document;
import graphql.language.Field;
import graphql.language.OperationDefinition;
import graphql.parser.Parser;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

@SuppressWarnings("unchecked")
public final class GraphQLUtil {

    private GraphQLUtil() {}

    public static Map extractVariables(String payload) {
        GraphQLRequest request = Mappers.JSON_DEFAULT.deserialize(payload, GraphQLRequest.class);
        return flatten(request.getVariables());
    }

    private static Map flatten(Map input) {
        if (input==null || input.isEmpty()) {
            return input;
        }
        Map output = new HashMap<>();
        input.forEach((key, value) -> {
            if (value instanceof Map) {
                Map it = flatten((Map)value);
                if (it!=null) {
                    output.putAll(it);
                }
            } else if (output.containsKey(key)) {
                output.put(key.toLowerCase(Locale.ROOT) + "_" + output.keySet().size(), value);
            }else {
                output.put(key.toLowerCase(Locale.ROOT), value);
            }
        });
        return output;
    }

    public static String extractOperationName(String payload) {
        try {
            GraphQLRequest gql = Mappers.JSON_DEFAULT.deserialize(payload, GraphQLRequest.class);
            if (TextUtil.isNotEmpty(gql.getOperationName())) {
                return gql.getOperationName();
            }
            Document doc = new Parser().parseDocument(gql.getQuery());
            String operationName = null;
            for (Definition def : doc.getDefinitions()) {
                if (def instanceof OperationDefinition) {
                    operationName = ((OperationDefinition) def).getName();
                    if (TextUtil.isEmpty(operationName)) {
                        Field field = (Field)((OperationDefinition) def).getSelectionSet().getSelections().get(0);
                        operationName = field.getName();
                    }
                    if (TextUtil.isNotEmpty(operationName)) {
                        break;
                    }
                }
            }
            return operationName;
        } catch (Exception e) {
            Logger.app.error("Error while extracting operation name from payload: %s", ErrorUtil.getError(e));
            return null;
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy