NotificationStore.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. using System.Linq.Expressions;
  2. using Abp;
  3. using Abp.Dependency;
  4. using Abp.Domain.Repositories;
  5. using Abp.Domain.Uow;
  6. using Abp.Linq.Expressions;
  7. using Abp.Linq.Extensions;
  8. using Abp.Notifications;
  9. namespace VberZero.Notifications;
  10. /// <summary>
  11. /// Implements <see cref="INotificationStore"/> using repositories.
  12. /// </summary>
  13. public class NotificationStore : INotificationStore, ITransientDependency
  14. {
  15. private readonly IRepository<NotificationInfo, Guid> _notificationRepository;
  16. private readonly IRepository<TenantNotificationInfo, Guid> _tenantNotificationRepository;
  17. private readonly IRepository<UserNotificationInfo, Guid> _userNotificationRepository;
  18. private readonly IRepository<NotificationSubscriptionInfo, Guid> _notificationSubscriptionRepository;
  19. private readonly IUnitOfWorkManager _unitOfWorkManager;
  20. /// <summary>
  21. /// Initializes a new instance of the <see cref="NotificationStore"/> class.
  22. /// </summary>
  23. public NotificationStore(
  24. IRepository<NotificationInfo, Guid> notificationRepository,
  25. IRepository<TenantNotificationInfo, Guid> tenantNotificationRepository,
  26. IRepository<UserNotificationInfo, Guid> userNotificationRepository,
  27. IRepository<NotificationSubscriptionInfo, Guid> notificationSubscriptionRepository,
  28. IUnitOfWorkManager unitOfWorkManager)
  29. {
  30. _notificationRepository = notificationRepository;
  31. _tenantNotificationRepository = tenantNotificationRepository;
  32. _userNotificationRepository = userNotificationRepository;
  33. _notificationSubscriptionRepository = notificationSubscriptionRepository;
  34. _unitOfWorkManager = unitOfWorkManager;
  35. }
  36. public virtual async Task InsertSubscriptionAsync(NotificationSubscriptionInfo subscription)
  37. {
  38. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  39. {
  40. using (_unitOfWorkManager.Current.SetTenantId(subscription.TenantId))
  41. {
  42. await _notificationSubscriptionRepository.InsertAsync(subscription);
  43. await _unitOfWorkManager.Current.SaveChangesAsync();
  44. }
  45. });
  46. }
  47. public virtual void InsertSubscription(NotificationSubscriptionInfo subscription)
  48. {
  49. _unitOfWorkManager.WithUnitOfWork(() =>
  50. {
  51. using (_unitOfWorkManager.Current.SetTenantId(subscription.TenantId))
  52. {
  53. _notificationSubscriptionRepository.Insert(subscription);
  54. _unitOfWorkManager.Current.SaveChanges();
  55. }
  56. });
  57. }
  58. public virtual async Task DeleteSubscriptionAsync(
  59. UserIdentifier user,
  60. string notificationName,
  61. string entityTypeName,
  62. string entityId)
  63. {
  64. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  65. {
  66. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  67. {
  68. await _notificationSubscriptionRepository.DeleteAsync(s =>
  69. s.UserId == user.UserId &&
  70. s.NotificationName == notificationName &&
  71. s.EntityTypeName == entityTypeName &&
  72. s.EntityId == entityId
  73. );
  74. await _unitOfWorkManager.Current.SaveChangesAsync();
  75. }
  76. });
  77. }
  78. public virtual void DeleteSubscription(
  79. UserIdentifier user,
  80. string notificationName,
  81. string entityTypeName,
  82. string entityId)
  83. {
  84. _unitOfWorkManager.WithUnitOfWork(() =>
  85. {
  86. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  87. {
  88. _notificationSubscriptionRepository.Delete(s =>
  89. s.UserId == user.UserId &&
  90. s.NotificationName == notificationName &&
  91. s.EntityTypeName == entityTypeName &&
  92. s.EntityId == entityId
  93. );
  94. _unitOfWorkManager.Current.SaveChanges();
  95. }
  96. });
  97. }
  98. public virtual async Task InsertNotificationAsync(NotificationInfo notification)
  99. {
  100. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  101. {
  102. using (_unitOfWorkManager.Current.SetTenantId(null))
  103. {
  104. await _notificationRepository.InsertAsync(notification);
  105. await _unitOfWorkManager.Current.SaveChangesAsync();
  106. }
  107. });
  108. }
  109. public virtual void InsertNotification(NotificationInfo notification)
  110. {
  111. _unitOfWorkManager.WithUnitOfWork(() =>
  112. {
  113. using (_unitOfWorkManager.Current.SetTenantId(null))
  114. {
  115. _notificationRepository.Insert(notification);
  116. _unitOfWorkManager.Current.SaveChanges();
  117. }
  118. });
  119. }
  120. public virtual async Task<NotificationInfo> GetNotificationOrNullAsync(Guid notificationId)
  121. {
  122. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  123. {
  124. using (_unitOfWorkManager.Current.SetTenantId(null))
  125. {
  126. return await _notificationRepository.FirstOrDefaultAsync(notificationId);
  127. }
  128. });
  129. }
  130. public virtual NotificationInfo GetNotificationOrNull(Guid notificationId)
  131. {
  132. return _unitOfWorkManager.WithUnitOfWork(() =>
  133. {
  134. using (_unitOfWorkManager.Current.SetTenantId(null))
  135. {
  136. return _notificationRepository.FirstOrDefault(notificationId);
  137. }
  138. });
  139. }
  140. public virtual async Task InsertUserNotificationAsync(UserNotificationInfo userNotification)
  141. {
  142. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  143. {
  144. using (_unitOfWorkManager.Current.SetTenantId(userNotification.TenantId))
  145. {
  146. await _userNotificationRepository.InsertAsync(userNotification);
  147. await _unitOfWorkManager.Current.SaveChangesAsync();
  148. }
  149. });
  150. }
  151. public virtual void InsertUserNotification(UserNotificationInfo userNotification)
  152. {
  153. _unitOfWorkManager.WithUnitOfWork(() =>
  154. {
  155. using (_unitOfWorkManager.Current.SetTenantId(userNotification.TenantId))
  156. {
  157. _userNotificationRepository.Insert(userNotification);
  158. _unitOfWorkManager.Current.SaveChanges();
  159. }
  160. });
  161. }
  162. public virtual async Task<List<NotificationSubscriptionInfo>> GetSubscriptionsAsync(
  163. string notificationName,
  164. string entityTypeName,
  165. string entityId)
  166. {
  167. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  168. {
  169. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  170. {
  171. return await _notificationSubscriptionRepository.GetAllListAsync(s =>
  172. s.NotificationName == notificationName &&
  173. s.EntityTypeName == entityTypeName &&
  174. s.EntityId == entityId
  175. );
  176. }
  177. });
  178. }
  179. public virtual List<NotificationSubscriptionInfo> GetSubscriptions(
  180. string notificationName,
  181. string entityTypeName,
  182. string entityId)
  183. {
  184. return _unitOfWorkManager.WithUnitOfWork(() =>
  185. {
  186. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  187. {
  188. return _notificationSubscriptionRepository.GetAllList(s =>
  189. s.NotificationName == notificationName &&
  190. s.EntityTypeName == entityTypeName &&
  191. s.EntityId == entityId
  192. );
  193. }
  194. });
  195. }
  196. public virtual async Task<List<NotificationSubscriptionInfo>> GetSubscriptionsAsync(
  197. int?[] tenantIds,
  198. string notificationName,
  199. string entityTypeName,
  200. string entityId)
  201. {
  202. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  203. {
  204. var subscriptions = new List<NotificationSubscriptionInfo>();
  205. foreach (var tenantId in tenantIds)
  206. {
  207. subscriptions.AddRange(await GetSubscriptionsAsync(tenantId, notificationName, entityTypeName,
  208. entityId));
  209. }
  210. return subscriptions;
  211. });
  212. }
  213. public virtual List<NotificationSubscriptionInfo> GetSubscriptions(
  214. int?[] tenantIds,
  215. string notificationName,
  216. string entityTypeName,
  217. string entityId)
  218. {
  219. return _unitOfWorkManager.WithUnitOfWork(() =>
  220. {
  221. var subscriptions = new List<NotificationSubscriptionInfo>();
  222. foreach (var tenantId in tenantIds)
  223. {
  224. subscriptions.AddRange(GetSubscriptions(tenantId, notificationName, entityTypeName, entityId));
  225. }
  226. return subscriptions;
  227. });
  228. }
  229. public virtual async Task<List<NotificationSubscriptionInfo>> GetSubscriptionsAsync(UserIdentifier user)
  230. {
  231. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  232. {
  233. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  234. {
  235. return await _notificationSubscriptionRepository.GetAllListAsync(s => s.UserId == user.UserId);
  236. }
  237. });
  238. }
  239. public virtual List<NotificationSubscriptionInfo> GetSubscriptions(UserIdentifier user)
  240. {
  241. return _unitOfWorkManager.WithUnitOfWork(() =>
  242. {
  243. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  244. {
  245. return _notificationSubscriptionRepository.GetAllList(s => s.UserId == user.UserId);
  246. }
  247. });
  248. }
  249. protected virtual async Task<List<NotificationSubscriptionInfo>> GetSubscriptionsAsync(
  250. int? tenantId,
  251. string notificationName,
  252. string entityTypeName,
  253. string entityId)
  254. {
  255. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  256. {
  257. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  258. {
  259. return await _notificationSubscriptionRepository.GetAllListAsync(s =>
  260. s.NotificationName == notificationName &&
  261. s.EntityTypeName == entityTypeName &&
  262. s.EntityId == entityId
  263. );
  264. }
  265. });
  266. }
  267. protected virtual List<NotificationSubscriptionInfo> GetSubscriptions(
  268. int? tenantId,
  269. string notificationName,
  270. string entityTypeName,
  271. string entityId)
  272. {
  273. return _unitOfWorkManager.WithUnitOfWork(() =>
  274. {
  275. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  276. {
  277. return _notificationSubscriptionRepository.GetAllList(s =>
  278. s.NotificationName == notificationName &&
  279. s.EntityTypeName == entityTypeName &&
  280. s.EntityId == entityId
  281. );
  282. }
  283. });
  284. }
  285. public virtual async Task<bool> IsSubscribedAsync(
  286. UserIdentifier user,
  287. string notificationName,
  288. string entityTypeName,
  289. string entityId)
  290. {
  291. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  292. {
  293. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  294. {
  295. return await _notificationSubscriptionRepository.CountAsync(s =>
  296. s.UserId == user.UserId &&
  297. s.NotificationName == notificationName &&
  298. s.EntityTypeName == entityTypeName &&
  299. s.EntityId == entityId
  300. ) > 0;
  301. }
  302. });
  303. }
  304. public virtual bool IsSubscribed(
  305. UserIdentifier user,
  306. string notificationName,
  307. string entityTypeName,
  308. string entityId)
  309. {
  310. return _unitOfWorkManager.WithUnitOfWork(() =>
  311. {
  312. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  313. {
  314. return _notificationSubscriptionRepository.Count(s =>
  315. s.UserId == user.UserId &&
  316. s.NotificationName == notificationName &&
  317. s.EntityTypeName == entityTypeName &&
  318. s.EntityId == entityId
  319. ) > 0;
  320. }
  321. });
  322. }
  323. public virtual async Task UpdateUserNotificationStateAsync(
  324. int? tenantId,
  325. Guid userNotificationId,
  326. UserNotificationState state)
  327. {
  328. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  329. {
  330. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  331. {
  332. var userNotification = await _userNotificationRepository.FirstOrDefaultAsync(userNotificationId);
  333. if (userNotification == null)
  334. {
  335. return;
  336. }
  337. userNotification.State = state;
  338. await _unitOfWorkManager.Current.SaveChangesAsync();
  339. }
  340. });
  341. }
  342. public virtual void UpdateUserNotificationState(
  343. int? tenantId,
  344. Guid userNotificationId,
  345. UserNotificationState state)
  346. {
  347. _unitOfWorkManager.WithUnitOfWork(() =>
  348. {
  349. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  350. {
  351. var userNotification = _userNotificationRepository.FirstOrDefault(userNotificationId);
  352. if (userNotification == null)
  353. {
  354. return;
  355. }
  356. userNotification.State = state;
  357. _unitOfWorkManager.Current.SaveChanges();
  358. }
  359. });
  360. }
  361. public virtual async Task UpdateAllUserNotificationStatesAsync(UserIdentifier user, UserNotificationState state)
  362. {
  363. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  364. {
  365. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  366. {
  367. var userNotifications = await _userNotificationRepository.GetAllListAsync(
  368. un => un.UserId == user.UserId
  369. );
  370. foreach (var userNotification in userNotifications)
  371. {
  372. userNotification.State = state;
  373. }
  374. await _unitOfWorkManager.Current.SaveChangesAsync();
  375. }
  376. });
  377. }
  378. public virtual void UpdateAllUserNotificationStates(UserIdentifier user, UserNotificationState state)
  379. {
  380. _unitOfWorkManager.WithUnitOfWork(() =>
  381. {
  382. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  383. {
  384. var userNotifications = _userNotificationRepository.GetAllList(
  385. un => un.UserId == user.UserId
  386. );
  387. foreach (var userNotification in userNotifications)
  388. {
  389. userNotification.State = state;
  390. }
  391. _unitOfWorkManager.Current.SaveChanges();
  392. }
  393. });
  394. }
  395. public virtual async Task DeleteUserNotificationAsync(int? tenantId, Guid userNotificationId)
  396. {
  397. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  398. {
  399. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  400. {
  401. await _userNotificationRepository.DeleteAsync(userNotificationId);
  402. await _unitOfWorkManager.Current.SaveChangesAsync();
  403. }
  404. });
  405. }
  406. public virtual void DeleteUserNotification(int? tenantId, Guid userNotificationId)
  407. {
  408. _unitOfWorkManager.WithUnitOfWork(() =>
  409. {
  410. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  411. {
  412. _userNotificationRepository.Delete(userNotificationId);
  413. _unitOfWorkManager.Current.SaveChanges();
  414. }
  415. });
  416. }
  417. public virtual async Task DeleteAllUserNotificationsAsync(
  418. UserIdentifier user,
  419. UserNotificationState? state = null,
  420. DateTime? startDate = null,
  421. DateTime? endDate = null)
  422. {
  423. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  424. {
  425. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  426. {
  427. var predicate = CreateNotificationFilterPredicate(user, state, startDate, endDate);
  428. await _userNotificationRepository.DeleteAsync(predicate);
  429. await _unitOfWorkManager.Current.SaveChangesAsync();
  430. }
  431. });
  432. }
  433. public virtual void DeleteAllUserNotifications(
  434. UserIdentifier user,
  435. UserNotificationState? state = null,
  436. DateTime? startDate = null,
  437. DateTime? endDate = null)
  438. {
  439. _unitOfWorkManager.WithUnitOfWork(() =>
  440. {
  441. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  442. {
  443. var predicate = CreateNotificationFilterPredicate(user, state, startDate, endDate);
  444. _userNotificationRepository.Delete(predicate);
  445. _unitOfWorkManager.Current.SaveChanges();
  446. }
  447. });
  448. }
  449. private Expression<Func<UserNotificationInfo, bool>> CreateNotificationFilterPredicate(
  450. UserIdentifier user,
  451. UserNotificationState? state = null,
  452. DateTime? startDate = null,
  453. DateTime? endDate = null)
  454. {
  455. var predicate = PredicateBuilder.New<UserNotificationInfo>();
  456. predicate = predicate.And(p => p.UserId == user.UserId);
  457. if (startDate.HasValue)
  458. {
  459. predicate = predicate.And(p => p.CreationTime >= startDate);
  460. }
  461. if (endDate.HasValue)
  462. {
  463. predicate = predicate.And(p => p.CreationTime <= endDate);
  464. }
  465. if (state.HasValue)
  466. {
  467. predicate = predicate.And(p => p.State == state);
  468. }
  469. return predicate;
  470. }
  471. public virtual async Task<List<UserNotificationInfoWithNotificationInfo>>
  472. GetUserNotificationsWithNotificationsAsync(
  473. UserIdentifier user,
  474. UserNotificationState? state = null,
  475. int skipCount = 0,
  476. int maxResultCount = int.MaxValue,
  477. DateTime? startDate = null,
  478. DateTime? endDate = null)
  479. {
  480. var result = _unitOfWorkManager.WithUnitOfWork(() =>
  481. {
  482. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  483. {
  484. var query = from userNotificationInfo in _userNotificationRepository.GetAll()
  485. join tenantNotificationInfo in _tenantNotificationRepository.GetAll() on userNotificationInfo
  486. .TenantNotificationId equals tenantNotificationInfo.Id
  487. where userNotificationInfo.UserId == user.UserId
  488. orderby tenantNotificationInfo.CreationTime descending
  489. select new
  490. {
  491. userNotificationInfo,
  492. tenantNotificationInfo
  493. };
  494. if (state.HasValue)
  495. {
  496. query = query.Where(x => x.userNotificationInfo.State == state.Value);
  497. }
  498. if (startDate.HasValue)
  499. {
  500. query = query.Where(x => x.tenantNotificationInfo.CreationTime >= startDate);
  501. }
  502. if (endDate.HasValue)
  503. {
  504. query = query.Where(x => x.tenantNotificationInfo.CreationTime <= endDate);
  505. }
  506. query = query.PageBy(skipCount, maxResultCount);
  507. var list = query.ToList();
  508. return list.Select(
  509. a => new UserNotificationInfoWithNotificationInfo(
  510. a.userNotificationInfo,
  511. a.tenantNotificationInfo
  512. )
  513. ).ToList();
  514. }
  515. });
  516. return await Task.FromResult(result);
  517. }
  518. public virtual List<UserNotificationInfoWithNotificationInfo> GetUserNotificationsWithNotifications(
  519. UserIdentifier user,
  520. UserNotificationState? state = null,
  521. int skipCount = 0,
  522. int maxResultCount = int.MaxValue,
  523. DateTime? startDate = null,
  524. DateTime? endDate = null)
  525. {
  526. return _unitOfWorkManager.WithUnitOfWork(() =>
  527. {
  528. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  529. {
  530. var query = from userNotificationInfo in _userNotificationRepository.GetAll()
  531. join tenantNotificationInfo in _tenantNotificationRepository.GetAll() on userNotificationInfo
  532. .TenantNotificationId equals tenantNotificationInfo.Id
  533. where userNotificationInfo.UserId == user.UserId
  534. orderby tenantNotificationInfo.CreationTime descending
  535. select new
  536. {
  537. userNotificationInfo,
  538. tenantNotificationInfo
  539. };
  540. if (state.HasValue)
  541. {
  542. query = query.Where(x => x.userNotificationInfo.State == state.Value);
  543. }
  544. if (startDate.HasValue)
  545. {
  546. query = query.Where(x => x.tenantNotificationInfo.CreationTime >= startDate);
  547. }
  548. if (endDate.HasValue)
  549. {
  550. query = query.Where(x => x.tenantNotificationInfo.CreationTime <= endDate);
  551. }
  552. query = query.PageBy(skipCount, maxResultCount);
  553. var list = query.ToList();
  554. return list.Select(
  555. a => new UserNotificationInfoWithNotificationInfo(
  556. a.userNotificationInfo,
  557. a.tenantNotificationInfo
  558. )
  559. ).ToList();
  560. }
  561. });
  562. }
  563. public virtual async Task<int> GetUserNotificationCountAsync(
  564. UserIdentifier user,
  565. UserNotificationState? state = null,
  566. DateTime? startDate = null,
  567. DateTime? endDate = null)
  568. {
  569. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  570. {
  571. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  572. {
  573. var predicate = CreateNotificationFilterPredicate(user, state, startDate, endDate);
  574. return await _userNotificationRepository.CountAsync(predicate);
  575. }
  576. });
  577. }
  578. public virtual int GetUserNotificationCount(
  579. UserIdentifier user,
  580. UserNotificationState? state = null,
  581. DateTime? startDate = null,
  582. DateTime? endDate = null)
  583. {
  584. return _unitOfWorkManager.WithUnitOfWork(() =>
  585. {
  586. using (_unitOfWorkManager.Current.SetTenantId(user.TenantId))
  587. {
  588. var predicate = CreateNotificationFilterPredicate(user, state, startDate, endDate);
  589. return _userNotificationRepository.Count(predicate);
  590. }
  591. });
  592. }
  593. public virtual async Task<UserNotificationInfoWithNotificationInfo>
  594. GetUserNotificationWithNotificationOrNullAsync(
  595. int? tenantId,
  596. Guid userNotificationId)
  597. {
  598. var result = _unitOfWorkManager.WithUnitOfWork(() =>
  599. {
  600. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  601. {
  602. var query = from userNotificationInfo in _userNotificationRepository.GetAll()
  603. join tenantNotificationInfo in _tenantNotificationRepository.GetAll() on userNotificationInfo
  604. .TenantNotificationId equals tenantNotificationInfo.Id
  605. where userNotificationInfo.Id == userNotificationId
  606. select new
  607. {
  608. userNotificationInfo,
  609. tenantNotificationInfo
  610. };
  611. var item = query.FirstOrDefault();
  612. if (item == null)
  613. {
  614. return null;
  615. }
  616. return new UserNotificationInfoWithNotificationInfo(
  617. item.userNotificationInfo,
  618. item.tenantNotificationInfo
  619. );
  620. }
  621. });
  622. return await Task.FromResult(result);
  623. }
  624. public virtual UserNotificationInfoWithNotificationInfo GetUserNotificationWithNotificationOrNull(
  625. int? tenantId,
  626. Guid userNotificationId)
  627. {
  628. return _unitOfWorkManager.WithUnitOfWork(() =>
  629. {
  630. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  631. {
  632. var query = from userNotificationInfo in _userNotificationRepository.GetAll()
  633. join tenantNotificationInfo in _tenantNotificationRepository.GetAll() on userNotificationInfo
  634. .TenantNotificationId equals tenantNotificationInfo.Id
  635. where userNotificationInfo.Id == userNotificationId
  636. select new
  637. {
  638. userNotificationInfo,
  639. tenantNotificationInfo
  640. };
  641. var item = query.FirstOrDefault();
  642. if (item == null)
  643. {
  644. return null;
  645. }
  646. return new UserNotificationInfoWithNotificationInfo(
  647. item.userNotificationInfo,
  648. item.tenantNotificationInfo
  649. );
  650. }
  651. });
  652. }
  653. public virtual async Task InsertTenantNotificationAsync(TenantNotificationInfo tenantNotificationInfo)
  654. {
  655. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  656. {
  657. using (_unitOfWorkManager.Current.SetTenantId(tenantNotificationInfo.TenantId))
  658. {
  659. await _tenantNotificationRepository.InsertAsync(tenantNotificationInfo);
  660. }
  661. });
  662. }
  663. public virtual void InsertTenantNotification(TenantNotificationInfo tenantNotificationInfo)
  664. {
  665. _unitOfWorkManager.WithUnitOfWork(() =>
  666. {
  667. using (_unitOfWorkManager.Current.SetTenantId(tenantNotificationInfo.TenantId))
  668. {
  669. _tenantNotificationRepository.Insert(tenantNotificationInfo);
  670. }
  671. });
  672. }
  673. public virtual async Task DeleteNotificationAsync(NotificationInfo notification)
  674. {
  675. await _unitOfWorkManager.WithUnitOfWorkAsync(async () => await _notificationRepository.DeleteAsync(notification));
  676. }
  677. public virtual void DeleteNotification(NotificationInfo notification)
  678. {
  679. _unitOfWorkManager.WithUnitOfWork(() =>
  680. {
  681. _notificationRepository.Delete(notification);
  682. });
  683. }
  684. }