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; /// /// Implements using repositories. /// public class WebhookSendAttemptStore : IWebhookSendAttemptStore, ITransientDependency { public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; } private readonly IRepository _webhookSendAttemptRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; public WebhookSendAttemptStore( IRepository 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 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 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 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> GetAllSendAttemptsBySubscriptionAsPagedListAsync( int? tenantId, Guid subscriptionId, int maxResultCount, int skipCount) { PagedResultDto 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 { TotalCount = totalCount, Items = list }; } await uow.CompleteAsync(); } return sendAttempts; } public virtual IPagedResult GetAllSendAttemptsBySubscriptionAsPagedList(int? tenantId, Guid subscriptionId, int maxResultCount, int skipCount) { PagedResultDto 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() { TotalCount = totalCount, Items = list }; } uow.Complete(); } return sendAttempts; } public virtual async Task> GetAllSendAttemptsByWebhookEventIdAsync(int? tenantId, Guid webhookEventId) { List 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 GetAllSendAttemptsByWebhookEventId(int? tenantId, Guid webhookEventId) { List 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; } }