using System; using System.Collections.Generic; using System.Linq.Expressions; using Luticate2.Auth.Business.Fields; using Luticate2.Auth.Dbo; using Luticate2.Auth.Dbo.Fields; using Luticate2.Auth.Dbo.PartialObjectCopier; using Luticate2.Auth.Dbo.Result; using Luticate2.Auth.Interfaces; using Microsoft.Extensions.DependencyInjection; namespace Luticate2.Auth.Business.PartialObjectCopier { public abstract class LuPartialObjectCopier : ILuPartialObjectCopier { protected IServiceProvider ServiceProvider { get; } protected LuPartialObjectCopier(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } protected LuResult MayCopySubProperty(LuFieldDbo path, LuPartialFieldsDbo fields, TTypeFrom modelFrom, TTypeTo dboTo, Expression> propFrom, Expression> propTo, LuPartialObjectCopierOptions options) where TPropertyTo : new() { var member = LuExpressionUtils.GetSingleMemberFromExpression(propTo); var subpath = LuFieldDbo.Make(path).Add(member.Name); if (fields.Fields.IsIncluded(subpath)) { var propToValue = LuExpressionUtils.GetValueFromExpression(propTo, dboTo); if (!propToValue) { return propToValue.To(); } if (propToValue.Data == null) { propToValue.Data = new TPropertyTo(); var res = LuExpressionUtils.SetValueFromExpression(propTo, dboTo, propToValue.Data); if (!res) { return res.To(); } } var propFromValue = LuExpressionUtils.GetValueFromExpression(propFrom, modelFrom); if (!propFromValue) { return propFromValue.To(); } var service = ServiceProvider.GetService>(); var result = service.Copy(subpath, fields, propFromValue.Data, propToValue.Data, options); return result; } return LuResult.Ok(default(TPropertyTo)); } protected LuResult> MayCopySubPropertyList( LuFieldDbo path, LuPartialFieldsDbo fields, IEnumerable modelFrom, TTypeTo dboTo, Expression>> propTo, LuPartialObjectCopierOptions options) where TPropertyTo : new() { var member = LuExpressionUtils.GetSingleMemberFromExpression(propTo); var subpath = LuFieldDbo.Make(path).Add(member.Name); if (fields.Fields.IsIncluded(subpath)) { var list = new List(); var res = LuExpressionUtils.SetValueFromExpression(propTo, dboTo, list); if (!res) { return res.To>(); } foreach (var subDboFrom in modelFrom) { var subDboTo = new TPropertyTo(); var service = ServiceProvider.GetService>(); var result = service.Copy(subpath, fields, subDboFrom, subDboTo, options); list.Add(subDboTo); } } return LuResult>.Ok(null); } protected LuResult MayCopy(LuFieldDbo path, LuPartialFieldsDbo fields, TTypeTo2 dboTo, Expression> property, Func getValue) { var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression(property); if (memberInfo != null) { if (fields.Fields.IsIncluded(LuFieldDbo.Make(path).Add(memberInfo.Name))) { var value = getValue(); var result = LuExpressionUtils.SetValueFromExpression(property, dboTo, value); return result; } return LuResult.Ok(default(TProperty)); } return LuResult.Error(LuStatus.InternalError.ToInt(), "Bad member expression"); } public abstract LuResult Copy(LuFieldDbo path, LuPartialFieldsDbo fields, TTypeFrom dboFrom, TTypeTo dboTo, LuPartialObjectCopierOptions options); public LuResult Copy(LuPartialFieldsDbo fields, TTypeFrom dboFrom, TTypeTo dboTo, LuPartialObjectCopierOptions options) { return Copy(new LuFieldDbo(), fields, dboFrom, dboTo, options); } } }