From f8bd9394c490c38aff8b059d3a53a61d0b900981 Mon Sep 17 00:00:00 2001 From: Henrique Magarotto Date: Tue, 25 Aug 2020 02:22:46 -0300 Subject: [PATCH 1/3] Added starter dependencies --- zenvia-sdk-starters/pom.xml | 8 +++++++ .../zenvia-sdk-starter-webhook-jersey/pom.xml | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/zenvia-sdk-starters/pom.xml b/zenvia-sdk-starters/pom.xml index c723673..b484eee 100644 --- a/zenvia-sdk-starters/pom.xml +++ b/zenvia-sdk-starters/pom.xml @@ -23,4 +23,12 @@ zenvia-sdk-starter-webhook-webmvc + + + com.zenvia + zenvia-api-sdk-autoconfigure + 1.1.0 + + + diff --git a/zenvia-sdk-starters/zenvia-sdk-starter-webhook-jersey/pom.xml b/zenvia-sdk-starters/zenvia-sdk-starter-webhook-jersey/pom.xml index 0b09015..166fd08 100644 --- a/zenvia-sdk-starters/zenvia-sdk-starter-webhook-jersey/pom.xml +++ b/zenvia-sdk-starters/zenvia-sdk-starter-webhook-jersey/pom.xml @@ -20,6 +20,30 @@ zenvia-api-sdk-webhook-jersey 1.1.0 + + org.springframework.boot + spring-boot-starter-jersey + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.slf4j + slf4j-log4j12 + + + + + org.springframework.boot + spring-boot-starter-jetty + + + org.slf4j + slf4j-log4j12 + + + From b15b15047886fed3d3bb0252f491c7e4cebfd3e6 Mon Sep 17 00:00:00 2001 From: Henrique Magarotto Date: Tue, 25 Aug 2020 02:23:20 -0300 Subject: [PATCH 2/3] Adjusting configure order and init subscriptions --- .../WebhookControllerJerseyAutoConfiguration.java | 11 ++++++++--- .../WebhookControllerWebMvcAutoConfiguration.java | 7 +++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerJerseyAutoConfiguration.java b/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerJerseyAutoConfiguration.java index 170174c..12577fe 100644 --- a/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerJerseyAutoConfiguration.java +++ b/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerJerseyAutoConfiguration.java @@ -3,8 +3,10 @@ import org.glassfish.jersey.server.ResourceConfig; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; @@ -23,6 +25,7 @@ @ConditionalOnClass({ WebhookController.class, ResourceConfig.class }) @Conditional(OnEventCallbacksCondition.class) @AutoConfigureAfter({ ClientSpringAutoConfiguration.class, ClientApacheAutoConfiguration.class }) +@AutoConfigureBefore({ JerseyAutoConfiguration.class }) @EnableConfigurationProperties(WebhookProperties.class) public class WebhookControllerJerseyAutoConfiguration { @@ -30,7 +33,7 @@ public class WebhookControllerJerseyAutoConfiguration { @ConditionalOnMissingBean public WebhookController createWebhookController( WebhookProperties webhookProperties, - ObjectProvider resourceConfig, + ResourceConfig resourceConfig, ObjectProvider messageEventHandler, ObjectProvider messageStatusEventHandler, ObjectProvider client @@ -39,8 +42,8 @@ public WebhookController createWebhookController( if (webhookProperties.getChannel() != null) { channel = ChannelType.parse(webhookProperties.getChannel()); } - return new WebhookController( - resourceConfig.getIfAvailable(), + WebhookController controller = new WebhookController( + resourceConfig, messageEventHandler.getIfAvailable(), messageStatusEventHandler.getIfAvailable(), webhookProperties.getPath(), @@ -48,6 +51,8 @@ public WebhookController createWebhookController( webhookProperties.getUrl(), channel ); + controller.init(); + return controller; } @Bean diff --git a/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerWebMvcAutoConfiguration.java b/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerWebMvcAutoConfiguration.java index e5768fa..4efeec9 100644 --- a/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerWebMvcAutoConfiguration.java +++ b/zenvia-sdk-autoconfigure/src/main/java/com/zenvia/api/sdk/autoconfigure/webhook/WebhookControllerWebMvcAutoConfiguration.java @@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; @@ -24,7 +25,7 @@ @ConditionalOnClass(WebhookController.class) @ConditionalOnBean(RequestMappingHandlerMapping.class) @Conditional(OnEventCallbacksCondition.class) -@AutoConfigureAfter({ ClientSpringAutoConfiguration.class, ClientApacheAutoConfiguration.class }) +@AutoConfigureAfter({ ClientSpringAutoConfiguration.class, ClientApacheAutoConfiguration.class, WebMvcAutoConfiguration.class }) @EnableConfigurationProperties(WebhookProperties.class) public class WebhookControllerWebMvcAutoConfiguration { @@ -41,7 +42,7 @@ public WebhookController createWebhookController( if (webhookProperties.getChannel() != null) { channel = ChannelType.parse(webhookProperties.getChannel()); } - return new WebhookController( + WebhookController controller = new WebhookController( handlerMapping, messageEventHandler.getIfAvailable(), messageStatusEventHandler.getIfAvailable(), @@ -50,6 +51,8 @@ public WebhookController createWebhookController( webhookProperties.getUrl(), channel ); + controller.init(); + return controller; } } From 0df19d46f91372a5a1b8656fcdc449adb1c6abbc Mon Sep 17 00:00:00 2001 From: Henrique Magarotto Date: Tue, 25 Aug 2020 02:24:07 -0300 Subject: [PATCH 3/3] Let backend deal with duplicated subscriptions --- .../webhook/AbstractWebhookController.java | 65 +++++++++---------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/zenvia-sdk-core/src/main/java/com/zenvia/api/sdk/webhook/AbstractWebhookController.java b/zenvia-sdk-core/src/main/java/com/zenvia/api/sdk/webhook/AbstractWebhookController.java index 2c7781a..e0c7bbb 100644 --- a/zenvia-sdk-core/src/main/java/com/zenvia/api/sdk/webhook/AbstractWebhookController.java +++ b/zenvia-sdk-core/src/main/java/com/zenvia/api/sdk/webhook/AbstractWebhookController.java @@ -1,19 +1,16 @@ package com.zenvia.api.sdk.webhook; -import java.util.List; - +import org.apache.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.zenvia.api.sdk.client.AbstractClient; import com.zenvia.api.sdk.client.ChannelType; +import com.zenvia.api.sdk.client.exceptions.UnsuccessfulRequestException; import com.zenvia.api.sdk.client.subscriptions.Criteria; -import com.zenvia.api.sdk.client.subscriptions.EventType; import com.zenvia.api.sdk.client.subscriptions.MessageCriteria; import com.zenvia.api.sdk.client.subscriptions.MessageStatusSubscription; import com.zenvia.api.sdk.client.subscriptions.MessageSubscription; -import com.zenvia.api.sdk.client.subscriptions.Subscription; -import com.zenvia.api.sdk.client.subscriptions.SubscriptionStatus; import com.zenvia.api.sdk.client.subscriptions.Webhook; import com.zenvia.api.sdk.messages.MessageDirection; @@ -28,7 +25,7 @@ public abstract class AbstractWebhookController { protected final MessageStatusEventCallback messageStatusEventHandler; - protected final String path; + protected String path; protected final AbstractClient client; @@ -106,9 +103,12 @@ public AbstractWebhookController( ) { this.messageEventHandler = messageEventHandler; this.messageStatusEventHandler = messageStatusEventHandler; - this.path = valueOrDefault( path, DEFAULT_PATH ); this.client = client; - this.url = url; + this.path = valueOrDefault( path, DEFAULT_PATH ); + if (!this.path.startsWith("/")) { + this.path = "/".concat(this.path); + } + this.url = url.concat(this.path); this.channel = channel; } @@ -129,40 +129,33 @@ private void createSubscriptions() { return; } - LOG.debug("Verifying subscriptions before create them if not exist"); - List subscriptions = client.listSubscriptions(); - boolean shouldCreateMessageSubscription = true; - boolean shouldCreateMessageStatusSubscription = true; + Webhook webhook = new Webhook(url); - for (Subscription subscription : subscriptions) { - if ( - SubscriptionStatus.ACTIVE.equals(subscription.status) && - url.equalsIgnoreCase(subscription.webhook.url) && - channel.equals(subscription.criteria.channel) - ) { - if (EventType.MESSAGE.equals(subscription.eventType)) { - LOG.debug("It wont be necessary to create subscription for MESSAGE event"); - shouldCreateMessageSubscription = false; - } else if(EventType.MESSAGE_STATUS.equals(subscription.eventType)) { - shouldCreateMessageStatusSubscription = false; - LOG.debug("It wont be necessary to create subscription for MESSAGE_STAUS event"); + if (messageEventHandler != null) { + MessageCriteria criteria = new MessageCriteria(channel, MessageDirection.IN); + LOG.debug("Trying to create subscription for MESSAGE event of channel {}", channel); + try { + client.createSubscription(new MessageSubscription(webhook, criteria)); + } catch (UnsuccessfulRequestException error) { + if (error.httpStatusCode == HttpStatus.SC_CONFLICT) { + LOG.debug("Message subscription already exists."); + } else { + throw error; } } } - if (shouldCreateMessageSubscription || shouldCreateMessageStatusSubscription) { - Webhook webhook = new Webhook(url); - - if (messageEventHandler != null && shouldCreateMessageSubscription) { - MessageCriteria criteria = new MessageCriteria(channel, MessageDirection.IN); - LOG.debug("Trying to create subscription for MESSAGE event of channel {}", channel); - client.createSubscription(new MessageSubscription(webhook, criteria)); - } - - if (messageStatusEventHandler != null && shouldCreateMessageStatusSubscription) { - Criteria criteria = new Criteria(channel); - LOG.debug("Trying to create subscription for MESSAGE_STATUS event of channel {}", channel); + if (messageStatusEventHandler != null) { + Criteria criteria = new Criteria(channel); + LOG.debug("Trying to create subscription for MESSAGE_STATUS event of channel {}", channel); + try { client.createSubscription(new MessageStatusSubscription(webhook, criteria)); + } catch (UnsuccessfulRequestException error) { + if (error.httpStatusCode == HttpStatus.SC_CONFLICT) { + LOG.debug("Message status subscription already exists."); + } else { + throw error; + } } } }