diff --git a/docs/src/content/docs/reference/components/binance.md b/docs/src/content/docs/reference/components/binance.md new file mode 100644 index 0000000000..440582e0d3 --- /dev/null +++ b/docs/src/content/docs/reference/components/binance.md @@ -0,0 +1,72 @@ +--- +title: "Binance" +description: "Binance is an online exchange where users can trade cryptocurrencies." +--- + +Binance is an online exchange where users can trade cryptocurrencies. + + +Categories: Payment Processing + + +Type: binance/v1 + +
+ + + + +## Actions + + +### Fetch Pair Price +Name: fetchPairPrice + +Fetch the price of a crypto pair from Binance. + +#### Properties + +| Name | Label | Type | Description | Required | +|:---------------:|:--------------:|:------------:|:-------------------:|:--------:| +| symbol | Symbol | STRING | The symbol of the crypto pair. | true | + +#### Example JSON Structure +```json +{ + "label" : "Fetch Pair Price", + "name" : "fetchPairPrice", + "parameters" : { + "symbol" : "" + }, + "type" : "binance/v1/fetchPairPrice" +} +``` + +#### Output + + + +Type: OBJECT + + +#### Properties + +| Name | Type | Description | +|:------------:|:------------:|:-------------------:| +| symbol | STRING | The symbol of the crypto pair. | +| price | STRING | The price of the crypto pair. | + + + + +#### Output Example +```json +{ + "symbol" : "", + "price" : "" +} +``` + + + + diff --git a/server/apps/server-app/build.gradle.kts b/server/apps/server-app/build.gradle.kts index cd1276ef96..f1fcfc0dc0 100644 --- a/server/apps/server-app/build.gradle.kts +++ b/server/apps/server-app/build.gradle.kts @@ -180,6 +180,7 @@ dependencies { implementation(project(":server:libs:modules:components:baserow")) implementation(project(":server:libs:modules:components:bash")) implementation(project(":server:libs:modules:components:beamer")) + implementation(project(":server:libs:modules:components:binance")) implementation(project(":server:libs:modules:components:box")) implementation(project(":server:libs:modules:components:brevo")) implementation(project(":server:libs:modules:components:calendly")) diff --git a/server/ee/apps/worker-app/build.gradle.kts b/server/ee/apps/worker-app/build.gradle.kts index 04c422f365..0fb6ea6637 100644 --- a/server/ee/apps/worker-app/build.gradle.kts +++ b/server/ee/apps/worker-app/build.gradle.kts @@ -102,6 +102,7 @@ dependencies { implementation(project(":server:libs:modules:components:baserow")) implementation(project(":server:libs:modules:components:bash")) implementation(project(":server:libs:modules:components:beamer")) + implementation(project(":server:libs:modules:components:binance")) implementation(project(":server:libs:modules:components:box")) implementation(project(":server:libs:modules:components:brevo")) implementation(project(":server:libs:modules:components:calendly")) diff --git a/server/libs/modules/components/binance/build.gradle.kts b/server/libs/modules/components/binance/build.gradle.kts new file mode 100644 index 0000000000..bf2a7f56ed --- /dev/null +++ b/server/libs/modules/components/binance/build.gradle.kts @@ -0,0 +1,2 @@ +version="1.0" + diff --git a/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/BinanceComponentHandler.java b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/BinanceComponentHandler.java new file mode 100644 index 0000000000..bbec790420 --- /dev/null +++ b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/BinanceComponentHandler.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance; + +import static com.bytechef.component.definition.ComponentDsl.component; + +import com.bytechef.component.ComponentHandler; +import com.bytechef.component.binance.action.BinanceFetchPairPriceAction; +import com.bytechef.component.definition.ComponentCategory; +import com.bytechef.component.definition.ComponentDefinition; +import com.google.auto.service.AutoService; + +/** + * @author Marija Horvat + */ +@AutoService(ComponentHandler.class) +public class BinanceComponentHandler implements ComponentHandler { + + private static final ComponentDefinition COMPONENT_DEFINITION = component("binance") + .title("Binance") + .description("Binance is an online exchange where users can trade cryptocurrencies.") + .icon("path:assets/binance.svg") + .categories(ComponentCategory.PAYMENT_PROCESSING) + .actions(BinanceFetchPairPriceAction.ACTION_DEFINITION); + + @Override + public ComponentDefinition getDefinition() { + return COMPONENT_DEFINITION; + } +} diff --git a/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/action/BinanceFetchPairPriceAction.java b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/action/BinanceFetchPairPriceAction.java new file mode 100644 index 0000000000..73ea6ae93a --- /dev/null +++ b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/action/BinanceFetchPairPriceAction.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance.action; + +import static com.bytechef.component.binance.constant.BinanceConstants.SYMBOL; +import static com.bytechef.component.definition.ComponentDsl.action; +import static com.bytechef.component.definition.ComponentDsl.object; +import static com.bytechef.component.definition.ComponentDsl.outputSchema; +import static com.bytechef.component.definition.ComponentDsl.string; +import static com.bytechef.component.definition.Context.Http.responseType; + +import com.bytechef.component.binance.util.BinanceUtils; +import com.bytechef.component.definition.ComponentDsl.ModifiableActionDefinition; +import com.bytechef.component.definition.Context; +import com.bytechef.component.definition.Context.Http; +import com.bytechef.component.definition.OptionsDataSource.ActionOptionsFunction; +import com.bytechef.component.definition.Parameters; +import com.bytechef.component.definition.TypeReference; + +/** + * @author Marija Horvat + */ +public class BinanceFetchPairPriceAction { + + public static final ModifiableActionDefinition ACTION_DEFINITION = action("fetchPairPrice") + .title("Fetch Pair Price") + .description("Fetch the price of a crypto pair from Binance.") + .properties( + string(SYMBOL) + .label("Symbol") + .description("The symbol of the crypto pair.") + .options((ActionOptionsFunction) BinanceUtils::getSymbolsOptions) + .required(true)) + .output( + outputSchema( + object() + .properties( + string(SYMBOL) + .description("The symbol of the crypto pair."), + string("price") + .description("The price of the crypto pair.")))) + .perform(BinanceFetchPairPriceAction::perform); + + private BinanceFetchPairPriceAction() { + } + + public static Object perform(Parameters inputParameters, Parameters connectionParameters, Context context) { + return context.http(http -> http.get("https://api.binance.com/api/v3/ticker/price")) + .queryParameter(SYMBOL, inputParameters.getRequiredString(SYMBOL)) + .configuration(responseType(Http.ResponseType.JSON)) + .execute() + .getBody(new TypeReference<>() {}); + } +} diff --git a/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/constant/BinanceConstants.java b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/constant/BinanceConstants.java new file mode 100644 index 0000000000..3bc8088fcc --- /dev/null +++ b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/constant/BinanceConstants.java @@ -0,0 +1,28 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance.constant; + +/** + * @author Marija Horvat + */ +public class BinanceConstants { + + public static final String SYMBOL = "symbol"; + + private BinanceConstants() { + } +} diff --git a/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/util/BinanceUtils.java b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/util/BinanceUtils.java new file mode 100644 index 0000000000..79577a4ff6 --- /dev/null +++ b/server/libs/modules/components/binance/src/main/java/com/bytechef/component/binance/util/BinanceUtils.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance.util; + +import static com.bytechef.component.binance.constant.BinanceConstants.SYMBOL; +import static com.bytechef.component.definition.ComponentDsl.option; +import static com.bytechef.component.definition.Context.Http.responseType; + +import com.bytechef.component.definition.Context; +import com.bytechef.component.definition.Context.Http; +import com.bytechef.component.definition.Option; +import com.bytechef.component.definition.Parameters; +import com.bytechef.component.definition.TypeReference; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author Marija Horvat + */ +public class BinanceUtils { + + private BinanceUtils() { + } + + public static List> getSymbolsOptions( + Parameters inputParameters, Parameters connectionParameters, Map dependencyPaths, + String searchText, Context context) { + + Map body = context.http(http -> http.get("https://api.binance.com/api/v3/exchangeInfo")) + .configuration(responseType(Http.ResponseType.JSON)) + .execute() + .getBody(new TypeReference<>() {}); + + List> options = new ArrayList<>(); + + if (body.get("symbols") instanceof List symbols) { + for (Object object : symbols) { + if (object instanceof Map map) { + String symbol = (String) map.get(SYMBOL); + + options.add(option(symbol, symbol)); + } + } + } + + return options; + } +} diff --git a/server/libs/modules/components/binance/src/main/resources/assets/binance.svg b/server/libs/modules/components/binance/src/main/resources/assets/binance.svg new file mode 100644 index 0000000000..ffac21da51 --- /dev/null +++ b/server/libs/modules/components/binance/src/main/resources/assets/binance.svg @@ -0,0 +1,16911 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/BinanceComponentHandlerTest.java b/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/BinanceComponentHandlerTest.java new file mode 100644 index 0000000000..bdb0e57873 --- /dev/null +++ b/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/BinanceComponentHandlerTest.java @@ -0,0 +1,31 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance; + +import com.bytechef.test.jsonasssert.JsonFileAssert; +import org.junit.jupiter.api.Test; + +/** + * @author Marija Horvat + */ +class BinanceComponentHandlerTest { + + @Test + void testGetComponentDefinition() { + JsonFileAssert.assertEquals("definition/binance_v1.json", new BinanceComponentHandler().getDefinition()); + } +} diff --git a/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/action/BinanceFetchPairPriceActionTest.java b/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/action/BinanceFetchPairPriceActionTest.java new file mode 100644 index 0000000000..d6a8a21f6f --- /dev/null +++ b/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/action/BinanceFetchPairPriceActionTest.java @@ -0,0 +1,66 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance.action; + +import static com.bytechef.component.binance.constant.BinanceConstants.SYMBOL; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.bytechef.component.definition.Context; +import com.bytechef.component.definition.Context.Http; +import com.bytechef.component.definition.Parameters; +import com.bytechef.component.definition.TypeReference; +import com.bytechef.component.test.definition.MockParametersFactory; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +/** + * @author Marija Horvat + */ +class BinanceFetchPairPriceActionTest { + + private final Context mockedContext = mock(Context.class); + private final Http.Executor mockedExecutor = mock(Http.Executor.class); + private final Parameters mockedParameters = MockParametersFactory.create(Map.of(SYMBOL, "test")); + private final Http.Response mockedResponse = mock(Http.Response.class); + private final Map responseMap = Map.of(SYMBOL, "test", "price", "1"); + private final ArgumentCaptor stringArgumentCaptor = ArgumentCaptor.forClass(String.class); + + @Test + void testPerform() { + when(mockedContext.http(any())) + .thenReturn(mockedExecutor); + when(mockedExecutor.queryParameter(stringArgumentCaptor.capture(), stringArgumentCaptor.capture())) + .thenReturn(mockedExecutor); + when(mockedExecutor.configuration(any())) + .thenReturn(mockedExecutor); + when(mockedExecutor.execute()) + .thenReturn(mockedResponse); + when(mockedResponse.getBody(any(TypeReference.class))) + .thenReturn(responseMap); + + Object result = BinanceFetchPairPriceAction.perform(mockedParameters, mockedParameters, mockedContext); + + assertEquals(responseMap, result); + + assertEquals(List.of(SYMBOL, "test"), stringArgumentCaptor.getAllValues()); + } +} diff --git a/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/util/BinanceUtilsTest.java b/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/util/BinanceUtilsTest.java new file mode 100644 index 0000000000..1b749c6ce4 --- /dev/null +++ b/server/libs/modules/components/binance/src/test/java/com/bytechef/component/binance/util/BinanceUtilsTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023-present ByteChef Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.bytechef.component.binance.util; + +import static com.bytechef.component.binance.constant.BinanceConstants.SYMBOL; +import static com.bytechef.component.definition.ComponentDsl.option; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.bytechef.component.definition.Context; +import com.bytechef.component.definition.Context.Http; +import com.bytechef.component.definition.Option; +import com.bytechef.component.definition.Parameters; +import com.bytechef.component.definition.TypeReference; +import java.util.List; +import java.util.Map; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; + +/** + * @author Marija Horvat + */ +class BinanceUtilsTest { + + private final List> expectedOptions = List.of( + option("ETHBTC", "ETHBTC"), + option("LTCBTC", "LTCBTC")); + private final Context mockedContext = mock(Context.class); + private final Http.Executor mockedExecutor = mock(Http.Executor.class); + private final Parameters mockedParameters = mock(Parameters.class); + private final Http.Response mockedResponse = mock(Http.Response.class); + + @Test + void testGetSymbolsOptions() { + when(mockedContext.http(any())) + .thenReturn(mockedExecutor); + when(mockedExecutor.configuration(any())) + .thenReturn(mockedExecutor); + when(mockedExecutor.execute()) + .thenReturn(mockedResponse); + when(mockedResponse.getBody(any(TypeReference.class))) + .thenReturn(Map.of("symbols", List.of(Map.of(SYMBOL, "ETHBTC"), Map.of(SYMBOL, "LTCBTC")))); + + List> result = BinanceUtils.getSymbolsOptions( + mockedParameters, mockedParameters, Map.of(), "", mockedContext); + + assertThat(result, Matchers.containsInAnyOrder(expectedOptions.toArray())); + } +} diff --git a/server/libs/modules/components/binance/src/test/resources/definition/binance_v1.json b/server/libs/modules/components/binance/src/test/resources/definition/binance_v1.json new file mode 100644 index 0000000000..bab3d5717f --- /dev/null +++ b/server/libs/modules/components/binance/src/test/resources/definition/binance_v1.json @@ -0,0 +1,186 @@ +{ + "componentCategories" : [ { + "name" : "payment-processing", + "label" : "Payment Processing" + } ], + "customAction" : null, + "customActionHelp" : null, + "description" : "Binance is an online exchange where users can trade cryptocurrencies.", + "icon" : "path:assets/binance.svg", + "tags" : null, + "metadata" : null, + "name" : "binance", + "resources" : null, + "version" : 1, + "title" : "Binance", + "actions" : [ { + "batch" : null, + "deprecated" : null, + "description" : "Fetch the price of a crypto pair from Binance.", + "help" : null, + "metadata" : null, + "name" : "fetchPairPrice", + "outputDefinition" : { + "output" : null, + "outputResponse" : { + "outputSchema" : { + "advancedOption" : null, + "description" : null, + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : null, + "name" : null, + "type" : "OBJECT", + "defaultValue" : null, + "exampleValue" : null, + "label" : null, + "placeholder" : null, + "additionalProperties" : null, + "multipleValues" : null, + "options" : null, + "properties" : [ { + "advancedOption" : null, + "description" : "The symbol of the crypto pair.", + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : null, + "name" : "symbol", + "type" : "STRING", + "defaultValue" : null, + "exampleValue" : null, + "label" : null, + "placeholder" : null, + "controlType" : "TEXT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : null + }, { + "advancedOption" : null, + "description" : "The price of the crypto pair.", + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : null, + "name" : "price", + "type" : "STRING", + "defaultValue" : null, + "exampleValue" : null, + "label" : null, + "placeholder" : null, + "controlType" : "TEXT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : null + } ], + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null + }, + "sampleOutput" : null, + "placeholder" : null + }, + "outputSchema" : { + "advancedOption" : null, + "description" : null, + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : null, + "name" : null, + "type" : "OBJECT", + "defaultValue" : null, + "exampleValue" : null, + "label" : null, + "placeholder" : null, + "additionalProperties" : null, + "multipleValues" : null, + "options" : null, + "properties" : [ { + "advancedOption" : null, + "description" : "The symbol of the crypto pair.", + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : null, + "name" : "symbol", + "type" : "STRING", + "defaultValue" : null, + "exampleValue" : null, + "label" : null, + "placeholder" : null, + "controlType" : "TEXT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : null + }, { + "advancedOption" : null, + "description" : "The price of the crypto pair.", + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : null, + "name" : "price", + "type" : "STRING", + "defaultValue" : null, + "exampleValue" : null, + "label" : null, + "placeholder" : null, + "controlType" : "TEXT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : null + } ], + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null + }, + "sampleOutput" : null + }, + "properties" : [ { + "advancedOption" : null, + "description" : "The symbol of the crypto pair.", + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : true, + "name" : "symbol", + "type" : "STRING", + "defaultValue" : null, + "exampleValue" : null, + "label" : "Symbol", + "placeholder" : null, + "controlType" : "SELECT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : { + "optionsLookupDependsOn" : null, + "options" : { } + } + } ], + "title" : "Fetch Pair Price", + "perform" : { }, + "processErrorResponse" : null, + "workflowNodeDescription" : null + } ], + "clusterElements" : null, + "unifiedApi" : null, + "triggers" : null, + "connection" : null +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 0af34483aa..aef6a7f548 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -249,6 +249,7 @@ include("server:libs:modules:components:bamboohr") include("server:libs:modules:components:baserow") include("server:libs:modules:components:bash") include("server:libs:modules:components:beamer") +include("server:libs:modules:components:binance") include("server:libs:modules:components:box") include("server:libs:modules:components:brevo") include("server:libs:modules:components:calendly")