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

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