Skip to content

Commit

Permalink
BS-232 Created separate query to find messages by smpp message id wit…
Browse files Browse the repository at this point in the history
…hin a given date
  • Loading branch information
hrosa committed Jun 8, 2018
1 parent a94bed4 commit 8bed8ee
Show file tree
Hide file tree
Showing 8 changed files with 82 additions and 45 deletions.
Expand Up @@ -125,4 +125,11 @@
order by date_created
LIMIT #{limit} OFFSET #{offset}
</select>

<select id="findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc" parameterType="map" resultType="hashmap">
SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages"
WHERE "smpp_message_id" = #{smppMessageId}
AND "date_created" &gt;= #{startDate}
ORDER BY "date_created" DESC
</select>
</mapper>
Expand Up @@ -125,5 +125,11 @@
order by "date_created"
LIMIT #{limit} OFFSET #{offset}
</select>
<select id="findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc" parameterType="map" resultType="hashmap">
SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages"
WHERE "smpp_message_id" = #{smppMessageId}
AND "date_created" &gt;= #{startDate}
ORDER BY "date_created" DESC
</select>

</mapper>
Expand Up @@ -22,6 +22,7 @@
import java.text.ParseException;
import java.util.List;

import org.joda.time.DateTime;
import org.restcomm.connect.commons.dao.Sid;
import org.restcomm.connect.dao.entities.SmsMessage;
import org.restcomm.connect.dao.entities.SmsMessageFilter;
Expand Down Expand Up @@ -53,4 +54,6 @@ public interface SmsMessagesDao {
// Support for filtering of message list result, Issue 1395
Integer getTotalSmsMessage(SmsMessageFilter filter);
List<SmsMessage> getSmsMessages(SmsMessageFilter filter);

List<SmsMessage> findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(String smppMessageId, DateTime startDate);
}
Expand Up @@ -22,6 +22,8 @@
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.restcomm.connect.commons.annotations.concurrency.ThreadSafe;
import org.restcomm.connect.commons.dao.Sid;
import org.restcomm.connect.dao.SmsMessagesDao;
Expand All @@ -33,6 +35,7 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Currency;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -205,6 +208,28 @@ public int getSmsMessagesPerAccountLastPerMinute(String accountSid) throws Parse
}
}

@Override
public List<SmsMessage> findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(String smppMessageId, DateTime startDate) {
final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
final Map<String, Object> parameters = new HashMap<>(2);
parameters.put("smppMessageId", smppMessageId);
parameters.put("startDate", formatter.print(startDate.withTime(0, 0, 0, 0)));

final SqlSession session = this.sessions.openSession();

try {
final List<Map<String, Object>> results = session.selectList(namespace + "findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc", parameters);
final List<SmsMessage> messages = new ArrayList<>(results.size());

for (Map<String, Object> result: results) {
messages.add(toSmsMessage(result));
}
return messages;
} finally {
session.close();
}
}

