Skip to content

Commit

Permalink
#836 | Synchronously Send Manual Message
Browse files Browse the repository at this point in the history
  • Loading branch information
himeshr committed Dec 23, 2024
1 parent c116058 commit 53056e7
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
package org.avni.messaging.api;

import org.avni.messaging.contract.ManualMessageContract;
import org.avni.messaging.contract.glific.GlificMessageTemplate;
import org.avni.messaging.contract.web.MessageRequestResponse;
import org.avni.messaging.domain.MessageDeliveryStatus;
import org.avni.messaging.domain.MessageRequest;
import org.avni.messaging.domain.ReceiverType;
import org.avni.messaging.domain.exception.GlificNotConfiguredException;
import org.avni.messaging.service.MessageRequestService;
import org.avni.messaging.service.MessageTemplateService;
import org.avni.messaging.service.MessagingService;
import org.avni.messaging.service.PhoneNumberNotAvailableOrIncorrectException;
import org.avni.server.dao.UserRepository;
import org.avni.server.domain.accessControl.PrivilegeType;
import org.avni.server.service.IndividualService;
import org.avni.server.service.accessControl.AccessControlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -25,15 +28,19 @@
@RestController
public class MessageController {
private static final String MessageEndpoint = "/web/message";
private final AccessControlService accessControlService;
private final MessageRequestService messageRequestService;
private final MessagingService messagingService;
private final UserRepository userRepository;
private final IndividualService individualService;
private final MessageTemplateService messageTemplateService;

@Autowired
public MessageController(MessageRequestService messageRequestService, UserRepository userRepository,
public MessageController(AccessControlService accessControlService, MessageRequestService messageRequestService, MessagingService messagingService, UserRepository userRepository,
IndividualService individualService, MessageTemplateService messageTemplateService) {
this.accessControlService = accessControlService;
this.messageRequestService = messageRequestService;
this.messagingService = messagingService;
this.userRepository = userRepository;
this.individualService = individualService;
this.messageTemplateService = messageTemplateService;
Expand Down Expand Up @@ -61,6 +68,23 @@ public ResponseEntity<List<MessageRequestResponse>> fetchAllMsgsNotYetSentForCon
.collect(Collectors.toList()));
}

@RequestMapping(value = MessageEndpoint + "/sendMsg", method = RequestMethod.POST)
@PreAuthorize(value = "hasAnyAuthority('user')")
@Transactional
public ResponseEntity<MessageDeliveryStatus> sendMsgToContactUser(@RequestBody ManualMessageContract manualMessageContract) {
accessControlService.checkPrivilege(PrivilegeType.Messaging);
accessControlService.checkPrivilege(PrivilegeType.EditUserConfiguration);

try {
messagingService.sendMessageSynchronously(manualMessageContract);
} catch (GlificNotConfiguredException | PhoneNumberNotAvailableOrIncorrectException e) {
return ResponseEntity.badRequest().body(MessageDeliveryStatus.NotSent);
} catch (Exception e) {
return ResponseEntity.internalServerError().body(MessageDeliveryStatus.Failed);
}
return ResponseEntity.ok(MessageDeliveryStatus.Sent);
}

@RequestMapping(value = MessageEndpoint + "/contactGroup/{id}/msgsNotYetSent", method = RequestMethod.GET)
@PreAuthorize(value = "hasAnyAuthority('user')")
@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.avni.messaging.service;

import com.bugsnag.Bugsnag;
import org.avni.messaging.contract.ManualMessageContract;
import org.avni.messaging.contract.MessageRuleContract;
import org.avni.messaging.domain.*;
import org.avni.messaging.domain.exception.GlificGroupMessageFailureException;
Expand Down Expand Up @@ -130,6 +131,18 @@ public Page<MessageRule> findByEntityTypeAndEntityTypeId(EntityType entityType,
return messageRuleRepository.findByEntityTypeAndEntityTypeId(entityType, entityTypeId, pageable);
}

@Transactional
public void sendMessageSynchronously(ManualMessageContract manualMessageContract)
throws GlificNotConfiguredException, RuleExecutionException, PhoneNumberNotAvailableOrIncorrectException {
ManualMessage manualMessage = new ManualMessage(manualMessageContract.getMessageTemplateId(), manualMessageContract.getParameters());
manualMessage.assignUUIDIfRequired();
MessageReceiver messageReceiver = messageReceiverService.saveReceiverIfRequired(manualMessageContract.getReceiverType(),
new Long(manualMessageContract.getReceiverId()));
MessageRequest messageRequest = new MessageRequest(manualMessage, messageReceiver, manualMessageContract.getScheduledDateTime());
messageRequest.assignUUIDIfRequired();
sendMessageToGlific(messageRequest);
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public MessageRequest sendMessage(MessageRequest messageRequest) {
logger.debug(String.format("Sending message for %d", messageRequest.getId()));
Expand Down Expand Up @@ -170,8 +183,8 @@ public void scheduleManualMessage(String receiverId, ReceiverType receiverType,
messageRequestService.createManualMessageRequest(manualMessage, messageReceiver, scheduledDateTime);
}

private void sendMessageToGlific(MessageRequest messageRequest) throws PhoneNumberNotAvailableOrIncorrectException, RuleExecutionException, GlificNotConfiguredException {
if(messageRequest.getManualMessage() != null)
public void sendMessageToGlific(MessageRequest messageRequest) throws PhoneNumberNotAvailableOrIncorrectException, RuleExecutionException, GlificNotConfiguredException {
if (messageRequest.getManualMessage() != null)
sendManualMessage(messageRequest);
else
individualMessagingService.sendAutomatedMessage(messageRequest);
Expand Down
3 changes: 0 additions & 3 deletions makefiles/staging.mk
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
# I have setup the environment variables in my bash_profile so that I can just run it whenever I want in live mode. You could do that too (Vivek).
tunnel_staging_db:
ssh avni-staging -L 6015:stagingdb.openchs.org:5432

tunnel_staging_server_for_debug:
ssh avni-staging -L 5005:127.0.0.1:5005

Expand Down

0 comments on commit 53056e7

Please sign in to comment.