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); } }
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); } }
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); } }
//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); }
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); }
public async Task <Result <object> > Add(ManageEntityRequest request, object businessRepository, IActionContextInfo actionContext) { return(await CallMethod(nameof(EfCoreEntityHandlerInternal.AddInternal), request, businessRepository, actionContext)); }