Skip to content

Commit e0808b3

Browse files
committed
Handling InfoBip Status callback
1 parent 600d53b commit e0808b3

File tree

10 files changed

+81
-120
lines changed

10 files changed

+81
-120
lines changed

src/main/java/org/fineract/messagegateway/constants/MessageGatewayConstants.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ public interface MessageGatewayConstants {
2424

2525
String TENANT_APPKEY_HEADER = "Fineract-Tenant-App-Key" ;
2626

27+
28+
String PROVIDER_ACCOUNT_ID = "Provider_Account_Id" ;
29+
30+
String PROVIDER_AUTH_TOKEN = "Provider_Auth_Token" ;
2731
}

src/main/java/org/fineract/messagegateway/sms/SmsConstants.java renamed to src/main/java/org/fineract/messagegateway/sms/constants/SmsConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.fineract.messagegateway.sms;
19+
package org.fineract.messagegateway.sms.constants;
2020

2121
import java.util.Arrays;
2222
import java.util.HashSet;

src/main/java/org/fineract/messagegateway/sms/providers/SMSProvider.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,23 @@
1818
*/
1919
package org.fineract.messagegateway.sms.providers;
2020

21+
import java.util.Base64;
22+
23+
import org.fineract.messagegateway.constants.MessageGatewayConstants;
2124
import org.fineract.messagegateway.exception.MessageGatewayException;
2225
import org.fineract.messagegateway.sms.domain.SMSBridge;
2326
import org.fineract.messagegateway.sms.domain.SMSMessage;
2427

