Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 19495c0

Browse files
author
barnabartha
committed
SORMAS-Foundation#3253 - add BE support for sending manual messages to persons of cases + add a message log to see who/when sent messages to a person
1 parent dd6a458 commit 19495c0

24 files changed

Lines changed: 344 additions & 37 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import de.symeda.sormas.api.CaseMeasure;
2828
import de.symeda.sormas.api.Disease;
2929
import de.symeda.sormas.api.Language;
30+
import de.symeda.sormas.api.messaging.MessageType;
3031
import de.symeda.sormas.api.contact.ContactReferenceDto;
3132
import de.symeda.sormas.api.contact.DashboardQuarantineDataDto;
3233
import de.symeda.sormas.api.event.EventParticipantReferenceDto;
@@ -173,4 +174,8 @@ List<DashboardQuarantineDataDto> getQuarantineDataForDashBoard(
173174
Date to);
174175

175176
long countCasesConvertedFromContacts(CaseCriteria caseCriteria);
177+
178+
void sendMessage(List<String> caseUuids, String subject, String messageContent, MessageType... messageTypes);
179+
180+
long countCasesWithMissingMessageType(List<String> caseUuids, MessageType messageType);
176181
}

sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public enum FeatureType {
3535
INFRASTRUCTURE_TYPE_AREA(true, false, null),
3636
CASE_FOLLOWUP(true, false, null),
3737
TASK_NOTIFICATIONS(true, true, null),
38+
MANUAL_EXTERNAL_MESSAGES(true, true, null),
3839
OTHER_NOTIFICATIONS(true, true, null);
3940

4041
/**
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package de.symeda.sormas.api.messaging;
2+
3+
import java.io.Serializable;
4+
import java.util.Date;
5+
6+
import de.symeda.sormas.api.person.PersonReferenceDto;
7+
import de.symeda.sormas.api.user.UserReferenceDto;
8+
9+
public class ManualMessageLogDto implements Serializable {
10+
11+
private MessageType messageType;
12+
private Date sentDate;
13+
private UserReferenceDto sendingUser;
14+
private PersonReferenceDto recipientPerson;
15+
16+
public ManualMessageLogDto() {
17+
}
18+
19+
public ManualMessageLogDto(MessageType messageType, Date sentDate, UserReferenceDto sendingUser, PersonReferenceDto recipientPerson) {
20+
this.messageType = messageType;
21+
this.sentDate = sentDate;
22+
this.sendingUser = sendingUser;
23+
this.recipientPerson = recipientPerson;
24+
}
25+
26+
public MessageType getMessageType() {
27+
return messageType;
28+
}
29+
30+
public void setMessageType(MessageType messageType) {
31+
this.messageType = messageType;
32+
}
33+
34+
public Date getSentDate() {
35+
return sentDate;
36+
}
37+
38+
public void setSentDate(Date sentDate) {
39+
this.sentDate = sentDate;
40+
}
41+
42+
public UserReferenceDto getSendingUser() {
43+
return sendingUser;
44+
}
45+
46+
public void setSendingUser(UserReferenceDto sendingUser) {
47+
this.sendingUser = sendingUser;
48+
}
49+
50+
public PersonReferenceDto getRecipientPerson() {
51+
return recipientPerson;
52+
}
53+
54+
public void setRecipientPerson(PersonReferenceDto recipientPerson) {
55+
this.recipientPerson = recipientPerson;
56+
}
57+
}

sormas-backend/src/main/java/de/symeda/sormas/backend/common/MessageType.java renamed to sormas-api/src/main/java/de/symeda/sormas/api/messaging/MessageType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* You should have received a copy of the GNU General Public License
1616
* along with this program. If not, see <https://www.gnu.org/licenses/>.
1717
*******************************************************************************/
18-
package de.symeda.sormas.backend.common;
18+
package de.symeda.sormas.api.messaging;
1919

2020
public enum MessageType {
2121

sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,10 @@ public enum UserRight {
756756
SURVEILLANCE_SUPERVISOR,
757757
ADMIN_SUPERVISOR
758758
),
759+
SEND_MANUAL_EXTERNAL_MESSAGES(
760+
ADMIN,
761+
NATIONAL_USER
762+
),
759763
STATISTICS_ACCESS(
760764
ADMIN,
761765
NATIONAL_USER,

sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import de.symeda.sormas.api.Disease;
7070
import de.symeda.sormas.api.DiseaseHelper;
7171
import de.symeda.sormas.api.Language;
72+
import de.symeda.sormas.api.messaging.MessageType;
7273
import de.symeda.sormas.api.VisitOrigin;
7374
import de.symeda.sormas.api.caze.AgeAndBirthDateDto;
7475
import de.symeda.sormas.api.caze.BirthDateDto;
@@ -174,10 +175,9 @@
174175
import de.symeda.sormas.backend.common.AbstractAdoService;
175176
import de.symeda.sormas.backend.common.AbstractDomainObject;
176177
import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
177-
import de.symeda.sormas.backend.common.MessageSubject;
178-
import de.symeda.sormas.backend.common.MessageType;
179-
import de.symeda.sormas.backend.common.MessagingService;
180-
import de.symeda.sormas.backend.common.NotificationDeliveryFailedException;
178+
import de.symeda.sormas.backend.common.messaging.MessageSubject;
179+
import de.symeda.sormas.backend.common.messaging.MessagingService;
180+
import de.symeda.sormas.backend.common.messaging.NotificationDeliveryFailedException;
181181
import de.symeda.sormas.backend.contact.Contact;
182182
import de.symeda.sormas.backend.contact.ContactFacadeEjb;
183183
import de.symeda.sormas.backend.contact.ContactFacadeEjb.ContactFacadeEjbLocal;
@@ -3095,6 +3095,35 @@ public boolean isCaseEditAllowed(String caseUuid) {
30953095
return caseService.isCaseEditAllowed(caze);
30963096
}
30973097

3098+
@Override
3099+
public void sendMessage(List<String> caseUuids, String subject, String messageContent, MessageType... messageTypes) {
3100+
caseUuids.forEach(uuid -> {
3101+
final Case aCase = caseService.getByUuid(uuid);
3102+
final Person person = aCase.getPerson();
3103+
3104+
try {
3105+
messagingService.sendMessage(person, subject, messageContent, messageTypes);
3106+
} catch (NotificationDeliveryFailedException e) {
3107+
logger.error(
3108+
String.format(
3109+
"NotificationDeliveryFailedException when trying to notify person about: %s" + "Failed to send " + e.getMessageType()
3110+
+ " to person with UUID %s.",
3111+
subject,
3112+
person.getUuid()));
3113+
}
3114+
});
3115+
}
3116+
3117+
@Override
3118+
public long countCasesWithMissingMessageType(List<String> caseUuids, MessageType messageType) {
3119+
3120+
return caseService.count((cb, root) -> {
3121+
final Join<Object, Object> personJoin = root.join(Case.PERSON, JoinType.LEFT);
3122+
final String messageTypeColumn = messageType == MessageType.EMAIL ? Person.EMAIL_ADDRESS : Person.PHONE;
3123+
return cb.and(root.get(Case.ID).in(caseUuids), cb.isNull(personJoin.get(messageTypeColumn)));
3124+
});
3125+
}
3126+
30983127
@LocalBean
30993128
@Stateless
31003129
public static class CaseFacadeEjbLocal extends CaseFacadeEjb {

sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ public long count() {
104104
return count;
105105
}
106106

107+
public long count(BiFunction<CriteriaBuilder, Root<ADO>, Predicate> filterBuilder) {
108+
109+
CriteriaBuilder cb = em.getCriteriaBuilder();
110+
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
111+
Root<ADO> from = cq.from(getElementClass());
112+
cq.select(cb.count(from));
113+
cq.where(filterBuilder.apply(cb, from));
114+
long count = em.createQuery(cq).getSingleResult();
115+
return count;
116+
}
117+
107118
/**
108119
* @return null if no entry exists
109120
*/

sormas-backend/src/main/java/de/symeda/sormas/backend/common/EmailService.java renamed to sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/EmailService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* You should have received a copy of the GNU General Public License
1616
* along with this program. If not, see <https://www.gnu.org/licenses/>.
1717
*******************************************************************************/
18-
package de.symeda.sormas.backend.common;
18+
package de.symeda.sormas.backend.common.messaging;
1919

2020
import java.io.UnsupportedEncodingException;
2121

sormas-backend/src/main/java/de/symeda/sormas/backend/common/InvalidPhoneNumberException.java renamed to sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/InvalidPhoneNumberException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* You should have received a copy of the GNU General Public License
1616
* along with this program. If not, see <https://www.gnu.org/licenses/>.
1717
*******************************************************************************/
18-
package de.symeda.sormas.backend.common;
18+
package de.symeda.sormas.backend.common.messaging;
1919

2020
@SuppressWarnings("serial")
2121
public class InvalidPhoneNumberException extends Exception {
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package de.symeda.sormas.backend.common.messaging;
2+
3+
import java.util.Date;
4+
5+
import javax.persistence.Entity;
6+
import javax.persistence.EnumType;
7+
import javax.persistence.Enumerated;
8+
import javax.persistence.JoinColumn;
9+
import javax.persistence.ManyToOne;
10+
import javax.persistence.Temporal;
11+
import javax.persistence.TemporalType;
12+
13+
import de.symeda.auditlog.api.Audited;
14+
import de.symeda.sormas.api.messaging.MessageType;
15+
import de.symeda.sormas.backend.common.AbstractDomainObject;
16+
import de.symeda.sormas.backend.person.Person;
17+
import de.symeda.sormas.backend.user.User;
18+
19+
@Entity
20+
@Audited
21+
public class ManualMessageLog extends AbstractDomainObject {
22+
23+
public static final String TABLE_NAME = "manualmessagelog";
24+
25+
public static final String MESSAGE_TYPE = "messageType";
26+
public static final String SENT_DATE = "sentDate";
27+
public static final String SENDING_USER = "sendingUser";
28+
public static final String RECIPIENT_PERSON = "recipientPerson";
29+
30+
private MessageType messageType;
31+
private Date sentDate;
32+
private User sendingUser;
33+
private Person recipientPerson;
34+
35+
@Enumerated(EnumType.STRING)
36+
public MessageType getMessageType() {
37+
return messageType;
38+
}
39+
40+
public void setMessageType(MessageType messageType) {
41+
this.messageType = messageType;
42+
}
43+
44+
@Temporal(TemporalType.TIMESTAMP)
45+
public Date getSentDate() {
46+
return sentDate;
47+
}
48+
49+
public void setSentDate(Date sentDate) {
50+
this.sentDate = sentDate;
51+
}
52+
53+
@ManyToOne(cascade = {})
54+
@JoinColumn(nullable = false)
55+
public User getSendingUser() {
56+
return sendingUser;
57+
}
58+
59+
public void setSendingUser(User sendingUser) {
60+
this.sendingUser = sendingUser;
61+
}
62+
63+
@ManyToOne(cascade = {})
64+
@JoinColumn(nullable = false)
65+
public Person getRecipientPerson() {
66+
return recipientPerson;
67+
}
68+
69+
public void setRecipientPerson(Person recipientPerson) {
70+
this.recipientPerson = recipientPerson;
71+
}
72+
}

0 commit comments

Comments
 (0)