123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- using System;
- using System.Linq.Expressions;
- using Luticate2.Auth.Business.Fields;
- using Luticate2.Auth.Dbo;
- using Luticate2.Auth.Dbo.Fields;
- using Luticate2.Auth.Dbo.Result;
- using Luticate2.Auth.Interfaces;
- using Microsoft.Extensions.DependencyInjection;
-
- namespace Luticate2.Auth.Business.FieldsExpressions
- {
- public class LuFieldsExpressions<TDbo, TModel> : ILuFieldsExpressions<TDbo, TModel>
- {
- protected IServiceProvider ServiceProvider { get; }
-
- public LuFieldsExpressions(IServiceProvider serviceProvider)
- {
- ServiceProvider = serviceProvider;
- }
-
- public ILuFieldsExpressions<TDbo2, TModel2> GetService<TDbo2, TModel2>()
- {
- var service = ServiceProvider.GetService<ILuFieldsExpressions<TDbo2, TModel2>>();
- return service;
- }
-
- protected LuResult<Expression<Func<TType1, object>>> GetSubField<TType1, TType2, TType3>(
- Expression<Func<TType1, TModel>> modelProperty, LuFieldDbo field, Expression<Func<TModel, TType3>> modelSubProperty)
- {
- var subPropExprResult = LuExpressionUtils.GetSingleMemberFromExpression(modelSubProperty);
- if (subPropExprResult == null)
- {
- return LuResult<Expression<Func<TType1, object>>>.Error(LuStatus.InternalError.ToInt(), "Bad field expression");
- }
-
- var prop = Expression.Property(modelProperty.Body, subPropExprResult.Name);
- var exp = Expression.Lambda<Func<TType1, TType3>>(prop, modelProperty.Parameters[0]);
- var service = GetService<TType2, TType3>();
- var finalExpResult = service.GetExpression(exp, field.Popped());
- return finalExpResult;
- }
-
- protected virtual LuResult<Expression<Func<TType1, object>>> GetExpressionInternal<TType1>(
- Expression<Func<TType1, TModel>> modelProperty, LuFieldDbo field)
- {
- return LuResult<Expression<Func<TType1, object>>>.Error(LuStatus.InputError.ToInt(), $"Unknown field: {field}", "");
- }
-
- public virtual LuResult<Expression<Func<TType1, object>>> GetExpression<TType1>(Expression<Func<TType1, TModel>> modelProperty, LuFieldDbo field)
- {
- if (field.IsRoot())
- {
- var converted = Expression.Convert(modelProperty.Body, typeof(object));
- var exp = Expression.Lambda<Func<TType1, object>>(converted, modelProperty.Parameters[0]);
- return LuResult<Expression<Func<TType1, object>>>.Ok(exp);
- }
- return GetExpressionInternal(modelProperty, field);
- }
- }
- }
|