private Map<String, Object> toMap(final SmsMessage smsMessage) {
final Map<String, Object> map = new HashMap<String, Object>();
map.put("sid", writeSid(smsMessage.getSid()));
Expand Down
Expand Up @@ -6,8 +6,8 @@
<mapper namespace="org.mobicents.servlet.sip.restcomm.dao.SmsMessagesDao">
<insert id="addSmsMessage" parameterType="map">
INSERT INTO "restcomm_sms_messages" ("sid", "date_created", "date_updated", "date_sent", "account_sid", "sender", "recipient", "body", "status", "direction", "price",
"api_version", "uri") VALUES (#{sid}, #{date_created}, #{date_updated}, #{date_sent}, #{account_sid}, #{sender}, #{recipient}, #{body},
#{status}, #{direction}, #{price}, #{api_version}, #{uri});
"api_version", "uri", "smpp_message_id") VALUES (#{sid}, #{date_created}, #{date_updated}, #{date_sent}, #{account_sid}, #{sender}, #{recipient}, #{body},
#{status}, #{direction}, #{price}, #{api_version}, #{uri}, #{smpp_message_id});
</insert>

<select id="getSmsMessage" parameterType="string" resultType="hashmap">
Expand Down Expand Up @@ -126,5 +126,12 @@
order by "date_created"
LIMIT #{limit} OFFSET #{offset}
</select>

<select id="findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc" parameterType="map" resultType="hashmap">
SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages"
WHERE "smpp_message_id" = #{smppMessageId}
AND "date_created" &gt;= #{startDate}
ORDER BY "date_created" DESC
</select>

</mapper>
Expand Up @@ -243,7 +243,7 @@ public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId(){
}

@Test
public void testGetSmsMessagesWithSmppMessageFromLastThreeDays() throws InterruptedException, ParseException {
public void testFindBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc() {
// given
final SmsMessagesDao smsMessagesDao = manager.getSmsMessagesDao();
final Sid accountSid = Sid.generate(Sid.Type.ACCOUNT);
Expand All @@ -257,17 +257,25 @@ public void testGetSmsMessagesWithSmppMessageFromLastThreeDays() throws Interrup
final SmsMessage smsMessage3 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 2, threeDaysAgo, smppMessageId);
final SmsMessage smsMessage4 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 3, threeDaysAgo, null);

final DateTime yesterdar = DateTime.now().minusDays(1);
final SmsMessage smsMessage5 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 4, threeDaysAgo, smppMessageId);
final DateTime yesterday = DateTime.now().minusDays(1);
final SmsMessage smsMessage5 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 4, yesterday, smppMessageId);

final DateTime today = DateTime.now();
final SmsMessage smsMessage6 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 5, today, smppMessageId);
final SmsMessage smsMessage7 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 6, today, null);

final SmsMessageFilter filter = SmsMessageFilter.builer().smppMessageId(smppMessageId).endTime(threeDaysAgo).build();
final SmsMessageFilter filter = SmsMessageFilter.builer().accountSid(accountSid.toString()).smppMessageId(smppMessageId).startTime(threeDaysAgo).build();

// when
final List<SmsMessage> messages = smsMessagesDao.getSmsMessages(filter);
smsMessagesDao.addSmsMessage(smsMessage1);
smsMessagesDao.addSmsMessage(smsMessage2);
smsMessagesDao.addSmsMessage(smsMessage3);
smsMessagesDao.addSmsMessage(smsMessage4);
smsMessagesDao.addSmsMessage(smsMessage5);
smsMessagesDao.addSmsMessage(smsMessage6);
smsMessagesDao.addSmsMessage(smsMessage7);

final List<SmsMessage> messages = smsMessagesDao.findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(smppMessageId, threeDaysAgo);

