diff --git a/server/libs/modules/components/liferay/build.gradle.kts b/server/libs/modules/components/liferay/build.gradle.kts index c1219060de4..bf2a7f56ed1 100644 --- a/server/libs/modules/components/liferay/build.gradle.kts +++ b/server/libs/modules/components/liferay/build.gradle.kts @@ -1,5 +1,2 @@ version="1.0" -dependencies { - implementation("com.github.ben-manes.caffeine:caffeine") -} diff --git a/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/action/LiferayHeadlessAction.java b/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/action/LiferayHeadlessAction.java index 39e97bab3af..e0b5efa92e7 100644 --- a/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/action/LiferayHeadlessAction.java +++ b/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/action/LiferayHeadlessAction.java @@ -24,7 +24,11 @@ import static com.bytechef.component.liferay.constant.LiferayConstants.APPLICATION; import static com.bytechef.component.liferay.constant.LiferayConstants.BODY; import static com.bytechef.component.liferay.constant.LiferayConstants.ENDPOINT; +import static com.bytechef.component.liferay.constant.LiferayConstants.HEADER; +import static com.bytechef.component.liferay.constant.LiferayConstants.HIDDEN_PROPERTIES; +import static com.bytechef.component.liferay.constant.LiferayConstants.PATH; import static com.bytechef.component.liferay.constant.LiferayConstants.PROPERTIES; +import static com.bytechef.component.liferay.constant.LiferayConstants.QUERY; import com.bytechef.component.definition.ActionContext; import com.bytechef.component.definition.ActionDefinition; @@ -88,11 +92,19 @@ public class LiferayHeadlessAction { .perform(LiferayHeadlessAction::perform); public static Object perform(Parameters inputParameters, Parameters connectionParameters, ActionContext context) { - PropertiesContainer propertiesContainer = LiferayPropertiesUtils.createPropertiesForParameters( - inputParameters.getRequiredString(APPLICATION), inputParameters.getRequiredString(ENDPOINT), - context); + Map properties = inputParameters.getMap(PROPERTIES); + if (properties == null) { + properties = Map.of(); + } + + Map hiddenProperties = (Map) properties.get(HIDDEN_PROPERTIES); + + if (hiddenProperties == null) { + hiddenProperties = Map.of(); + } + String endpoint = inputParameters.getRequiredString(ENDPOINT); String[] endpointParts = endpoint.split(" "); @@ -101,19 +113,18 @@ public static Object perform(Parameters inputParameters, Parameters connectionPa context, endpointParts[0], getEndpointUri( inputParameters, connectionParameters, endpointParts[1], - getParameterValueMap(propertiesContainer.pathParameters(), properties)) - ); + getParameterValueMap((List) hiddenProperties.get(PATH), properties))); Response response = executor.headers( - getParameterValueMap(propertiesContainer.headerParameters(), properties)) + getParameterValueMap((List) hiddenProperties.get(HEADER), properties)) .queryParameters( - getParameterValueMap(propertiesContainer.queryParameters(), properties)) + getParameterValueMap((List) hiddenProperties.get(QUERY), properties)) .configuration( Http.timeout(Duration.ofMillis(inputParameters.getInteger("timeout", 10000)))) .configuration( responseType(ResponseType.JSON)) .body( - getBody(propertiesContainer.bodyParameters(), properties, context)) + getBody((List) hiddenProperties.get(BODY), properties, context)) .execute(); return response.getBody(); @@ -127,11 +138,20 @@ private static String getEndpointUri( String endpointUri = baseUri + "/o/" + inputParameters.getRequiredString(APPLICATION) + applicationEndpoint; - for (Map.Entry entry : pathParameters.entrySet()) { - String key = entry.getKey(); - String value = String.valueOf(entry.getValue()); + if (pathParameters != null) { + for (Map.Entry entry : pathParameters.entrySet()) { + String key = entry.getKey(); + Object rawValue = entry.getValue(); - endpointUri = endpointUri.replace("{" + key + "}", value); + String value; + if (rawValue instanceof List list && !list.isEmpty()) { + value = String.valueOf(list.getFirst()); + } else { + value = String.valueOf(rawValue); + } + + endpointUri = endpointUri.replace("{" + key + "}", value); + } } return endpointUri; } @@ -139,20 +159,23 @@ private static String getEndpointUri( private static Map> getParameterValueMap( List parameterNames, Map properties) { + if (parameterNames == null) { + return Map.of(); + } + return parameterNames .stream() .filter( - properties::containsKey - ).collect( + properties::containsKey) + .collect( Collectors.toMap( - parameterName -> parameterName, - parameterName -> List.of(String.valueOf(properties.get(parameterName)))) - ); + parameterName -> parameterName, + parameterName -> List.of(String.valueOf(properties.get(parameterName))))); } private static Body getBody(List parameterNames, Map properties, Context context) { - if (properties.containsKey("body")) { - return Body.of((List) context.json(json -> json.read((String)properties.get("body")))); + if (properties.containsKey(BODY)) { + return Body.of((List) context.json(json -> json.read((String) properties.get(BODY)))); } return Body.of(parameterNames @@ -161,10 +184,8 @@ private static Body getBody(List parameterNames, Map properti properties::containsKey) .collect( Collectors.toMap( - parameterName -> parameterName, - parameterName -> String.valueOf(properties.get(parameterName))) - ) - ); + parameterName -> parameterName, + parameterName -> String.valueOf(properties.get(parameterName))))); } diff --git a/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/constant/LiferayConstants.java b/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/constant/LiferayConstants.java index 5c299db825c..e14e63707d7 100644 --- a/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/constant/LiferayConstants.java +++ b/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/constant/LiferayConstants.java @@ -33,11 +33,15 @@ public class LiferayConstants { public static final String DISCOVER = "discover"; public static final String ENDPOINT = "endpoint"; public static final String GET = "GET"; + public static final String HEADER = "header"; + public static final String HIDDEN_PROPERTIES = "hiddenProperties"; public static final String METHOD = "method"; public static final String NAME = "name"; + public static final String PATH = "path"; public static final String PARAMETERS = "parameters"; public static final String POST = "POST"; public static final String PROPERTIES = "properties"; + public static final String QUERY = "query"; public static final String SERVICE = "service"; public static final String SERVICES = "services"; public static final String TYPE = "type"; diff --git a/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/util/LiferayPropertiesUtils.java b/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/util/LiferayPropertiesUtils.java index 156d336225a..a2daef5b84c 100644 --- a/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/util/LiferayPropertiesUtils.java +++ b/server/libs/modules/components/liferay/src/main/java/com/bytechef/component/liferay/util/LiferayPropertiesUtils.java @@ -23,42 +23,37 @@ import static com.bytechef.component.definition.ComponentDsl.object; import static com.bytechef.component.definition.ComponentDsl.string; import static com.bytechef.component.definition.Context.Http.responseType; +import static com.bytechef.component.liferay.constant.LiferayConstants.BODY; +import static com.bytechef.component.liferay.constant.LiferayConstants.HEADER; +import static com.bytechef.component.liferay.constant.LiferayConstants.HIDDEN_PROPERTIES; +import static com.bytechef.component.liferay.constant.LiferayConstants.PATH; +import static com.bytechef.component.liferay.constant.LiferayConstants.QUERY; import com.bytechef.component.definition.ActionContext; import com.bytechef.component.definition.ComponentDsl.ModifiableValueProperty; import com.bytechef.component.definition.Context.Http.ResponseType; +import com.bytechef.component.definition.Property; import com.bytechef.component.definition.TypeReference; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.concurrent.TimeUnit; /** * @author Marija Horvat */ public class LiferayPropertiesUtils { - private static final Cache PROPERTIES_CONTAINER_CACHE = - Caffeine.newBuilder() - .expireAfterAccess(10, TimeUnit.MINUTES) - .maximumSize(1000) - .build(); - private LiferayPropertiesUtils() { } public static PropertiesContainer createPropertiesForParameters( String application, String endpoint, ActionContext context) { - String applicationOpenApiUrl = "/o/" + application + "/openapi.json"; - String applicationEndpointCacheKey = application + "/" + endpoint; + String url = "/o/" + application + "/openapi.json"; - return PROPERTIES_CONTAINER_CACHE.get( - applicationEndpointCacheKey, key -> getPropertiesContainer(applicationOpenApiUrl, endpoint, context)); + return getPropertiesContainer(url, endpoint, context); } private static List> extractPropertiesFromSchema( @@ -150,10 +145,10 @@ private static List> extractPropertiesFromSchema( } switch (in) { - case "body" -> bodyParameters.add(name); - case "header" -> headerParameters.add(name); - case "path" -> pathParameters.add(name); - case "query" -> queryParameters.add(name); + case BODY -> bodyParameters.add(name); + case HEADER -> headerParameters.add(name); + case PATH -> pathParameters.add(name); + case QUERY -> queryParameters.add(name); default -> throw new IllegalArgumentException("Unknown parameter type: " + in); } @@ -197,6 +192,23 @@ private static List> extractPropertiesFromSchema( }; } + private static ModifiableValueProperty createHiddenProperty( + List bodyParameters, + List headerParameters, + List pathParameters, + List queryParameters) { + + Map hiddenMap = Map.of( + BODY, bodyParameters, + HEADER, headerParameters, + PATH, pathParameters, + QUERY, queryParameters); + + return object(HIDDEN_PROPERTIES) + .hidden(true) + .defaultValue(hiddenMap); + } + private static PropertiesContainer getPropertiesContainer(String url, String endpoint, ActionContext context) { Map body = context.http(http -> http.get(url)) .configuration(responseType(ResponseType.JSON)) @@ -264,13 +276,14 @@ private static PropertiesContainer getPropertiesContainer(String url, String end List pathParameters = new ArrayList<>(); List queryParameters = new ArrayList<>(); - return new PropertiesContainer( - new ArrayList<>( - parameters.stream() - .map(parameterMap -> createProperty( - parameterMap, bodyParameters, headerParameters, pathParameters, queryParameters)) - .filter(Objects::nonNull) - .toList()), - bodyParameters, headerParameters, pathParameters, queryParameters); + List> properties = new ArrayList<>(parameters.stream() + .map(parameterMap -> createProperty( + parameterMap, bodyParameters, headerParameters, pathParameters, queryParameters)) + .filter(Objects::nonNull) + .toList()); + + properties.add(createHiddenProperty(bodyParameters, headerParameters, pathParameters, queryParameters)); + + return new PropertiesContainer(properties, bodyParameters, headerParameters, pathParameters, queryParameters); } }