public HttpResponseMessage SendMessage(MessageResponceModel message,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))]
            string accessToken)
        {
                var data = new MessagesRepository(
                        ConfigurationManager.AppSettings["MongoConnectionString"],
                        ConfigurationManager.AppSettings["Database"]);
                var user = this.GetUserByAccessToken(accessToken, data.Db);

                if (user == null)
                {
                    return this.Request.CreateResponse(HttpStatusCode.Unauthorized);
                }

                message.Sender = user.Username + "@" + MailDomain;
                ValidateMessage(message);
                SendMessageToMailgun(message);
                DbMessageModel dbMessage = new DbMessageModel()
                {
                    BodyHtml = message.BodyHtml,
                    BodyPlain = message.BodyPlain,
                    Date = message.Date,
                    Recipient = message.Recipient,
                    Sender = message.Sender,
                    Subject = message.Subject,
                    Username = user.Username
                };

                data.SaveMessage(dbMessage);
                var response = this.Request.CreateResponse(HttpStatusCode.Created, message);
                return response;
        }
        public HttpResponseMessage ReceiveMessage()
        {
            return this.ExecuteOperationAndHandleExceptions(() =>
            {
                HttpResponseMessage result = null;
                var httpRequest = HttpContext.Current.Request;

                var data = new MessagesRepository(
                    ConfigurationManager.AppSettings["MongoConnectionString"],
                    ConfigurationManager.AppSettings["Database"]);

                var recipient = httpRequest.Unvalidated.Form["recipient"].Split('@');
                var recipientName = recipient[0].Trim();

                DbMessageModel model = new DbMessageModel()
                {

                    BodyHtml = httpRequest.Unvalidated.Form["body-html"],
                    BodyPlain = httpRequest.Unvalidated.Form["body-plain"],
                    Date = DateTime.Now,
                    Sender = httpRequest.Unvalidated.Form["from"],
                    Recipient = httpRequest.Unvalidated.Form["recipient"],
                    Subject = httpRequest.Unvalidated.Form["subject"],
                    Username = recipientName
                };

                data.Add(model);

                var responseModel = new MessageResponceModel
                {
                    Id = model.Id,
                    BodyHtml = model.BodyHtml,
                    BodyPlain = model.BodyPlain,
                    Date = model.Date,
                    Recipient = model.Recipient,
                    Sender = model.Sender,
                    Subject = model.Subject
                };

                var response = this.Request.CreateResponse(HttpStatusCode.Created, responseModel);
                return response;
            });
        }
        private void ValidateMessage(MessageResponceModel message)
        {
            if (message.BodyHtml != null && message.BodyPlain == null)
            {
                message.BodyPlain = "You need a HTML capable viewer to read this message!";
            }

            if (message.Recipient == null)
            {
                throw new ArgumentNullException("Recipient is required!");
            }

            string[] recepients = message.Recipient.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (var recepient in recepients)
            {
                ValidateEmail(recepient);
            }
        }
 private IRestResponse SendMessageToMailgun(MessageResponceModel message)
 {
     string apiKey = ConfigurationManager.AppSettings["MAILGUN_API_KEY"];
     string[] recepients = message.Recipient.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);
     RestClient client = new RestClient();
     client.BaseUrl = "https://api.mailgun.net/v2";
     client.Authenticator =
             new HttpBasicAuthenticator("api",
                                        apiKey);
     RestRequest request = new RestRequest();
     request.AddParameter("domain",
                          MailDomain, ParameterType.UrlSegment);
     request.Resource = "{domain}/messages";
     request.AddParameter("from", message.Sender);
     foreach (var recipient in recepients)
     {
         request.AddParameter("to", recipient);
     }
     
     request.AddParameter("subject", message.Subject);
     request.AddParameter("text", message.BodyPlain);
     request.AddParameter("html", message.BodyHtml);
     request.Method = Method.POST;
     return client.Execute(request);
 }
        public HttpResponseMessage GetMessage(string messageId,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))]
            string accessToken)
        {
            var data = new MessagesRepository(
                    ConfigurationManager.AppSettings["MongoConnectionString"],
                    ConfigurationManager.AppSettings["Database"]);
            var user = this.GetUserByAccessToken(accessToken, data.Db);

            if (user == null)
            {
                return this.Request.CreateResponse(HttpStatusCode.Unauthorized);
            }

            var message = data.GetMessage(messageId);
            if (message == null)
            {
                return this.Request.CreateResponse(HttpStatusCode.BadRequest, messageId);
            }

            var responceMessage = new MessageResponceModel()
                                 {
                                     BodyHtml = message.BodyHtml,
                                     BodyPlain = message.BodyPlain,
                                     Date = message.Date,
                                     Id = message.Id,
                                     Recipient = message.Recipient,
                                     Sender = message.Sender,
                                     Subject = message.Subject
                                 };

            var response = this.Request.CreateResponse(HttpStatusCode.OK, responceMessage);
            return response;
        }