private static List <string> ConvertToFluentValidators(DataProperty dataProp, StructuralType structuralType) { var toReplace = new HashSet <string> { "required", "maxLength" }; var convertedVals = new List <string>(); var entityType = structuralType as EntityType; foreach (var validator in dataProp.Validators.Where(o => toReplace.Contains(o.Name)).ToList()) { dataProp.Validators.Remove(validator); Validator newValidator = null; var name = validator.Name; if (name == "required" && NullableProperties.Contains(dataProp.NameOnServer)) { convertedVals.Add("fvNotNull"); convertedVals.Add("fvNotEmpty"); dataProp.IsNullable = true; continue; } switch (name) { case "required": //Check if the property is a foreignKey if it is then default type value is not valid if (entityType != null && !string.IsNullOrEmpty(dataProp.NameOnServer) && entityType.NavigationProperties .Any(o => o.ForeignKeyNamesOnServer != null && o.ForeignKeyNamesOnServer .Any(fk => fk == dataProp.NameOnServer))) { newValidator = new Validator { Name = "fvNotEmpty" }; var defVal = dataProp.PropertyInfo?.PropertyType.GetDefaultValue(); newValidator.MergeLeft(FluentValidators.GetParamaters(new NotEmptyValidator(defVal))); convertedVals.Add("fvNotEmpty"); } else { newValidator = new Validator { Name = "fvNotNull" }; newValidator.MergeLeft(FluentValidators.GetParamaters(new NotNullValidator())); convertedVals.Add("fvNotNull"); } break; case "maxLength": newValidator = new Validator { Name = "fvLength" }; newValidator.MergeLeft(FluentValidators.GetParamaters(new LengthValidator(0, dataProp.MaxLength))); convertedVals.Add("fvLength"); break; } dataProp.Validators.Add(newValidator); } return(convertedVals); }
private MetadataSchema SetupValidators(BreezeMetadataBuiltEvent asyncEvent) { var metadata = asyncEvent.Metadata; //Setup entity models (persisted) var entityClass = typeof(IEntity); var clientModelClass = typeof(IClientModel); var entityModelTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes() .Where(type => type.IsClass /*&& !type.IsAbstract*/ && (entityClass.IsAssignableFrom(type) || clientModelClass.IsAssignableFrom(type)))).ToList(); foreach (var structuralType in metadata.StructuralTypes.Where(x => x is EntityType)) { var entityModelType = entityModelTypes.FirstOrDefault(e => e.Name == structuralType.ShortName); if (entityModelType != null) { var validationRules = _validatorFactory.GetValidator(entityModelType) as IEnumerable <IValidationRule>; if (validationRules == null) { continue; } var allPropertyRules = validationRules.OfType <PropertyRule>() .Where(x => !string.IsNullOrEmpty(x.PropertyName)) .ToLookup(o => o.PropertyName, o => o); foreach (var dataProperty in structuralType.DataProperties) { dataProperty.Validators = dataProperty.Validators ?? new Validators(); var convertedVals = ConvertToFluentValidators(dataProperty, structuralType); var propertyRules = allPropertyRules[dataProperty.NameOnServer] .Where(pr => pr.RuleSets == null || ValidationRuleSet.AttributeInsertUpdateDefault.Intersect(pr.RuleSets).Any()); foreach (var propertyRule in propertyRules) { var currentValidator = propertyRule.CurrentValidator; var name = FluentValidators.GetName(currentValidator); if (string.IsNullOrEmpty(name) || convertedVals.Contains(name)) { continue; } var validator = new Validator() { Name = name }; validator.MergeLeft(FluentValidators.GetParamaters(currentValidator)); dataProperty.Validators.AddOrUpdate(validator); } } } } //Setup codelists //var codeListType = typeof(ICodeList); //var codeListTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes() // .Where(type => type.IsClass && !type.IsAbstract && codeListClass.IsAssignableFrom(type))).ToList(); foreach (var structuralType in metadata.StructuralTypes.OfType <EntityType>()) { if (structuralType.Namespace.EndsWith(".CodeLists")) { structuralType.AutoGeneratedKeyType = Metadata.AutoGeneratedKeyType.KeyGenerator; } } var versionedEntityType = typeof(IVersionedEntity); var versionedEntityProperties = new[] { "CreatedDate", "CreatedBy", "CreatedById", "ModifiedByDate", "ModifiedBy", "ModifiedById" }; foreach (var structuralType in metadata.StructuralTypes.OfType <EntityType>()) { var type = Type.GetType($"{structuralType.Namespace}.{structuralType.ShortName}"); if (type != null && type.IsAssignableFrom(versionedEntityType)) { foreach (var property in structuralType.DataProperties) { if (versionedEntityProperties.Contains(property.NameOnServer)) { property.IsNullable = true; if (property.Validators != null) { var requiredValidator = property.Validators.FirstOrDefault(x => x.Name == "required"); if (requiredValidator != null) { property.Validators.Remove(requiredValidator); } } } } } } return(metadata); }