| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- using System.Net;
- using Abp.Application.Services.Dto;
- using Abp.Dependency;
- using Abp.Domain.Repositories;
- using Abp.Domain.Uow;
- using Abp.Linq;
- using Abp.Webhooks;
- namespace VberZero.Webhooks;
- /// <summary>
- /// Implements <see cref="IWebhookSendAttemptStore"/> using repositories.
- /// </summary>
- public class WebhookSendAttemptStore : IWebhookSendAttemptStore, ITransientDependency
- {
- public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; }
- private readonly IRepository<WebhookSendAttempt, Guid> _webhookSendAttemptRepository;
- private readonly IUnitOfWorkManager _unitOfWorkManager;
- public WebhookSendAttemptStore(
- IRepository<WebhookSendAttempt, Guid> webhookSendAttemptRepository,
- IUnitOfWorkManager unitOfWorkManager)
- {
- _webhookSendAttemptRepository = webhookSendAttemptRepository;
- _unitOfWorkManager = unitOfWorkManager;
- AsyncQueryableExecuter = NullAsyncQueryableExecuter.Instance;
- }
- public virtual async Task InsertAsync(WebhookSendAttempt webhookSendAttempt)
- {
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
- {
- await _webhookSendAttemptRepository.InsertAsync(webhookSendAttempt);
- await _unitOfWorkManager.Current.SaveChangesAsync();
- }
- await uow.CompleteAsync();
- }
- }
- public virtual void Insert(WebhookSendAttempt webhookSendAttempt)
- {
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
- {
- _webhookSendAttemptRepository.Insert(webhookSendAttempt);
- _unitOfWorkManager.Current.SaveChanges();
- }
- uow.Complete();
- }
- }
- public virtual async Task UpdateAsync(WebhookSendAttempt webhookSendAttempt)
- {
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
- {
- await _webhookSendAttemptRepository.UpdateAsync(webhookSendAttempt);
- await _unitOfWorkManager.Current.SaveChangesAsync();
- }
- await uow.CompleteAsync();
- }
- }
- public virtual void Update(WebhookSendAttempt webhookSendAttempt)
- {
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
- {
- _webhookSendAttemptRepository.Update(webhookSendAttempt);
- _unitOfWorkManager.Current.SaveChanges();
- }
- uow.Complete();
- }
- }
- public virtual async Task<WebhookSendAttempt> GetAsync(int? tenantId, Guid id)
- {
- WebhookSendAttempt sendAttempt;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- sendAttempt = await _webhookSendAttemptRepository.GetAsync(id);
- }
- await uow.CompleteAsync();
- }
- return sendAttempt;
- }
- public virtual WebhookSendAttempt Get(int? tenantId, Guid id)
- {
- WebhookSendAttempt sendAttempt;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- sendAttempt = _webhookSendAttemptRepository.Get(id);
- }
- uow.CompleteAsync();
- }
- return sendAttempt;
- }
- public virtual async Task<int> GetSendAttemptCountAsync(int? tenantId, Guid webhookEventId,
- Guid webhookSubscriptionId)
- {
- int sendAttemptCount;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- sendAttemptCount = await _webhookSendAttemptRepository
- .CountAsync(attempt =>
- attempt.WebhookEventId == webhookEventId &&
- attempt.WebhookSubscriptionId == webhookSubscriptionId
- );
- }
- await uow.CompleteAsync();
- }
- return sendAttemptCount;
- }
- public virtual int GetSendAttemptCount(int? tenantId, Guid webhookId, Guid webhookSubscriptionId)
- {
- int sendAttemptCount;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- sendAttemptCount = _webhookSendAttemptRepository.GetAll()
- .Count(attempt =>
- attempt.WebhookEventId == webhookId &&
- attempt.WebhookSubscriptionId == webhookSubscriptionId);
- }
- uow.Complete();
- }
- return sendAttemptCount;
- }
- public virtual async Task<bool> HasXConsecutiveFailAsync(int? tenantId, Guid subscriptionId, int failCount)
- {
- bool result;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- if (await _webhookSendAttemptRepository.CountAsync(x => x.WebhookSubscriptionId == subscriptionId) <
- failCount)
- {
- result = false;
- }
- else
- {
- result = !await AsyncQueryableExecuter.AnyAsync(
- _webhookSendAttemptRepository.GetAll()
- .OrderByDescending(attempt => attempt.CreationTime)
- .Take(failCount)
- .Where(attempt => attempt.ResponseStatusCode == HttpStatusCode.OK)
- );
- }
- }
- await uow.CompleteAsync();
- }
- return result;
- }
- public virtual async Task<IPagedResult<WebhookSendAttempt>> GetAllSendAttemptsBySubscriptionAsPagedListAsync(
- int? tenantId,
- Guid subscriptionId,
- int maxResultCount,
- int skipCount)
- {
- PagedResultDto<WebhookSendAttempt> sendAttempts;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- var query = _webhookSendAttemptRepository.GetAllIncluding(attempt => attempt.WebhookEvent)
- .Where(attempt =>
- attempt.WebhookSubscriptionId == subscriptionId
- );
- var totalCount = await AsyncQueryableExecuter.CountAsync(query);
- var list = await AsyncQueryableExecuter.ToListAsync(query
- .OrderByDescending(attempt => attempt.CreationTime)
- .Skip(skipCount)
- .Take(maxResultCount)
- );
- sendAttempts = new PagedResultDto<WebhookSendAttempt>
- {
- TotalCount = totalCount,
- Items = list
- };
- }
- await uow.CompleteAsync();
- }
- return sendAttempts;
- }
- public virtual IPagedResult<WebhookSendAttempt> GetAllSendAttemptsBySubscriptionAsPagedList(int? tenantId,
- Guid subscriptionId, int maxResultCount, int skipCount)
- {
- PagedResultDto<WebhookSendAttempt> sendAttempts;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- var query = _webhookSendAttemptRepository.GetAllIncluding(attempt => attempt.WebhookEvent)
- .Where(attempt =>
- attempt.WebhookSubscriptionId == subscriptionId
- );
- var totalCount = query.Count();
- var list = query
- .OrderByDescending(attempt => attempt.CreationTime)
- .Skip(skipCount)
- .Take(maxResultCount)
- .ToList();
- sendAttempts = new PagedResultDto<WebhookSendAttempt>()
- {
- TotalCount = totalCount,
- Items = list
- };
- }
- uow.Complete();
- }
- return sendAttempts;
- }
- public virtual async Task<List<WebhookSendAttempt>> GetAllSendAttemptsByWebhookEventIdAsync(int? tenantId,
- Guid webhookEventId)
- {
- List<WebhookSendAttempt> sendAttempts;
- using (var uow = _unitOfWorkManager.Begin())
- {
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- sendAttempts = await AsyncQueryableExecuter.ToListAsync(
- _webhookSendAttemptRepository.GetAll()
- .Where(attempt => attempt.WebhookEventId == webhookEventId)
- .OrderByDescending(attempt => attempt.CreationTime)
- );
- }
- await uow.CompleteAsync();
- }
- return sendAttempts;
- }
- public virtual List<WebhookSendAttempt> GetAllSendAttemptsByWebhookEventId(int? tenantId, Guid webhookEventId)
- {
- List<WebhookSendAttempt> sendAttempts;
- using var uow = _unitOfWorkManager.Begin();
- using (_unitOfWorkManager.Current.SetTenantId(tenantId))
- {
- sendAttempts = _webhookSendAttemptRepository.GetAll()
- .Where(attempt => attempt.WebhookEventId == webhookEventId)
- .OrderByDescending(attempt => attempt.CreationTime).ToList();
- }
- uow.Complete();
- return sendAttempts;
- }
- }
|