VAppEfRepository.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Unity;
  4. using VCommon.Ioc;
  5. using VCommon.VApplication.Authorization;
  6. using VCommon.VEntity;
  7. using VCommon.VEntityFrameworkCore;
  8. namespace VCommon.VApplication.EntityFrameworkCore
  9. {
  10. public class VAppEfRepository<TDbContext, TEntity> : VEfRepositoryBase<TDbContext, TEntity> where TEntity : VEntityBase where TDbContext : VAppDbContextBase
  11. {
  12. [Dependency]
  13. public IVSession VSession { get; set; }
  14. [Dependency]
  15. public IIocManager IocManager { get; set; }
  16. private readonly Dictionary<string, bool> _filterState = new()
  17. {
  18. { VAppEfDataFilters.MayHaveTenant, true },
  19. { VAppEfDataFilters.MustHaveTenant, true },
  20. { VAppEfDataFilters.MustHaveOrg, true },
  21. };
  22. public override VEfRepositoryBase<TDbContext, TForkEntity> ForkRepository<TForkEntity>()
  23. {
  24. return new VAppEfRepository<TDbContext, TForkEntity> { DbContext = DbContext };
  25. }
  26. protected override TDbContext ResolveDbContextInstance() => IocManager.Resolve<TDbContext>();
  27. protected override IQueryable<TEntity> ProcessFilters(IQueryable<TEntity> input)
  28. {
  29. if (_filterState[VAppEfDataFilters.MayHaveTenant] && typeof(TEntity).IsAssignableTo(typeof(IMayHaveTenant)))
  30. {
  31. input = input.Where(p => ((IMayHaveTenant)p).TenantId == VSession.TenantId);
  32. }
  33. if (_filterState[VAppEfDataFilters.MustHaveTenant] && typeof(TEntity).IsAssignableTo(typeof(IMustHaveTenant)))
  34. {
  35. input = input.Where(p => ((IMustHaveTenant)p).TenantId == VSession.TenantId);
  36. }
  37. if (_filterState[VAppEfDataFilters.MustHaveOrg]
  38. && typeof(TEntity).IsAssignableTo(typeof(IMustHaveOrg))
  39. && IocManager.TryResolve(out IOrgManager orgManager) && orgManager.Enabled)
  40. {
  41. var visionOrg = orgManager.GetUserVisionOrg(VSession.TenantId, VSession.UserId);
  42. input = input.Where(p => visionOrg.Contains(((IMustHaveOrg)p).OrgId));
  43. }
  44. return base.ProcessFilters(input);
  45. }
  46. public override TEntity Add(TEntity entity)
  47. {
  48. if (IsFilterEnabled(VAppEfDataFilters.MustHaveTenant) && entity is IMustHaveTenant mte) mte.TenantId = VSession.GetTenantId();
  49. if (_filterState[VAppEfDataFilters.MustHaveOrg]
  50. && typeof(TEntity).IsAssignableTo(typeof(IMustHaveOrg))
  51. && IocManager.TryResolve(out IOrgManager orgManager) && orgManager.Enabled)
  52. {
  53. var visionOrg = orgManager.GetUserVisionOrg(VSession.TenantId, VSession.UserId);
  54. if (false == visionOrg.Contains(((IMustHaveOrg)entity).OrgId)) throw new VApplicationAuthException("拒绝访问:您没有权限访问该组织", AuthReason.AccessDenied);
  55. }
  56. return base.Add(entity);
  57. }
  58. public override void EnableFilter(string filterName)
  59. {
  60. if (_filterState.ContainsKey(filterName)) _filterState[filterName] = true;
  61. else base.EnableFilter(filterName);
  62. }
  63. public override void DisableFilter(string filterName)
  64. {
  65. if (_filterState.ContainsKey(filterName)) _filterState[filterName] = false;
  66. else base.EnableFilter(filterName);
  67. }
  68. public override bool IsFilterEnabled(string filterName)
  69. {
  70. return _filterState.ContainsKey(filterName)
  71. ? _filterState[filterName]
  72. : base.IsFilterEnabled(filterName);
  73. }
  74. }
  75. }