diff --git a/docs/src/content/docs/reference/components/brevo.md b/docs/src/content/docs/reference/components/brevo.md index e2571fa965..52e39d6cbd 100644 --- a/docs/src/content/docs/reference/components/brevo.md +++ b/docs/src/content/docs/reference/components/brevo.md @@ -6,7 +6,7 @@ description: "Brevo is an email marketing platform that offers a cloud-based mar Brevo is an email marketing platform that offers a cloud-based marketing communication software suite with transactional email, marketing automation, customer-relationship management and more. -Categories: marketing-automation +Categories: Marketing Automation Type: brevo/v1 @@ -187,3 +187,30 @@ Type: OBJECT +## Triggers + + +### Transactional Email Opened +Name: transactionalEmailOpened + +Triggers when transactional email is opened. + +Type: DYNAMIC_WEBHOOK + + +#### Output + +The output for this action is dynamic and may vary depending on the input parameters. To determine the exact structure of the output, you need to execute the action. + +#### JSON Example +```json +{ + "label" : "Transactional Email Opened", + "name" : "transactionalEmailOpened", + "type" : "brevo/v1/transactionalEmailOpened" +} +``` + + +
+ diff --git a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/BrevoComponentHandler.java b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/BrevoComponentHandler.java index 2272a5e76a..943c1b808b 100644 --- a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/BrevoComponentHandler.java +++ b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/BrevoComponentHandler.java @@ -24,6 +24,7 @@ import com.bytechef.component.brevo.action.BrevoSendTransactionalEmailAction; import com.bytechef.component.brevo.action.BrevoUpdateContactAction; import com.bytechef.component.brevo.connection.BrevoConnection; +import com.bytechef.component.brevo.trigger.BrevoTransactionalEmailOpenedTrigger; import com.bytechef.component.definition.ComponentCategory; import com.bytechef.component.definition.ComponentDefinition; import com.google.auto.service.AutoService; @@ -46,6 +47,8 @@ public class BrevoComponentHandler implements ComponentHandler { BrevoCreateContactAction.ACTION_DEFINITION, BrevoUpdateContactAction.ACTION_DEFINITION, BrevoSendTransactionalEmailAction.ACTION_DEFINITION) + .triggers( + BrevoTransactionalEmailOpenedTrigger.TRIGGER_DEFINITION) .clusterElements( tool(BrevoCreateContactAction.ACTION_DEFINITION), tool(BrevoUpdateContactAction.ACTION_DEFINITION), diff --git a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/constant/BrevoConstants.java b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/constant/BrevoConstants.java index e5b401f996..81897541e4 100644 --- a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/constant/BrevoConstants.java +++ b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/constant/BrevoConstants.java @@ -27,9 +27,8 @@ public class BrevoConstants { public static final String CONTENT_TYPE = "contentType"; public static final String EMAIL = "email"; public static final String FIRST_NAME = "FIRSTNAME"; + public static final String ID = "id"; public static final String LAST_NAME = "LASTNAME"; - public static final String NAME = "name"; - public static final String RECIPIENT_EMAIL = "recipientEmail"; public static final String SENDER_EMAIL = "senderEmail"; public static final String SUBJECT = "subject"; public static final String TO = "to"; diff --git a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/trigger/BrevoTransactionalEmailOpenedTrigger.java b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/trigger/BrevoTransactionalEmailOpenedTrigger.java new file mode 100644 index 0000000000..48502be99d --- /dev/null +++ b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/trigger/BrevoTransactionalEmailOpenedTrigger.java @@ -0,0 +1,80 @@ +/* + * 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.brevo.trigger; + +import static com.bytechef.component.brevo.constant.BrevoConstants.ID; +import static com.bytechef.component.definition.ComponentDsl.trigger; + +import com.bytechef.component.definition.ComponentDsl.ModifiableTriggerDefinition; +import com.bytechef.component.definition.Context.Http; +import com.bytechef.component.definition.Parameters; +import com.bytechef.component.definition.TriggerContext; +import com.bytechef.component.definition.TriggerDefinition.HttpHeaders; +import com.bytechef.component.definition.TriggerDefinition.HttpParameters; +import com.bytechef.component.definition.TriggerDefinition.TriggerType; +import com.bytechef.component.definition.TriggerDefinition.WebhookBody; +import com.bytechef.component.definition.TriggerDefinition.WebhookEnableOutput; +import com.bytechef.component.definition.TriggerDefinition.WebhookMethod; +import com.bytechef.component.definition.TypeReference; +import java.util.List; +import java.util.Map; + +/** + * @author Marija Horvat + */ +public class BrevoTransactionalEmailOpenedTrigger { + + public static final ModifiableTriggerDefinition TRIGGER_DEFINITION = trigger("transactionalEmailOpened") + .title("Transactional Email Opened") + .description("Triggers when transactional email is opened.") + .type(TriggerType.DYNAMIC_WEBHOOK) + .output() + .webhookEnable(BrevoTransactionalEmailOpenedTrigger::webhookEnable) + .webhookDisable(BrevoTransactionalEmailOpenedTrigger::webhookDisable) + .webhookRequest(BrevoTransactionalEmailOpenedTrigger::webhookRequest); + + private BrevoTransactionalEmailOpenedTrigger() { + } + + protected static WebhookEnableOutput webhookEnable( + Parameters inputParameters, Parameters connectionParameters, String webhookUrl, + String workflowExecutionId, TriggerContext context) { + + Map body = context.http(http -> http.post("/webhooks")) + .body(Http.Body.of("url", webhookUrl, "events", List.of("opened"))) + .configuration(Http.responseType(Http.ResponseType.JSON)) + .execute() + .getBody(new TypeReference<>() {}); + + return new WebhookEnableOutput(Map.of(ID, body.get(ID)), null); + } + + protected static void webhookDisable( + Parameters inputParameters, Parameters connectionParameters, Parameters outputParameters, + String workflowExecutionId, TriggerContext context) { + + context.http(http -> http.delete("/webhooks/" + outputParameters.getRequiredInteger(ID))) + .execute(); + } + + protected static Object webhookRequest( + Parameters inputParameters, Parameters connectionParameters, HttpHeaders headers, HttpParameters parameters, + WebhookBody body, WebhookMethod method, WebhookEnableOutput output, TriggerContext context) { + + return body.getContent(); + } +} diff --git a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/util/BrevoUtils.java b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/util/BrevoUtils.java index d9ec01643b..74e3ab2d71 100644 --- a/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/util/BrevoUtils.java +++ b/server/libs/modules/components/brevo/src/main/java/com/bytechef/component/brevo/util/BrevoUtils.java @@ -41,8 +41,7 @@ public static List> getContactsOptions( Parameters inputParameters, Parameters connectionParameters, Map dependencyPaths, String searchText, Context context) { - Map body = context - .http(http -> http.get("/contacts")) + Map body = context.http(http -> http.get("/contacts")) .configuration(responseType(Http.ResponseType.JSON)) .execute() .getBody(new TypeReference<>() {}); @@ -66,8 +65,7 @@ public static List> getSendersOptions( Parameters inputParameters, Parameters connectionParameters, Map dependencyPaths, String searchText, Context context) { - Map>> body = context - .http(http -> http.get("/senders")) + Map>> body = context.http(http -> http.get("/senders")) .configuration(responseType(Http.ResponseType.JSON)) .execute() .getBody(new TypeReference<>() {}); @@ -82,5 +80,4 @@ public static List> getSendersOptions( return options; } - } diff --git a/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/trigger/BrevoTransactionalEmailOpenedTriggerTest.java b/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/trigger/BrevoTransactionalEmailOpenedTriggerTest.java new file mode 100644 index 0000000000..6bc20bd812 --- /dev/null +++ b/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/trigger/BrevoTransactionalEmailOpenedTriggerTest.java @@ -0,0 +1,96 @@ +/* + * 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.brevo.trigger; + +import static com.bytechef.component.brevo.constant.BrevoConstants.ID; +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.Http; +import com.bytechef.component.definition.Parameters; +import com.bytechef.component.definition.TriggerContext; +import com.bytechef.component.definition.TriggerDefinition.HttpHeaders; +import com.bytechef.component.definition.TriggerDefinition.HttpParameters; +import com.bytechef.component.definition.TriggerDefinition.WebhookBody; +import com.bytechef.component.definition.TriggerDefinition.WebhookEnableOutput; +import com.bytechef.component.definition.TriggerDefinition.WebhookMethod; +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 BrevoTransactionalEmailOpenedTriggerTest { + + private final WebhookEnableOutput mockedWebhookEnableOutput = mock(WebhookEnableOutput.class); + private final ArgumentCaptor bodyArgumentCaptor = ArgumentCaptor.forClass(Http.Body.class); + private final WebhookBody mockedWebhookBody = mock(WebhookBody.class); + private final HttpHeaders mockedHttpHeaders = mock(HttpHeaders.class); + private final HttpParameters mockedHttpParameters = mock(HttpParameters.class); + private final WebhookMethod mockedWebhookMethod = mock(WebhookMethod.class); + private final Parameters mockedParameters = MockParametersFactory.create(Map.of(ID, "id")); + private final TriggerContext mockedTriggerContext = mock(TriggerContext.class); + private final Object mockedObject = mock(Object.class); + private final Http.Executor mockedExecutor = mock(Http.Executor.class); + private final Http.Response mockedResponse = mock(Http.Response.class); + + @Test + void testWebhookEnable() { + String webhookUrl = "testWebhookUrl"; + String workflowExecutionId = "testWorkflowExecutionId"; + + when(mockedTriggerContext.http(any())) + .thenReturn(mockedExecutor); + when(mockedExecutor.body(bodyArgumentCaptor.capture())) + .thenReturn(mockedExecutor); + when(mockedExecutor.configuration(any())) + .thenReturn(mockedExecutor); + when(mockedExecutor.execute()) + .thenReturn(mockedResponse); + when(mockedResponse.getBody(any(TypeReference.class))) + .thenReturn(Map.of(ID, "123")); + + WebhookEnableOutput webhookEnableOutput = BrevoTransactionalEmailOpenedTrigger.webhookEnable( + mockedParameters, mockedParameters, webhookUrl, workflowExecutionId, mockedTriggerContext); + + WebhookEnableOutput expectedWebhookEnableOutput = new WebhookEnableOutput(Map.of(ID, "123"), null); + + assertEquals(expectedWebhookEnableOutput, webhookEnableOutput); + + Http.Body body = bodyArgumentCaptor.getValue(); + + assertEquals(Map.of("url", webhookUrl, "events", List.of("opened")), body.getContent()); + } + + @Test + void testWebhookRequest() { + when(mockedWebhookBody.getContent()) + .thenReturn(mockedObject); + + Object result = BrevoTransactionalEmailOpenedTrigger.webhookRequest( + mockedParameters, mockedParameters, mockedHttpHeaders, mockedHttpParameters, mockedWebhookBody, + mockedWebhookMethod, mockedWebhookEnableOutput, mockedTriggerContext); + + assertEquals(mockedObject, result); + } +} diff --git a/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/util/BrevoUtilsTest.java b/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/util/BrevoUtilsTest.java index 76351bc241..d37afcbe5a 100644 --- a/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/util/BrevoUtilsTest.java +++ b/server/libs/modules/components/brevo/src/test/java/com/bytechef/component/brevo/util/BrevoUtilsTest.java @@ -23,6 +23,7 @@ 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; @@ -41,9 +42,9 @@ class BrevoUtilsTest { option("contact1@test.com", "contact1@test.com"), option("contact2@test.com", "contact2@test.com")); private final Context mockedContext = mock(Context.class); - private final Context.Http.Executor mockedExecutor = mock(Context.Http.Executor.class); + private final Http.Executor mockedExecutor = mock(Http.Executor.class); private final Parameters mockedParameters = mock(Parameters.class); - private final Context.Http.Response mockedResponse = mock(Context.Http.Response.class); + private final Http.Response mockedResponse = mock(Http.Response.class); @BeforeEach void beforeEach() { diff --git a/server/libs/modules/components/brevo/src/test/resources/definition/brevo_v1.json b/server/libs/modules/components/brevo/src/test/resources/definition/brevo_v1.json index 8fe26970ea..2916d767a3 100644 --- a/server/libs/modules/components/brevo/src/test/resources/definition/brevo_v1.json +++ b/server/libs/modules/components/brevo/src/test/resources/definition/brevo_v1.json @@ -13,75 +13,6 @@ "resources" : null, "version" : 1, "title" : "Brevo", - "connection" : { - "authorizations" : [ { - "detectOn" : null, - "description" : null, - "name" : "api_key", - "properties" : [ { - "advancedOption" : null, - "description" : null, - "displayCondition" : null, - "expressionEnabled" : null, - "hidden" : true, - "metadata" : { }, - "required" : true, - "name" : "key", - "type" : "STRING", - "defaultValue" : "api-key", - "exampleValue" : null, - "label" : "Key", - "placeholder" : null, - "controlType" : "TEXT", - "languageId" : null, - "maxLength" : null, - "minLength" : null, - "options" : null, - "optionsDataSource" : null - }, { - "advancedOption" : null, - "description" : null, - "displayCondition" : null, - "expressionEnabled" : null, - "hidden" : null, - "metadata" : { }, - "required" : true, - "name" : "value", - "type" : "STRING", - "defaultValue" : null, - "exampleValue" : null, - "label" : "API key", - "placeholder" : null, - "controlType" : "TEXT", - "languageId" : null, - "maxLength" : null, - "minLength" : null, - "options" : null, - "optionsDataSource" : null - } ], - "refreshOn" : null, - "title" : "API Key", - "type" : "API_KEY", - "acquire" : null, - "authorizationUrl" : null, - "clientSecret" : null, - "refreshToken" : null, - "apply" : null, - "clientId" : null, - "pkce" : null, - "refresh" : null, - "refreshUrl" : null, - "scopes" : null, - "tokenUrl" : null, - "oauth2AuthorizationExtraQueryParameters" : null, - "authorizationCallback" : null - } ], - "properties" : null, - "version" : 1, - "authorizationRequired" : null, - "baseUri" : { }, - "test" : null - }, "actions" : [ { "batch" : null, "deprecated" : null, @@ -126,11 +57,11 @@ "maxValue" : null, "minValue" : null, "options" : null, - "optionsDataSource" : null, - "controlType" : "INTEGER" + "controlType" : "INTEGER", + "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null, "placeholder" : null @@ -169,11 +100,11 @@ "maxValue" : null, "minValue" : null, "options" : null, - "optionsDataSource" : null, - "controlType" : "INTEGER" + "controlType" : "INTEGER", + "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null }, @@ -240,8 +171,8 @@ } ], "title" : "Create Contact", "perform" : { }, - "processErrorResponse" : null, - "workflowNodeDescription" : null + "workflowNodeDescription" : null, + "processErrorResponse" : null }, { "batch" : null, "deprecated" : null, @@ -316,8 +247,8 @@ } ], "title" : "Update Contact", "perform" : { }, - "processErrorResponse" : null, - "workflowNodeDescription" : null + "workflowNodeDescription" : null, + "processErrorResponse" : null }, { "batch" : null, "deprecated" : null, @@ -366,8 +297,8 @@ "options" : null, "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null, "placeholder" : null @@ -410,8 +341,8 @@ "options" : null, "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null }, @@ -477,11 +408,11 @@ "minItems" : 1, "multipleValues" : null, "options" : null, + "controlType" : "MULTI_SELECT", "optionsDataSource" : { "optionsLookupDependsOn" : null, "options" : { } - }, - "controlType" : "MULTI_SELECT" + } }, { "advancedOption" : null, "description" : "The Bcc recipients for the message.", @@ -521,11 +452,11 @@ "minItems" : null, "multipleValues" : null, "options" : null, + "controlType" : "MULTI_SELECT", "optionsDataSource" : { "optionsLookupDependsOn" : null, "options" : { } - }, - "controlType" : "MULTI_SELECT" + } }, { "advancedOption" : null, "description" : "The Cc recipients for the message.", @@ -565,11 +496,11 @@ "minItems" : null, "multipleValues" : null, "options" : null, + "controlType" : "MULTI_SELECT", "optionsDataSource" : { "optionsLookupDependsOn" : null, "options" : { } - }, - "controlType" : "MULTI_SELECT" + } }, { "advancedOption" : null, "description" : "Subject of the email.", @@ -661,8 +592,8 @@ } ], "title" : "Send Transactional Email", "perform" : { }, - "processErrorResponse" : null, - "workflowNodeDescription" : null + "workflowNodeDescription" : null, + "processErrorResponse" : null } ], "clusterElements" : [ { "description" : "Creates new contact.", @@ -704,11 +635,11 @@ "maxValue" : null, "minValue" : null, "options" : null, - "optionsDataSource" : null, - "controlType" : "INTEGER" + "controlType" : "INTEGER", + "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null, "placeholder" : null @@ -747,11 +678,11 @@ "maxValue" : null, "minValue" : null, "options" : null, - "optionsDataSource" : null, - "controlType" : "INTEGER" + "controlType" : "INTEGER", + "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null }, @@ -946,8 +877,8 @@ "options" : null, "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null, "placeholder" : null @@ -990,8 +921,8 @@ "options" : null, "optionsDataSource" : null } ], - "optionsDataSource" : null, - "controlType" : "OBJECT_BUILDER" + "controlType" : "OBJECT_BUILDER", + "optionsDataSource" : null }, "sampleOutput" : null }, @@ -1057,11 +988,11 @@ "minItems" : 1, "multipleValues" : null, "options" : null, + "controlType" : "MULTI_SELECT", "optionsDataSource" : { "optionsLookupDependsOn" : null, "options" : { } - }, - "controlType" : "MULTI_SELECT" + } }, { "advancedOption" : null, "description" : "The Bcc recipients for the message.", @@ -1101,11 +1032,11 @@ "minItems" : null, "multipleValues" : null, "options" : null, + "controlType" : "MULTI_SELECT", "optionsDataSource" : { "optionsLookupDependsOn" : null, "options" : { } - }, - "controlType" : "MULTI_SELECT" + } }, { "advancedOption" : null, "description" : "The Cc recipients for the message.", @@ -1145,11 +1076,11 @@ "minItems" : null, "multipleValues" : null, "options" : null, + "controlType" : "MULTI_SELECT", "optionsDataSource" : { "optionsLookupDependsOn" : null, "options" : { } - }, - "controlType" : "MULTI_SELECT" + } }, { "advancedOption" : null, "description" : "Subject of the email.", @@ -1250,5 +1181,103 @@ "element" : { } } ], "unifiedApi" : null, - "triggers" : null + "triggers" : [ { + "batch" : null, + "deprecated" : null, + "description" : "Triggers when transactional email is opened.", + "help" : null, + "name" : "transactionalEmailOpened", + "outputDefinition" : { + "output" : null, + "outputResponse" : null, + "outputSchema" : null, + "sampleOutput" : null + }, + "properties" : null, + "title" : "Transactional Email Opened", + "type" : "DYNAMIC_WEBHOOK", + "webhookRawBody" : null, + "workflowSyncExecution" : null, + "poll" : null, + "deduplicate" : null, + "webhookDisable" : { }, + "webhookEnable" : { }, + "dynamicWebhookRefresh" : null, + "workflowNodeDescription" : null, + "processErrorResponse" : null, + "webhookRequest" : { }, + "listenerDisable" : null, + "listenerEnable" : null, + "webhookValidate" : null, + "webhookValidateOnEnable" : null + } ], + "connection" : { + "authorizations" : [ { + "detectOn" : null, + "description" : null, + "name" : "api_key", + "properties" : [ { + "advancedOption" : null, + "description" : null, + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : true, + "metadata" : { }, + "required" : true, + "name" : "key", + "type" : "STRING", + "defaultValue" : "api-key", + "exampleValue" : null, + "label" : "Key", + "placeholder" : null, + "controlType" : "TEXT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : null + }, { + "advancedOption" : null, + "description" : null, + "displayCondition" : null, + "expressionEnabled" : null, + "hidden" : null, + "metadata" : { }, + "required" : true, + "name" : "value", + "type" : "STRING", + "defaultValue" : null, + "exampleValue" : null, + "label" : "API key", + "placeholder" : null, + "controlType" : "TEXT", + "languageId" : null, + "maxLength" : null, + "minLength" : null, + "options" : null, + "optionsDataSource" : null + } ], + "refreshOn" : null, + "title" : "API Key", + "type" : "API_KEY", + "acquire" : null, + "apply" : null, + "authorizationCallback" : null, + "authorizationUrl" : null, + "clientId" : null, + "clientSecret" : null, + "oauth2AuthorizationExtraQueryParameters" : null, + "pkce" : null, + "refresh" : null, + "refreshUrl" : null, + "scopes" : null, + "refreshToken" : null, + "tokenUrl" : null + } ], + "properties" : null, + "version" : 1, + "authorizationRequired" : null, + "baseUri" : { }, + "test" : null + } } \ No newline at end of file