예제 #1
0
 private void SetupPendingEvents(IWebhookEventEntity @event)
 {
     A.CallTo(() => webhookEventRepository.QueryPendingAsync(A <Func <IWebhookEventEntity, Task> > .Ignored, A <CancellationToken> .Ignored))
     .Invokes(async(Func <IWebhookEventEntity, Task> callback, CancellationToken ct) =>
     {
         await callback(@event);
     });
 }
예제 #2
0
        private void VerifyRepositories(IWebhookEventEntity @event, string requestDump, WebhookResult requestResult, TimeSpan requestTime, Instant?nextAttempt)
        {
            A.CallTo(() => webhookEventRepository.TraceSendingAsync(@event.Id))
            .MustHaveHappened();

            A.CallTo(() => webhookEventRepository.TraceSendingAsync(@event.Id))
            .MustHaveHappened();

            A.CallTo(() => webhookEventRepository.TraceSentAsync(@event.Id, requestDump, requestResult, requestTime, nextAttempt))
            .MustHaveHappened();

            A.CallTo(() => webhookRepository.TraceSentAsync(@event.Job.WebhookId, requestResult, requestTime))
            .MustHaveHappened();
        }
예제 #3
0
        private async Task <IWebhookEventEntity> BlockAsync(IWebhookEventEntity @event)
        {
            try
            {
                await webhookEventRepository.TraceSendingAsync(@event.Id);

                return(@event);
            }
            catch (Exception ex)
            {
                log.LogError(ex, w => w
                             .WriteProperty("action", "BlockWebhookEvent")
                             .WriteProperty("status", "Failed"));

                throw;
            }
        }
예제 #4
0
        private async Task MakeRequestAsync(IWebhookEventEntity @event)
        {
            try
            {
                var response = await webhookSender.SendAsync(@event.Job);

                Instant?nextCall = null;

                if (response.Result != WebhookResult.Success)
                {
                    var now = clock.GetCurrentInstant();

                    switch (@event.NumCalls)
                    {
                    case 0:
                        nextCall = now.Plus(Duration.FromMinutes(5));
                        break;

                    case 1:
                        nextCall = now.Plus(Duration.FromHours(1));
                        break;

                    case 2:
                        nextCall = now.Plus(Duration.FromHours(5));
                        break;

                    case 3:
                        nextCall = now.Plus(Duration.FromHours(6));
                        break;
                    }
                }

                await Task.WhenAll(
                    webhookRepository.TraceSentAsync(@event.Job.WebhookId, response.Result, response.Elapsed),
                    webhookEventRepository.TraceSentAsync(@event.Id, response.Dump, response.Result, response.Elapsed, nextCall));
            }
            catch (Exception ex)
            {
                log.LogError(ex, w => w
                             .WriteProperty("action", "SendWebhookEvent")
                             .WriteProperty("status", "Failed"));

                throw;
            }
        }
예제 #5
0
 private void SetupSender(IWebhookEventEntity @event, string requestDump, WebhookResult requestResult, TimeSpan requestTime)
 {
     A.CallTo(() => webhookSender.SendAsync(@event.Job))
     .Returns((requestDump, requestResult, requestTime));
 }