protected override async Task <JobResult> ProcessQueueEntryAsync(QueueEntryContext <WebHookNotification> context)
        {
            WebHookNotification body = context.QueueEntry.Value;
            bool shouldLog           = body.ProjectId != Settings.Current.InternalProjectId;

            _logger.Trace().Project(body.ProjectId).Message("Process web hook call: id={0} project={1} url={2}", context.QueueEntry.Id, body.ProjectId, body.Url).WriteIf(shouldLog);

            var client = new HttpClient();

            try {
                var response = await client.PostAsJsonAsync(body.Url, body.Data.ToJson(Formatting.Indented, _jsonSerializerSettings), context.CancellationToken).AnyContext();

                if (response.StatusCode == HttpStatusCode.Gone)
                {
                    _logger.Warn().Project(body.ProjectId).Message("Deleting web hook: org={0} project={1} url={2}", body.OrganizationId, body.ProjectId, body.Url).Write();
                    await _webHookRepository.RemoveAsync(body.WebHookId).AnyContext();
                }

                _logger.Info().Project(body.ProjectId).Message("Web hook POST complete: status={0} org={1} project={2} url={3}", response.StatusCode, body.OrganizationId, body.ProjectId, body.Url).WriteIf(shouldLog);
            } catch (Exception ex) {
                return(JobResult.FromException(ex));
            }

            return(JobResult.Success);
        }
        private async Task RemoveIntegrationAsync(WebHookNotification body)
        {
            switch (body.Type)
            {
            case WebHookType.General:
                await _webHookRepository.RemoveAsync(body.WebHookId).AnyContext();

                break;

            case WebHookType.Slack:
                var project = await _projectRepository.GetByIdAsync(body.ProjectId).AnyContext();

                var token = project?.GetSlackToken();
                if (token == null)
                {
                    return;
                }

                await _slackService.RevokeAccessTokenAsync(token.AccessToken).AnyContext();

                if (project.NotificationSettings.Remove(Project.NotificationIntegrations.Slack) | project.Data.Remove(Project.KnownDataKeys.SlackToken))
                {
                    await _projectRepository.SaveAsync(project, o => o.Cache());
                }

                break;
            }
        }