try {
assertEquals(3, messages.size());
Expand Down
Expand Up @@ -151,8 +151,7 @@ public void onReceive(Object message) throws Exception {
}

// Find all messages correlated with SMPP Message ID in last three days
final SmsMessageFilter filter = SmsMessageFilter.builer().smppMessageId(deliveryReceipt.getId()).endTime(DateTime.now().minusDays(3)).build();
final List<SmsMessage> smsMessages = this.storage.getSmsMessagesDao().getSmsMessages(filter);
final List<SmsMessage> smsMessages = this.storage.getSmsMessagesDao().findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(smppMessageId, DateTime.now().minusDays(3));

// Update status of messages and remove correlation with SMPP Message ID
// IMPORTANT: First message in the results list is considered the real target of the DLR
Expand Down
Expand Up @@ -19,51 +19,43 @@
*/
package org.restcomm.connect.sms.smpp;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

import akka.actor.Actor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.japi.Creator;
import akka.testkit.JavaTestKit;
import com.cloudhopper.commons.util.windowing.WindowFuture;
import com.cloudhopper.smpp.PduAsyncResponse;
import com.cloudhopper.smpp.impl.DefaultPduAsyncResponse;
import com.cloudhopper.smpp.pdu.PduRequest;
import com.cloudhopper.smpp.pdu.PduResponse;
import com.cloudhopper.smpp.pdu.SubmitSmResp;
import org.apache.commons.configuration.Configuration;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.mockito.ArgumentCaptor;
import org.restcomm.connect.commons.dao.Sid;
import org.restcomm.connect.core.service.api.NumberSelectorService;
import org.restcomm.connect.dao.DaoManager;
import org.restcomm.connect.dao.SmsMessagesDao;
import org.restcomm.connect.dao.entities.IncomingPhoneNumber;
import org.restcomm.connect.dao.entities.SmsMessage;
import org.restcomm.connect.dao.entities.SmsMessageFilter;
import org.restcomm.connect.monitoringservice.MonitoringService;
import org.restcomm.connect.sms.smpp.dlr.spi.DLRPayload;

import javax.servlet.ServletContext;
import javax.servlet.sip.SipFactory;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

/**
* @author Henrique Rosa (henrique.rosa@telestax.com)
Expand Down Expand Up @@ -162,7 +154,7 @@ public void testOnReceiveDlrPayload() throws ParseException {
when(servletContext.getAttribute(NumberSelectorService.class.getName())).thenReturn(mock(NumberSelectorService.class));

when(daoManager.getSmsMessagesDao()).thenReturn(smsMessagesDao);
when(smsMessagesDao.getSmsMessages(any(SmsMessageFilter.class))).thenReturn(messages);
when(smsMessagesDao.findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), any(DateTime.class))).thenReturn(messages);

final ActorRef messageHandler = system.actorOf(Props.apply(new Creator<Actor>() {
@Override
Expand All @@ -175,14 +167,9 @@ public Actor create() throws Exception {
messageHandler.tell(dlrPayload, getRef());

// then
final ArgumentCaptor<SmsMessageFilter> filterCaptor = ArgumentCaptor.forClass(SmsMessageFilter.class);
verify(smsMessagesDao, timeout(50)).getSmsMessages(filterCaptor.capture());

final SmsMessageFilter filter = filterCaptor.getValue();
assertEquals(dlrPayload.getId(), filter.getSmppMessageId());

final DateTime endDate = SmsMessageFilter.DATE_TIME_FORMATTER.parseDateTime(filter.getEndTime());
assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.toDate().getTime(), TimeUnit.MILLISECONDS));
final ArgumentCaptor<DateTime> dateCaptor = ArgumentCaptor.forClass(DateTime.class);
verify(smsMessagesDao, timeout(50)).findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), dateCaptor.capture());
assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - dateCaptor.getValue().toDate().getTime(), TimeUnit.MILLISECONDS));

final ArgumentCaptor<SmsMessage> smsCaptor = ArgumentCaptor.forClass(SmsMessage.class);
verify(smsMessagesDao, timeout(50).times(3)).updateSmsMessage(smsCaptor.capture());
Expand Down Expand Up @@ -218,7 +205,7 @@ public void testOnReceiveDlrPayloadForUnknownSms() throws ParseException {
final List<SmsMessage> messages = Collections.emptyList();

when(daoManager.getSmsMessagesDao()).thenReturn(smsMessagesDao);
when(smsMessagesDao.getSmsMessages(any(SmsMessageFilter.class))).thenReturn(messages);
when(smsMessagesDao.findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), any(DateTime.class))).thenReturn(messages);

final ActorRef messageHandler = system.actorOf(Props.apply(new Creator<Actor>() {
@Override
Expand All @@ -231,14 +218,9 @@ public Actor create() throws Exception {
messageHandler.tell(dlrPayload, getRef());

// then
final ArgumentCaptor<SmsMessageFilter> filterCaptor = ArgumentCaptor.forClass(SmsMessageFilter.class);
verify(smsMessagesDao, timeout(50)).getSmsMessages(filterCaptor.capture());

final SmsMessageFilter filter = filterCaptor.getValue();
assertEquals(dlrPayload.getId(), filter.getSmppMessageId());

final DateTime endDate = SmsMessageFilter.DATE_TIME_FORMATTER.parseDateTime(filter.getEndTime());
assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.toDate().getTime(), TimeUnit.MILLISECONDS));
final ArgumentCaptor<DateTime> dateCaptor = ArgumentCaptor.forClass(DateTime.class);
verify(smsMessagesDao, timeout(50)).findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), dateCaptor.capture());
assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - dateCaptor.getValue().toDate().getTime(), TimeUnit.MILLISECONDS));

verify(smsMessagesDao, never()).updateSmsMessage(any(SmsMessage.class));
}
Expand Down

0 comments on commit 8bed8ee

Please sign in to comment.