Ejemplo n.º 1
0
        internal async Task <Result <object> > DeleteInternal <TEntity>(ManageEntityRequest <TEntity> request
                                                                        , DbContext dbContext, IActionContextInfo actionContext)
            where TEntity : class
        {
            try
            {
                //var validationResult = _validator.Validate(request.Entity, ActionTypeEnum.Delete, actionContext);
                //if (validationResult?.IsValid == false)
                //{
                //	return validationResult;
                //}
                var set    = dbContext.Set <TEntity>();
                var entity = await set.FindAsync(_entityHelper.GetPrimaryKey(request.Entity));

                set.Remove(entity);
                return(request.Entity);
            }
            catch (Exception ex)
            {
                return(ex);
            }
        }
Ejemplo n.º 2
0
        internal async Task <Result <object> > EditInternal <TEntity>(ManageEntityRequest <TEntity> request
                                                                      , DbContext dbContext, IActionContextInfo actionContext)
            where TEntity : class
        {
            try
            {
                // var validationResult = _validator.Validate(request.Entity, ActionTypeEnum.Update, actionContext);
                //if (validationResult?.IsValid == false)
                //{
                //	return new BadRequestObjectResult(validationResult);
                //}

                var set      = dbContext.Set <TEntity>();
                var existing = await set.FindAsync(_entityHelper.GetPrimaryKey(request.Entity));

                _entityHelper.CopyPropertyValues(request.Entity, existing);
                return(existing);
            }
            catch (Exception ex)
            {
                return(ex);
            }
        }
Ejemplo n.º 3
0
        internal async Task <Result <object> > AddInternal <TEntity>(ManageEntityRequest <TEntity> request
                                                                     , DbContext dbContext, IActionContextInfo actionContext)
            where TEntity : class
        {
            try
            {
                var validationResult = _validator.Validate(request.Entity, ActionTypeEnum.Insert, actionContext);
                if (validationResult?.IsValid == false)
                {
                    return(validationResult);
                }

                var set = dbContext.Set <TEntity>();
                await set.AddAsync(request.Entity);

                return(request.Entity);
            }
            catch (Exception ex)
            {
                return(ex);
            }
        }
Ejemplo n.º 4
0
        //TODO: This should get a Model or a dynamic type instead of the Entity. In the current state, validation ignores required non nullable value types.
        public ModelStateDictionary Validate <TEntity>(TEntity entity, ActionTypeEnum actionType, IActionContextInfo actionContext)
        {
            var entityMetadata = _implementationsContainer.Metadata[typeof(TEntity).Name];
            Dictionary <string, IEnumerable <string> > propertyValidationErrors = null;

            foreach (var property in entityMetadata.GetAllProperties())
            {
                if (property.IsExpression)
                {
                    continue;
                }
                if (actionContext.ExcludedProperties != null && actionContext.ExcludedProperties.Contains(property.Name))
                {
                    continue;
                }
                if (actionContext != null && actionContext.Masters != null &&
                    actionContext.Masters.Any(m => m.MasterProperty.InverseProperty == property || m.MasterProperty.InverseProperty?.ForeignKey == property))
                {
                    continue;
                }
                if (property.IsRequired())
                {
                    var reflectionProperty = typeof(TEntity).GetProperty(property.Name);
                    if (reflectionProperty.PropertyType == typeof(bool))
                    {
                        continue;
                    }
                    if (reflectionProperty.GetValue(entity) == null || (reflectionProperty.PropertyType.IsValueType && reflectionProperty.GetValue(entity).Equals(Activator.CreateInstance(reflectionProperty.PropertyType))))
                    {
                        if (propertyValidationErrors == null)
                        {
                            propertyValidationErrors = new Dictionary <string, IEnumerable <string> >();
                        }
                        propertyValidationErrors.Add(property.Name, new List <string> {
                            $"The value for {property.Title ?? property.Name} is empty."
                        });
                    }
                }
                //Todo: Add more validation logic, like passwords, email addresses, ...
            }
            if (propertyValidationErrors != null)
            {
                var modelState = new ModelStateDictionary();
                foreach (var prop in propertyValidationErrors.Keys)
                {
                    foreach (var error in propertyValidationErrors[prop])
                    {
                        modelState.AddModelError(prop, error);
                    }
                }
                return(modelState);
            }
            return(null);
        }
Ejemplo n.º 5
0
        private async Task <Result <object> > CallMethod(string internalMethodName
                                                         , ManageEntityRequest request, object businessRepository, IActionContextInfo actionContext)
        {
            var    entityType = _implementationsContainer.Reflector.GetType(request.EntityTypeName);
            var    method     = _handlerInternal.GetType().GetMethod(internalMethodName, BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(entityType);
            object r          = EntityHelper.CreateGenericObject(request, entityType);
            var    awaitable  = method.Invoke(_handlerInternal, new object[] { r, businessRepository, actionContext }) as Task <Result <object> >;

            return(await awaitable);
        }
Ejemplo n.º 6
0
 public async Task <Result <object> > Add(ManageEntityRequest request, object businessRepository, IActionContextInfo actionContext)
 {
     return(await CallMethod(nameof(EfCoreEntityHandlerInternal.AddInternal), request, businessRepository, actionContext));
 }