public MessageProcessResult ProcessOutboundMessage(OutboundMessageRequest outboundRequest)
        {
            var result = new MessageProcessResult();

            try
            {
                // send to postmark
                var postmarkClient = _clientFactory.GetClient(_configurationProvider);
                var response       = postmarkClient.SendPostmarkMessage(outboundRequest);

                // everything went smooth - update message data received from postmark and insert to database
                var newMessage = Mapper.Map <OutboundMessageRequest, OutboundMessageDto>(outboundRequest);
                newMessage.PostmarkMessageId = response.MessageId;
                newMessage.PostmarkErrorCode = response.ErrorCode;
                newMessage.SubmittedAt       = response.SubmittedAt;
                newMessage.PostmarkStatus    = response.Status;
                newMessage.StatusId          = (byte)OutboundMessageStatus.Sent;

                _mailBoxRepository.InsertOutboundMessage(newMessage);

                // update process result status correspondingly
                result.Status  = ProcessingStatus.Success;
                result.Message = response.Status;
            }
            catch (Exception e)
            {
                // there has been an error while processing message
                result.Status  = ProcessingStatus.Error;
                result.Message = $"{e.Message} {e.InnerException?.Message}";
            }

            return(result);
        }
        public OutboundMessagePostmarkResponse SendPostmarkMessage(OutboundMessageRequest messageRequest)
        {
            if (messageRequest == null)
            {
                throw new ArgumentNullException(nameof(messageRequest));
            }

            var postmarkMessage = Mapper.Map <OutboundMessageRequest, PostmarkMessage>(messageRequest);

            var postmarkClient = new PostmarkDotNet.PostmarkClient(_serverToken);

            var postmarkResponse = new PostmarkResponse();

            var task = Task.Run(async() =>
            {
                postmarkResponse = await postmarkClient.SendMessageAsync(postmarkMessage);
            });

            try
            {
                task.Wait();
            }
            catch (AggregateException ae)
            {
                var innerException = ae.InnerExceptions.FirstOrDefault();
                throw new CommunicationException("External service exception occured on SendPostmarkMessage.",
                                                 innerException);
            }

            return(Mapper.Map <PostmarkResponse, OutboundMessagePostmarkResponse>(postmarkResponse));
        }
        public HttpResponseMessage Post([FromBody] OutboundMessageRequest messageRequest)
        {
            // check if valid data is received
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }

            var processResult = _mailBoxManager.ProcessOutboundMessage(messageRequest);

            if (processResult.Status.IsSuccess())
            {
                return(Request.CreateResponse(HttpStatusCode.OK, processResult.Message));
            }

            var httpError = new HttpError(processResult.Message);

            return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, httpError));
        }