private WebhookResponse DeleteWebhook(int id)
        {
            string apiKey            = GetMandrillApiKey();
            string requestUrl        = string.Format("{0}{1}", MandrillApiUrl, "/webhooks/delete.json");
            var    requestBobyObject = new WebhookApiInfoRequest {
                key = apiKey,
                id  = id
            };
            string                  requestBodyJson = new JavaScriptSerializer().Serialize(requestBobyObject);
            HttpWebRequest          request         = PrepareRequest(requestUrl);
            string                  response        = ExecRequest(request, requestBodyJson);
            WebhookApiResponseError requestError    = null;
            var requestResult = ConvertToWebhookResponse <WebhookApiResponse>(response, out requestError);
            var result        = new WebhookResponse {
                Webhook = new List <WebhookApiResponse>()
            };

            if (requestError != null || requestResult == null)
            {
                if (requestError != null)
                {
                    Error = requestError.message;
                    MandrillUtilities.Log.InfoFormat("MandrillWebhookService.DeleteWebhook error: {0}; {1}.",
                                                     requestError.name, requestError.message);
                }
                return(result);
            }
            result.Success = true;
            result.Webhook.Add(requestResult);
            return(result);
        }
        private WebhookResponse AddWebhook(string url, string description)
        {
            string apiKey            = GetMandrillApiKey();
            string requestUrl        = string.Format("{0}{1}", MandrillApiUrl, "/webhooks/add.json");
            var    requestBodyObject = new WebhookApiAddRequest {
                key         = apiKey,
                url         = url,
                description = description,
                events      = new string[] {}
            };
            string                  requestBodyJson = new JavaScriptSerializer().Serialize(requestBodyObject);
            HttpWebRequest          request         = PrepareRequest(requestUrl);
            string                  response        = ExecRequest(request, requestBodyJson);
            WebhookApiResponseError requestError    = null;
            var requestResult = ConvertToWebhookResponse <WebhookApiResponse>(response, out requestError);
            var result        = new WebhookResponse {
                Webhook = new List <WebhookApiResponse>()
            };

            if (requestError != null || requestResult == null)
            {
                if (requestError != null)
                {
                    Error = requestError.message;
                    MandrillUtilities.Log.InfoFormat("AddWebhook error: {0}; {1}", requestError.name,
                                                     requestError.message);
                }
                return(result);
            }
            result.Success = true;
            result.Webhook.Add(requestResult);
            return(result);
        }
        public WebhookResult SubmitWebhook()
        {
            var result = new WebhookResult();
            WebhookApiResponse currentWebhook = GetCurrentWebhook();
            //List webhooks registered on Mandrill account.
            WebhookResponse listWebhooks           = ListWebhook();
            UserConnection  userConnection         = AppConnection.SystemUserConnection;
            string          webhooksApplicationUrl =
                (string)Terrasoft.Core.Configuration.SysSettings.GetValue(userConnection, "WebhooksApplicationUrl");
            string webhookUrl = !string.IsNullOrEmpty(webhooksApplicationUrl)
                                ? webhooksApplicationUrl
                                : string.Format(
                "{0}{1}", WebUtilities.GetBaseApplicationUrl(HttpContext.Current.Request), WebHookWebService);
            string previousWebhookUrl = currentWebhook.url;

            currentWebhook.url = webhookUrl;
            if (!listWebhooks.Success)
            {
                result.ErrorDescription = Error;
                return(result);
            }
            if (listWebhooks.Webhook.Any(
                    x => (x.id == currentWebhook.id) && (x.auth_key == currentWebhook.auth_key) &&
                    (x.url == currentWebhook.url)))
            {
                result.Success = true;
                return(result);
            }
            //Remove webhooks that's already registered on the same url.
            foreach (WebhookApiResponse item in listWebhooks.Webhook)
            {
                if ((item.url != currentWebhook.url) && (item.url != previousWebhookUrl))
                {
                    continue;
                }
                if (!DeleteWebhook(item.id).Success)
                {
                    result.ErrorDescription = Error;
                    return(result);
                }
            }
            //Register new webhooks.
            WebhookResponse newWebhook = AddWebhook(webhookUrl, string.Empty);

            if (!newWebhook.Success)
            {
                result.ErrorDescription = Error;
                return(result);
            }
            //Remove old webhooks from DB.
            RemoveCurrentWebhook();
            //Save new webhooks to DB.
            bool isSaved = SetCurrentWebhook(newWebhook.Webhook[0]);

            if (!isSaved)
            {
                result.ErrorDescription = Error;
                return(result);
            }
            result.Success = true;
            return(result);
        }