From 2250ee1e21ac90c6fa5da4952fdd1eaf77f7a05f Mon Sep 17 00:00:00 2001 From: Manoj <56669674+fynmanoj@users.noreply.github.com> Date: Tue, 3 Aug 2021 18:52:38 +0530 Subject: [PATCH] FINERACT-1277-Message-Gateway-webhook (#1801) --- .../hooks/api/HookApiConstants.java | 4 + .../processor/HookProcessorProvider.java | 3 + .../MessageGatewayHookProcessor.java | 121 ++++++++++++++++++ .../template/domain/TemplateRepository.java | 5 + .../V367__message_gateway_hook_template.sql | 27 ++++ 5 files changed, 160 insertions(+) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java create mode 100644 fineract-provider/src/main/resources/sql/migrations/core_db/V367__message_gateway_hook_template.sql diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiConstants.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiConstants.java index c11deea34..381e36997 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiConstants.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiConstants.java @@ -40,6 +40,8 @@ public final class HookApiConstants { public static final String elasticSearchTemplateName = "Elastic Search"; + public static final String httpSMSTemplateName = "Message Gateway"; + public static final String smsTemplateName = "SMS Bridge"; public static final String payloadURLName = "Payload URL"; @@ -68,6 +70,8 @@ public final class HookApiConstants { public static final String templateNameParamName = "templateName"; + public static final String SMSProviderIdParamName = "SMS Provider Id"; + static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(nameParamName, displayNameParamName, templateIdParamName, isActiveParamName, configParamName, eventsParamName, templateNameParamName)); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java index 23d57096f..5f637ba71 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java @@ -19,6 +19,7 @@ package org.apache.fineract.infrastructure.hooks.processor; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.elasticSearchTemplateName; +import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.httpSMSTemplateName; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.smsTemplateName; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.webTemplateName; @@ -47,6 +48,8 @@ public class HookProcessorProvider implements ApplicationContextAware { processor = this.applicationContext.getBean("webHookProcessor", WebHookProcessor.class); } else if (templateName.equals(elasticSearchTemplateName)) { processor = this.applicationContext.getBean("elasticSearchHookProcessor", ElasticSearchHookProcessor.class); + } else if (templateName.equals(httpSMSTemplateName)) { + processor = this.applicationContext.getBean("messageGatewayHookProcessor", MessageGatewayHookProcessor.class); } else { processor = null; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java new file mode 100644 index 000000000..4cfd89fe5 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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 org.apache.fineract.infrastructure.hooks.processor; + +import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.SMSProviderIdParamName; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; +import org.apache.fineract.infrastructure.hooks.domain.Hook; +import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; +import org.apache.fineract.infrastructure.sms.domain.SmsMessage; +import org.apache.fineract.infrastructure.sms.domain.SmsMessageRepository; +import org.apache.fineract.infrastructure.sms.scheduler.SmsMessageScheduledJobService; +import org.apache.fineract.portfolio.client.domain.Client; +import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; +import org.apache.fineract.template.domain.Template; +import org.apache.fineract.template.domain.TemplateRepository; +import org.apache.fineract.template.service.TemplateMergeService; +import org.apache.fineract.useradministration.domain.AppUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MessageGatewayHookProcessor implements HookProcessor { + + private static final Logger LOG = LoggerFactory.getLogger(MessageGatewayHookProcessor.class); + + private final ClientRepositoryWrapper clientRepository; + private final TemplateRepository templateRepository; + private final TemplateMergeService templateMergeService; + + private final SmsMessageRepository smsMessageRepository; + private final SmsMessageScheduledJobService smsMessageScheduledJobService; + + @Autowired + public MessageGatewayHookProcessor(ClientRepositoryWrapper clientRepository, TemplateRepository templateRepository, + TemplateMergeService templateMergeService, SmsMessageRepository smsMessageRepository, + SmsMessageScheduledJobService smsMessageScheduledJobService) { + this.clientRepository = clientRepository; + this.templateRepository = templateRepository; + this.templateMergeService = templateMergeService; + this.smsMessageRepository = smsMessageRepository; + this.smsMessageScheduledJobService = smsMessageScheduledJobService; + } + + @Override + public void process(final Hook hook, @SuppressWarnings("unused") final AppUser appUser, final String payload, final String entityName, + final String actionName, final String tenantIdentifier, final String authToken) throws IOException { + + final Set config = hook.getHookConfig(); + + Integer SMSProviderId = null; + + for (final HookConfiguration conf : config) { + final String fieldName = conf.getFieldName(); + if (fieldName.equals(SMSProviderIdParamName)) { + SMSProviderId = Integer.parseInt(conf.getFieldValue()); + } + } + + String templateName = entityName + "_" + actionName; + + // 1 : find template via mapper using entity and action + Template template; + List