You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuPartialObjectCopier.cs 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using Luticate2.Auth.Utils.Business.Fields;
  5. using Luticate2.Auth.Utils.Business.Utils;
  6. using Luticate2.Auth.Utils.Dbo;
  7. using Luticate2.Auth.Utils.Dbo.Fields;
  8. using Luticate2.Auth.Utils.Dbo.PartialObjectCopier;
  9. using Luticate2.Auth.Utils.Dbo.Result;
  10. using Luticate2.Auth.Utils.Interfaces;
  11. using Microsoft.Extensions.DependencyInjection;
  12. namespace Luticate2.Auth.Utils.Business.PartialObjectCopier
  13. {
  14. public abstract class LuPartialObjectCopier<TTypeFrom, TTypeTo> : ILuPartialObjectCopier<TTypeFrom, TTypeTo>
  15. {
  16. protected IServiceProvider ServiceProvider { get; }
  17. protected LuPartialObjectCopier(IServiceProvider serviceProvider)
  18. {
  19. ServiceProvider = serviceProvider;
  20. }
  21. protected LuResult<TPropertyTo> MayCopySubProperty<TPropertyFrom, TPropertyTo>(LuFieldDbo path,
  22. LuPartialFieldsDbo fields, TTypeFrom modelFrom, TTypeTo dboTo,
  23. Expression<Func<TTypeFrom, TPropertyFrom>> propFrom, Expression<Func<TTypeTo, TPropertyTo>> propTo,
  24. LuPartialObjectCopierOptions options) where TPropertyTo : new()
  25. {
  26. var member = LuExpressionUtils.GetSingleMemberFromExpression(propTo);
  27. var subpath = LuFieldDbo.Make(path).Add(member.Name);
  28. if (fields.Fields.IsIncluded(subpath))
  29. {
  30. var propToValue = LuExpressionUtils.GetValueFromExpression(propTo, dboTo);
  31. if (!propToValue)
  32. {
  33. return propToValue.To<TPropertyTo>();
  34. }
  35. if (propToValue.Data == null)
  36. {
  37. propToValue.Data = new TPropertyTo();
  38. var res = LuExpressionUtils.SetValueFromExpression(propTo, dboTo, propToValue.Data);
  39. if (!res)
  40. {
  41. return res.To<TPropertyTo>();
  42. }
  43. }
  44. var propFromValue = LuExpressionUtils.GetValueFromExpression(propFrom, modelFrom);
  45. if (!propFromValue)
  46. {
  47. return propFromValue.To<TPropertyTo>();
  48. }
  49. var service = ServiceProvider.GetService<ILuPartialObjectCopier<TPropertyFrom, TPropertyTo>>();
  50. var result = service.Copy(subpath, fields, propFromValue.Data, propToValue.Data, options);
  51. return result;
  52. }
  53. return LuResult<TPropertyTo>.Ok(default(TPropertyTo));
  54. }
  55. protected LuResult<IList<TPropertyTo>> MayCopySubPropertyList<TPropertyFrom, TPropertyTo>(
  56. LuFieldDbo path, LuPartialFieldsDbo fields, IEnumerable<TPropertyFrom> modelFrom,
  57. TTypeTo dboTo, Expression<Func<TTypeTo, IEnumerable<TPropertyTo>>> propTo,
  58. LuPartialObjectCopierOptions options) where TPropertyTo : new()
  59. {
  60. var member = LuExpressionUtils.GetSingleMemberFromExpression(propTo);
  61. var subpath = LuFieldDbo.Make(path).Add(member.Name);
  62. if (fields.Fields.IsIncluded(subpath))
  63. {
  64. var list = new List<TPropertyTo>();
  65. var res = LuExpressionUtils.SetValueFromExpression(propTo, dboTo, list);
  66. if (!res)
  67. {
  68. return res.To<IList<TPropertyTo>>();
  69. }
  70. foreach (var subDboFrom in modelFrom)
  71. {
  72. var subDboTo = new TPropertyTo();
  73. var service = ServiceProvider.GetService<ILuPartialObjectCopier<TPropertyFrom, TPropertyTo>>();
  74. var result = service.Copy(subpath, fields, subDboFrom, subDboTo, options);
  75. list.Add(subDboTo);
  76. }
  77. }
  78. return LuResult<IList<TPropertyTo>>.Ok(null);
  79. }
  80. protected LuResult<TProperty> MayCopy<TProperty, TTypeTo2>(LuFieldDbo path, LuPartialFieldsDbo fields,
  81. TTypeTo2 dboTo, Expression<Func<TTypeTo2, TProperty>> property, Func<TProperty> getValue)
  82. {
  83. var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression(property);
  84. if (memberInfo != null)
  85. {
  86. if (fields.Fields.IsIncluded(LuFieldDbo.Make(path).Add(memberInfo.Name)))
  87. {
  88. var value = getValue();
  89. var result = LuExpressionUtils.SetValueFromExpression(property, dboTo, value);
  90. return result;
  91. }
  92. return LuResult<TProperty>.Ok(default(TProperty));
  93. }
  94. return LuResult<TProperty>.Error(LuStatus.InternalError.ToInt(), "Bad member expression");
  95. }
  96. public abstract LuResult<TTypeTo> Copy(LuFieldDbo path, LuPartialFieldsDbo fields, TTypeFrom dboFrom, TTypeTo dboTo, LuPartialObjectCopierOptions options);
  97. public LuResult<TTypeTo> Copy(LuPartialFieldsDbo fields, TTypeFrom dboFrom, TTypeTo dboTo, LuPartialObjectCopierOptions options)
  98. {
  99. return Copy(new LuFieldDbo(), fields, dboFrom, dboTo, options);
  100. }
  101. }
  102. }