diff --git a/avni-server-api/src/main/java/org/avni/messaging/api/MessageController.java b/avni-server-api/src/main/java/org/avni/messaging/api/MessageController.java index 22292119d..8731386b5 100644 --- a/avni-server-api/src/main/java/org/avni/messaging/api/MessageController.java +++ b/avni-server-api/src/main/java/org/avni/messaging/api/MessageController.java @@ -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; @@ -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; @@ -61,6 +68,23 @@ public ResponseEntity> fetchAllMsgsNotYetSentForCon .collect(Collectors.toList())); } + @RequestMapping(value = MessageEndpoint + "/sendMsg", method = RequestMethod.POST) + @PreAuthorize(value = "hasAnyAuthority('user')") + @Transactional + public ResponseEntity 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) diff --git a/avni-server-api/src/main/java/org/avni/messaging/service/MessagingService.java b/avni-server-api/src/main/java/org/avni/messaging/service/MessagingService.java index 175c71993..c4cdb634c 100644 --- a/avni-server-api/src/main/java/org/avni/messaging/service/MessagingService.java +++ b/avni-server-api/src/main/java/org/avni/messaging/service/MessagingService.java @@ -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; @@ -130,6 +131,18 @@ public Page 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())); @@ -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); diff --git a/makefiles/staging.mk b/makefiles/staging.mk index 07b5b6aa3..5eb637f00 100644 --- a/makefiles/staging.mk +++ b/makefiles/staging.mk @@ -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