25-
public interface SMSProvider {
28+
public abstract class SMSProvider {
2629

27-
public void sendMessage(final SMSBridge smsBridgeConfig, final SMSMessage message)
30+
public abstract void sendMessage(final SMSBridge smsBridgeConfig, final SMSMessage message)
2831
throws MessageGatewayException ;
32+
33+
protected String encodeBase64(final SMSBridge smsBridgeConfig) {
34+
String tenant = smsBridgeConfig.getTenantId().toString() ;
35+
String username = smsBridgeConfig.getConfigValue(MessageGatewayConstants.PROVIDER_ACCOUNT_ID) ;
36+
String password = smsBridgeConfig.getConfigValue(MessageGatewayConstants.PROVIDER_AUTH_TOKEN) ;
37+
String userPass = username + ":" + password + ":" + tenant;
38+
return Base64.getEncoder().encodeToString(userPass.getBytes());
39+
}
2940
}

src/main/java/org/fineract/messagegateway/sms/providers/impl/dummy/DummySMSProvider.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,22 @@
2828
import org.springframework.stereotype.Service;
2929

3030
@Service(value="Dummy")
31-
public class DummySMSProvider implements SMSProvider{
31+
public class DummySMSProvider extends SMSProvider{
3232

33-
@Override public void sendMessage(SMSBridge smsBridgeConfig, SMSMessage message) throws MessageGatewayException {
34-
if(message.getMessage().toUpperCase().contains("DELIVERED")){
35-
message.setDeliveryStatus(SmsMessageStatusType.DELIVERED.getValue());
36-
} else if(message.getMessage().toUpperCase().contains("FAILED")){
37-
message.setDeliveryStatus(SmsMessageStatusType.FAILED.getValue());
38-
message.setDeliveryErrorMessage("User requested FAILURE for testing");
39-
} else if(message.getMessage().toUpperCase().contains("PENDING")){
40-
message.setDeliveryStatus(SmsMessageStatusType.PENDING.getValue());
41-
} else if(message.getMessage().toUpperCase().contains("WAITING")){
42-
message.setDeliveryStatus(SmsMessageStatusType.WAITING_FOR_REPORT.getValue());
43-
} else {
44-
message.setDeliveryStatus(SmsMessageStatusType.SENT.getValue());
45-
message.setDeliveredOnDate(new Date());
46-
}
47-
}
33+
@Override
34+
public void sendMessage(SMSBridge smsBridgeConfig, SMSMessage message) throws MessageGatewayException {
35+
if (message.getMessage().toUpperCase().contains("DELIVERED")) {
36+
message.setDeliveryStatus(SmsMessageStatusType.DELIVERED.getValue());
37+
} else if (message.getMessage().toUpperCase().contains("FAILED")) {
38+
message.setDeliveryStatus(SmsMessageStatusType.FAILED.getValue());
39+
message.setDeliveryErrorMessage("User requested FAILURE for testing");
40+
} else if (message.getMessage().toUpperCase().contains("PENDING")) {
41+
message.setDeliveryStatus(SmsMessageStatusType.PENDING.getValue());
42+
} else if (message.getMessage().toUpperCase().contains("WAITING")) {
43+
message.setDeliveryStatus(SmsMessageStatusType.WAITING_FOR_REPORT.getValue());
44+
} else {
45+
message.setDeliveryStatus(SmsMessageStatusType.SENT.getValue());
46+
message.setDeliveredOnDate(new Date());
47+
}
48+
}
4849
}

src/main/java/org/fineract/messagegateway/sms/providers/impl/infobip/InfoBipApiResource.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import org.springframework.beans.factory.annotation.Autowired;
2727
import org.springframework.http.HttpStatus;
2828
import org.springframework.http.ResponseEntity;
29-
import org.springframework.web.bind.annotation.ModelAttribute;
3029
import org.springframework.web.bind.annotation.PathVariable;
30+
import org.springframework.web.bind.annotation.RequestBody;
3131
import org.springframework.web.bind.annotation.RequestMapping;
3232
import org.springframework.web.bind.annotation.RequestMethod;
3333
import org.springframework.web.bind.annotation.RestController;
@@ -49,16 +49,12 @@ public InfoBipApiResource(final SmsOutboundMessageRepository smsOutboundMessageR
4949
}
5050

5151
@RequestMapping(value = "/report/{messageId}", method = RequestMethod.POST, consumes = {"application/json"}, produces = {"application/json"})
52-
public ResponseEntity<Void> updateDeliveryStatus(@PathVariable("messageId") final Long messageId, @ModelAttribute final SMSReportResponse payload) {
52+
public ResponseEntity<Void> updateDeliveryStatus(@PathVariable("messageId") final Long messageId, @RequestBody final SMSReportResponse payload) {
5353
SMSMessage message = this.smsOutboundMessageRepository.findOne(messageId) ;
5454
if(message != null) {
5555
SMSReport report = payload.getResults().get(0) ;
56-
logger.info("Status Callback received from InfoBip for "+messageId+" with status:"+report.getStatus());
57-
logger.info("Status Callback received from InfoBip for "+messageId+" with messageid:"+report.getMessageId());
58-
logger.info("Status Callback received from InfoBip for "+messageId+" with groupname:"+report.getStatus().getGroupName());
59-
logger.info("Status Callback received from InfoBip for "+messageId+" with name:"+report.getStatus().getName());
60-
logger.info("Status Callback received from InfoBip for "+messageId+" with groupname:"+report.getStatus().getAction());
61-
message.setDeliveryStatus(SmsMessageStatusType.DELIVERED.getValue());
56+
logger.debug("Status Callback received from InfoBip for "+messageId+" with status:"+report.getStatus());
57+
message.setDeliveryStatus(InfoBipStatus.smsStatus(report.getStatus().getGroupId()).getValue());
6258
this.smsOutboundMessageRepository.save(message) ;
6359
}else {
6460
logger.info("Message with Message id "+messageId+" Not found");

src/main/java/org/fineract/messagegateway/sms/providers/impl/infobip/InfoBipMessageProvider.java

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,15 @@
1818
*/
1919
package org.fineract.messagegateway.sms.providers.impl.infobip;
2020

21-
import java.util.Base64;
2221
import java.util.Collections;
2322
import java.util.HashMap;
2423

2524
import org.fineract.messagegateway.configuration.HostConfig;
25+
import org.fineract.messagegateway.constants.MessageGatewayConstants;
2626
import org.fineract.messagegateway.exception.MessageGatewayException;
2727
import org.fineract.messagegateway.sms.domain.SMSBridge;
2828
import org.fineract.messagegateway.sms.domain.SMSMessage;
2929
import org.fineract.messagegateway.sms.providers.SMSProvider;
30-
import org.fineract.messagegateway.sms.providers.impl.twilio.TwilioMessageConstants;
3130
import org.slf4j.Logger;
3231
import org.slf4j.LoggerFactory;
3332
import org.springframework.beans.factory.annotation.Autowired;
@@ -42,7 +41,7 @@
4241
import infobip.api.model.sms.mt.send.textual.SMSAdvancedTextualRequest;
4342

4443
@Service(value = "InfoBip")
45-
public class InfoBipMessageProvider implements SMSProvider {
44+
public class InfoBipMessageProvider extends SMSProvider {
4645

4746
private static final Logger logger = LoggerFactory.getLogger(InfoBipMessageProvider.class);
4847

@@ -61,12 +60,14 @@ public InfoBipMessageProvider(final HostConfig hostConfig) {
6160
@Override
6261
public void sendMessage(SMSBridge smsBridgeConfig, SMSMessage message) throws MessageGatewayException {
6362
String statusCallback = callBackUrl+message.getId() ;
63+
//Based on message id, register call back. so that we get notification from Infobip about message status
6464
SendMultipleTextualSmsAdvanced client = getRestClient(smsBridgeConfig) ;
6565
Destination destination = new Destination();
6666
builder.setLength(0);
6767
builder.append(smsBridgeConfig.getCountryCode()) ;
6868
builder.append(message.getMobileNumber()) ;
6969
String mobile = builder.toString() ;
70+
logger.info("Sending SMS to " + mobile + " ...");
7071
destination.setTo(mobile);
7172
Message infoBipMessage = new Message();
7273
infoBipMessage.setDestinations(Collections.singletonList(destination));
@@ -79,12 +80,8 @@ public void sendMessage(SMSBridge smsBridgeConfig, SMSMessage message) throws Me
7980
SMSResponse response = client.execute(requestBody);
8081
SMSResponseDetails sentMessageInfo = response.getMessages().get(0);
8182
message.setExternalId(sentMessageInfo.getMessageId());
82-
logger.info("Status Callback received from InfoBip for "+" with status:"+sentMessageInfo.getStatus());
83-
logger.info("Status Callback received from InfoBip for "+" with messageid:"+sentMessageInfo.getMessageId());
84-
logger.info("Status Callback received from InfoBip for "+" with groupname:"+sentMessageInfo.getStatus().getGroupName());
85-
logger.info("Status Callback received from InfoBip for "+" with name:"+sentMessageInfo.getStatus().getName());
86-
logger.info("Status Callback received from InfoBip for "+" with groupname:"+sentMessageInfo.getStatus().getAction());
87-
//message.setDeliveryStatus(sentMessageInfo.getStatus().);
83+
message.setDeliveryStatus(InfoBipStatus.smsStatus(sentMessageInfo.getStatus().getGroupId()).getValue());
84+
logger.debug("InfoBipMessageProvider.sendMessage():"+InfoBipStatus.smsStatus(sentMessageInfo.getStatus().getGroupId()).getValue());
8885
}
8986

9087

@@ -95,22 +92,14 @@ private SendMultipleTextualSmsAdvanced getRestClient(final SMSBridge smsBridge)
9592
client = this.get(smsBridge) ;
9693
this.restClients.put(authorizationKey, client) ;
9794
}
98-
return client ;
95+
return client ;
9996
}
10097

10198
SendMultipleTextualSmsAdvanced get(final SMSBridge smsBridgeConfig) {
10299
logger.debug("Creating a new InfoBip Client ....");
103-
String userName = smsBridgeConfig.getConfigValue(TwilioMessageConstants.PROVIDER_ACCOUNT_ID) ;
104-
String password = smsBridgeConfig.getConfigValue(TwilioMessageConstants.PROVIDER_AUTH_TOKEN) ;
100+
String userName = smsBridgeConfig.getConfigValue(MessageGatewayConstants.PROVIDER_ACCOUNT_ID) ;
101+
String password = smsBridgeConfig.getConfigValue(MessageGatewayConstants.PROVIDER_AUTH_TOKEN) ;
105102
final SendMultipleTextualSmsAdvanced client = new SendMultipleTextualSmsAdvanced(new BasicAuthConfiguration(userName, password));
106103
return client;
107104
}
108-
109-
private String encodeBase64(final SMSBridge smsBridgeConfig) {
110-
String tenant = smsBridgeConfig.getTenantId().toString() ;
111-
String username = smsBridgeConfig.getConfigValue(TwilioMessageConstants.PROVIDER_ACCOUNT_ID) ;
112-
String password = smsBridgeConfig.getConfigValue(TwilioMessageConstants.PROVIDER_AUTH_TOKEN) ;
113-
String userPass = username + ":" + password + ":" + tenant;
114-
return Base64.getEncoder().encodeToString(userPass.getBytes());
115-
}
116105
}

src/main/java/org/fineract/messagegateway/sms/providers/impl/infobip/InfoBipStatus.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,47 +21,47 @@
2121

2222
import org.fineract.messagegateway.sms.util.SmsMessageStatusType;
2323

24-
import com.twilio.rest.api.v2010.account.Message;
2524

2625
public class InfoBipStatus {
2726

28-
public static SmsMessageStatusType smsStatus(final Message.Status twilioStatus) {
27+
public static SmsMessageStatusType smsStatus(final String twilioStatus) {
2928
SmsMessageStatusType smsStatus = SmsMessageStatusType.PENDING;
30-
switch(twilioStatus.toString()) {
31-
case "queued":
32-
case "sending":
29+
switch(twilioStatus) {
30+
case "PENDING":
31+
case "ACCEPTED":
3332
smsStatus = SmsMessageStatusType.WAITING_FOR_REPORT ;
3433
break ;
3534
case "sent" :
3635
smsStatus = SmsMessageStatusType.SENT ;
3736
break ;
38-
case "delivered":
37+
case "DELIVERED":
3938
smsStatus = SmsMessageStatusType.DELIVERED;
4039
break ;
41-
case "undelivered":
42-
case "failed":
40+
case "UNDELIVERABLE":
41+
case "EXPIRED" :
42+
case "REJECTED":
4343
smsStatus = SmsMessageStatusType.FAILED ;
4444
break ;
4545
}
4646
return smsStatus ;
4747
}
4848

49-
public static SmsMessageStatusType smsStatus(final String twilioStatus) {
49+
public static SmsMessageStatusType smsStatus(final Integer infoBipStatus) {
5050
SmsMessageStatusType smsStatus = SmsMessageStatusType.PENDING;
51-
switch(twilioStatus) {
52-
case "queued":
53-
case "sending":
51+
switch(infoBipStatus) {
52+
case 0:
5453
smsStatus = SmsMessageStatusType.WAITING_FOR_REPORT ;
55-
break ;
56-
case "sent" :
54+
case 1:
5755
smsStatus = SmsMessageStatusType.SENT ;
58-
break ;
59-
case "delivered":
60-
smsStatus = SmsMessageStatusType.DELIVERED;
6156
break ;
62-
case "undelivered":
63-
case "failed":
64-
smsStatus = SmsMessageStatusType.FAILED ;
57+
case 2:
58+
case 4:
59+
case 5:
60+
smsStatus = SmsMessageStatusType.FAILED;
61+
break ;
62+
63+
case 3:
64+
smsStatus = SmsMessageStatusType.DELIVERED;
6565
break ;
6666
}
6767
return smsStatus ;

src/main/java/org/fineract/messagegateway/sms/providers/impl/twilio/TwilioMessageConstants.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/main/java/org/fineract/messagegateway/sms/providers/impl/twilio/TwilioMessageProvider.java

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
*/
1919
package org.fineract.messagegateway.sms.providers.impl.twilio;
2020

21-
import java.util.ArrayList;
2221
import java.util.Date;
2322
import java.util.HashMap;
2423

2524
import org.fineract.messagegateway.configuration.HostConfig;
25+
import org.fineract.messagegateway.constants.MessageGatewayConstants;
2626
import org.fineract.messagegateway.exception.MessageGatewayException;
2727
import org.fineract.messagegateway.sms.domain.SMSBridge;
2828
import org.fineract.messagegateway.sms.domain.SMSMessage;
@@ -40,11 +40,11 @@
4040
import com.twilio.type.PhoneNumber;
4141

4242
@Service(value="Twilio")
43-
public class TwilioMessageProvider implements SMSProvider {
43+
public class TwilioMessageProvider extends SMSProvider {
4444

4545
private static final Logger logger = LoggerFactory.getLogger(TwilioMessageProvider.class);
4646

47-
private HashMap<Object, ArrayList<TwilioRestClient>> restClients = new HashMap<>() ; //tenantId, twilio clients
47+
private HashMap<String, TwilioRestClient> restClients = new HashMap<>() ; //tenantId, twilio clients
4848

4949

5050
private final String callBackUrl ;
@@ -90,32 +90,19 @@ public void sendMessage(final SMSBridge smsBridgeConfig, final SMSMessage messag
9090
}
9191

9292
private TwilioRestClient getRestClient(final SMSBridge smsBridge) {
93-
TwilioRestClient client = null ;
94-
ArrayList<TwilioRestClient> tenantsClients = this.restClients.get(smsBridge.getTenantId()) ;
95-
if(tenantsClients == null) {
96-
tenantsClients = new ArrayList<>() ;
97-
client = this.get(smsBridge) ;
98-
tenantsClients.add(client) ;
99-
this.restClients.put(smsBridge.getTenantId(), tenantsClients) ;
100-
}else {
101-
for(TwilioRestClient client1: tenantsClients) {
102-
if(client1.getAccountSid().equals(smsBridge.getConfigValue(TwilioMessageConstants.PROVIDER_ACCOUNT_ID))) {
103-
client = client1 ;
104-
break ;
105-
}
106-
}
107-
if(client == null) {
108-
client = this.get(smsBridge) ;
109-
tenantsClients.add(client) ;
110-
}
111-
}
112-
return client ;
93+
String authorizationKey = encodeBase64(smsBridge) ;
94+
TwilioRestClient client = this.restClients.get(authorizationKey) ;
95+
if(client == null) {
96+
client = this.get(smsBridge) ;
97+
this.restClients.put(authorizationKey, client) ;
98+
}
99+
return client ;
113100
}
114101

115102
TwilioRestClient get(final SMSBridge smsBridgeConfig) {
116103
logger.debug("Creating a new Twilio Client ....");
117-
String providerAccountId = smsBridgeConfig.getConfigValue(TwilioMessageConstants.PROVIDER_ACCOUNT_ID) ;
118-
String providerAuthToken = smsBridgeConfig.getConfigValue(TwilioMessageConstants.PROVIDER_AUTH_TOKEN) ;
104+
String providerAccountId = smsBridgeConfig.getConfigValue(MessageGatewayConstants.PROVIDER_ACCOUNT_ID) ;
105+
String providerAuthToken = smsBridgeConfig.getConfigValue(MessageGatewayConstants.PROVIDER_AUTH_TOKEN) ;
119106
final TwilioRestClient client = new TwilioRestClient.Builder(providerAccountId, providerAuthToken).build();
120107
return client;
121108
}

src/main/java/org/fineract/messagegateway/sms/serialization/SmsBridgeSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.fineract.messagegateway.helpers.ApiParameterError;
2929
import org.fineract.messagegateway.helpers.DataValidatorBuilder;
3030
import org.fineract.messagegateway.helpers.FromJsonHelper;
31-
import org.fineract.messagegateway.sms.SmsConstants;
31+
import org.fineract.messagegateway.sms.constants.SmsConstants;
3232
import org.fineract.messagegateway.sms.domain.SMSBridge;
3333
import org.fineract.messagegateway.sms.domain.SMSBridgeConfig;
3434
import org.fineract.messagegateway.tenants.domain.Tenant;

0 commit comments

Comments
 (0)