WebhookSendAttemptStore.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. using System.Net;
  2. using Abp.Application.Services.Dto;
  3. using Abp.Dependency;
  4. using Abp.Domain.Repositories;
  5. using Abp.Domain.Uow;
  6. using Abp.Linq;
  7. using Abp.Webhooks;
  8. namespace VberZero.Webhooks;
  9. /// <summary>
  10. /// Implements <see cref="IWebhookSendAttemptStore"/> using repositories.
  11. /// </summary>
  12. public class WebhookSendAttemptStore : IWebhookSendAttemptStore, ITransientDependency
  13. {
  14. public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; }
  15. private readonly IRepository<WebhookSendAttempt, Guid> _webhookSendAttemptRepository;
  16. private readonly IUnitOfWorkManager _unitOfWorkManager;
  17. public WebhookSendAttemptStore(
  18. IRepository<WebhookSendAttempt, Guid> webhookSendAttemptRepository,
  19. IUnitOfWorkManager unitOfWorkManager)
  20. {
  21. _webhookSendAttemptRepository = webhookSendAttemptRepository;
  22. _unitOfWorkManager = unitOfWorkManager;
  23. AsyncQueryableExecuter = NullAsyncQueryableExecuter.Instance;
  24. }
  25. public virtual async Task InsertAsync(WebhookSendAttempt webhookSendAttempt)
  26. {
  27. using (var uow = _unitOfWorkManager.Begin())
  28. {
  29. using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
  30. {
  31. await _webhookSendAttemptRepository.InsertAsync(webhookSendAttempt);
  32. await _unitOfWorkManager.Current.SaveChangesAsync();
  33. }
  34. await uow.CompleteAsync();
  35. }
  36. }
  37. public virtual void Insert(WebhookSendAttempt webhookSendAttempt)
  38. {
  39. using (var uow = _unitOfWorkManager.Begin())
  40. {
  41. using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
  42. {
  43. _webhookSendAttemptRepository.Insert(webhookSendAttempt);
  44. _unitOfWorkManager.Current.SaveChanges();
  45. }
  46. uow.Complete();
  47. }
  48. }
  49. public virtual async Task UpdateAsync(WebhookSendAttempt webhookSendAttempt)
  50. {
  51. using (var uow = _unitOfWorkManager.Begin())
  52. {
  53. using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
  54. {
  55. await _webhookSendAttemptRepository.UpdateAsync(webhookSendAttempt);
  56. await _unitOfWorkManager.Current.SaveChangesAsync();
  57. }
  58. await uow.CompleteAsync();
  59. }
  60. }
  61. public virtual void Update(WebhookSendAttempt webhookSendAttempt)
  62. {
  63. using (var uow = _unitOfWorkManager.Begin())
  64. {
  65. using (_unitOfWorkManager.Current.SetTenantId(webhookSendAttempt.TenantId))
  66. {
  67. _webhookSendAttemptRepository.Update(webhookSendAttempt);
  68. _unitOfWorkManager.Current.SaveChanges();
  69. }
  70. uow.Complete();
  71. }
  72. }
  73. public virtual async Task<WebhookSendAttempt> GetAsync(int? tenantId, Guid id)
  74. {
  75. WebhookSendAttempt sendAttempt;
  76. using (var uow = _unitOfWorkManager.Begin())
  77. {
  78. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  79. {
  80. sendAttempt = await _webhookSendAttemptRepository.GetAsync(id);
  81. }
  82. await uow.CompleteAsync();
  83. }
  84. return sendAttempt;
  85. }
  86. public virtual WebhookSendAttempt Get(int? tenantId, Guid id)
  87. {
  88. WebhookSendAttempt sendAttempt;
  89. using (var uow = _unitOfWorkManager.Begin())
  90. {
  91. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  92. {
  93. sendAttempt = _webhookSendAttemptRepository.Get(id);
  94. }
  95. uow.CompleteAsync();
  96. }
  97. return sendAttempt;
  98. }
  99. public virtual async Task<int> GetSendAttemptCountAsync(int? tenantId, Guid webhookEventId,
  100. Guid webhookSubscriptionId)
  101. {
  102. int sendAttemptCount;
  103. using (var uow = _unitOfWorkManager.Begin())
  104. {
  105. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  106. {
  107. sendAttemptCount = await _webhookSendAttemptRepository
  108. .CountAsync(attempt =>
  109. attempt.WebhookEventId == webhookEventId &&
  110. attempt.WebhookSubscriptionId == webhookSubscriptionId
  111. );
  112. }
  113. await uow.CompleteAsync();
  114. }
  115. return sendAttemptCount;
  116. }
  117. public virtual int GetSendAttemptCount(int? tenantId, Guid webhookId, Guid webhookSubscriptionId)
  118. {
  119. int sendAttemptCount;
  120. using (var uow = _unitOfWorkManager.Begin())
  121. {
  122. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  123. {
  124. sendAttemptCount = _webhookSendAttemptRepository.GetAll()
  125. .Count(attempt =>
  126. attempt.WebhookEventId == webhookId &&
  127. attempt.WebhookSubscriptionId == webhookSubscriptionId);
  128. }
  129. uow.Complete();
  130. }
  131. return sendAttemptCount;
  132. }
  133. public virtual async Task<bool> HasXConsecutiveFailAsync(int? tenantId, Guid subscriptionId, int failCount)
  134. {
  135. bool result;
  136. using (var uow = _unitOfWorkManager.Begin())
  137. {
  138. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  139. {
  140. if (await _webhookSendAttemptRepository.CountAsync(x => x.WebhookSubscriptionId == subscriptionId) <
  141. failCount)
  142. {
  143. result = false;
  144. }
  145. else
  146. {
  147. result = !await AsyncQueryableExecuter.AnyAsync(
  148. _webhookSendAttemptRepository.GetAll()
  149. .OrderByDescending(attempt => attempt.CreationTime)
  150. .Take(failCount)
  151. .Where(attempt => attempt.ResponseStatusCode == HttpStatusCode.OK)
  152. );
  153. }
  154. }
  155. await uow.CompleteAsync();
  156. }
  157. return result;
  158. }
  159. public virtual async Task<IPagedResult<WebhookSendAttempt>> GetAllSendAttemptsBySubscriptionAsPagedListAsync(
  160. int? tenantId,
  161. Guid subscriptionId,
  162. int maxResultCount,
  163. int skipCount)
  164. {
  165. PagedResultDto<WebhookSendAttempt> sendAttempts;
  166. using (var uow = _unitOfWorkManager.Begin())
  167. {
  168. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  169. {
  170. var query = _webhookSendAttemptRepository.GetAllIncluding(attempt => attempt.WebhookEvent)
  171. .Where(attempt =>
  172. attempt.WebhookSubscriptionId == subscriptionId
  173. );
  174. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  175. var list = await AsyncQueryableExecuter.ToListAsync(query
  176. .OrderByDescending(attempt => attempt.CreationTime)
  177. .Skip(skipCount)
  178. .Take(maxResultCount)
  179. );
  180. sendAttempts = new PagedResultDto<WebhookSendAttempt>
  181. {
  182. TotalCount = totalCount,
  183. Items = list
  184. };
  185. }
  186. await uow.CompleteAsync();
  187. }
  188. return sendAttempts;
  189. }
  190. public virtual IPagedResult<WebhookSendAttempt> GetAllSendAttemptsBySubscriptionAsPagedList(int? tenantId,
  191. Guid subscriptionId, int maxResultCount, int skipCount)
  192. {
  193. PagedResultDto<WebhookSendAttempt> sendAttempts;
  194. using (var uow = _unitOfWorkManager.Begin())
  195. {
  196. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  197. {
  198. var query = _webhookSendAttemptRepository.GetAllIncluding(attempt => attempt.WebhookEvent)
  199. .Where(attempt =>
  200. attempt.WebhookSubscriptionId == subscriptionId
  201. );
  202. var totalCount = query.Count();
  203. var list = query
  204. .OrderByDescending(attempt => attempt.CreationTime)
  205. .Skip(skipCount)
  206. .Take(maxResultCount)
  207. .ToList();
  208. sendAttempts = new PagedResultDto<WebhookSendAttempt>()
  209. {
  210. TotalCount = totalCount,
  211. Items = list
  212. };
  213. }
  214. uow.Complete();
  215. }
  216. return sendAttempts;
  217. }
  218. public virtual async Task<List<WebhookSendAttempt>> GetAllSendAttemptsByWebhookEventIdAsync(int? tenantId,
  219. Guid webhookEventId)
  220. {
  221. List<WebhookSendAttempt> sendAttempts;
  222. using (var uow = _unitOfWorkManager.Begin())
  223. {
  224. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  225. {
  226. sendAttempts = await AsyncQueryableExecuter.ToListAsync(
  227. _webhookSendAttemptRepository.GetAll()
  228. .Where(attempt => attempt.WebhookEventId == webhookEventId)
  229. .OrderByDescending(attempt => attempt.CreationTime)
  230. );
  231. }
  232. await uow.CompleteAsync();
  233. }
  234. return sendAttempts;
  235. }
  236. public virtual List<WebhookSendAttempt> GetAllSendAttemptsByWebhookEventId(int? tenantId, Guid webhookEventId)
  237. {
  238. List<WebhookSendAttempt> sendAttempts;
  239. using var uow = _unitOfWorkManager.Begin();
  240. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  241. {
  242. sendAttempts = _webhookSendAttemptRepository.GetAll()
  243. .Where(attempt => attempt.WebhookEventId == webhookEventId)
  244. .OrderByDescending(attempt => attempt.CreationTime).ToList();
  245. }
  246. uow.Complete();
  247. return sendAttempts;
  248. }
  249. }