/// <summary> /// Applies rules from validator. /// </summary> internal static void ApplyRulesToSchema( OpenApiSchema schema, Type schemaType, IEnumerable <string>?schemaPropertyNames, SchemaFilterContext?schemaFilterContext, IValidator validator, IReadOnlyCollection <FluentValidationRule> rules, ILogger logger) { var schemaTypeName = schemaType.Name; var lazyLog = new LazyLog(logger, l => l.LogDebug($"Applying FluentValidation rules to swagger schema '{schemaTypeName}'.")); schemaPropertyNames ??= schema.Properties?.Keys ?? Array.Empty <string>(); foreach (var schemaPropertyName in schemaPropertyNames) { var validationRules = validator.GetValidationRulesForMemberIgnoreCase(schemaPropertyName).ToArrayDebug(); foreach (var ruleContext in validationRules) { var propertyValidators = ruleContext.PropertyRule.Validators; foreach (var propertyValidator in propertyValidators) { foreach (var rule in rules) { if (rule.Matches(propertyValidator)) { try { var ruleHistoryItem = new RuleHistoryCache.RuleHistoryItem(schemaTypeName, schemaPropertyName, propertyValidator, rule.Name); if (!schema.ContainsRuleHistoryItem(ruleHistoryItem)) { lazyLog.LogOnce(); rule.Apply(new RuleContext(schema, schemaPropertyName, propertyValidator, schemaFilterContext, isCollectionValidator: ruleContext.IsCollectionRule)); logger.LogDebug($"Rule '{rule.Name}' applied for property '{schemaTypeName}.{schemaPropertyName}'."); schema.AddRuleHistoryItem(ruleHistoryItem); } else { logger.LogDebug($"Rule '{rule.Name}' already applied for property '{schemaTypeName}.{schemaPropertyName}'."); } } catch (Exception e) { logger.LogWarning(0, e, $"Error on apply rule '{rule.Name}' for property '{schemaTypeName}.{schemaPropertyName}'."); } } } } } } }
/// <summary> /// Applies rules from validator. /// </summary> internal static void ApplyRulesToSchema( Type schemaType, IEnumerable <string>?schemaPropertyNames, IValidator validator, ILogger logger, SchemaGenerationContext schemaGenerationContext) { OpenApiSchema schema = schemaGenerationContext.Schema; var schemaTypeName = schemaType.Name; var lazyLog = new LazyLog(logger, l => l.LogDebug($"Applying FluentValidation rules to swagger schema '{schemaTypeName}'.")); var validationRules = validator .GetValidationRules() .Where(context => context.ReflectionContext != null) .ToArray(); schemaPropertyNames ??= schema.Properties?.Keys ?? Array.Empty <string>(); foreach (var schemaPropertyName in schemaPropertyNames) { ValidationRuleInfo?validationRuleInfo = validationRules .FirstOrDefault(propertyRule => IsMatchesRule(propertyRule, schemaPropertyName, schemaGenerationContext.SchemaGenerationSettings)); if (validationRuleInfo != null) { var propertyValidators = validationRuleInfo.PropertyRule.GetValidators(); foreach (var propertyValidator in propertyValidators) { foreach (var rule in schemaGenerationContext.Rules) { if (rule.IsMatches(propertyValidator)) { try { var ruleHistoryItem = new RuleHistoryCache.RuleHistoryItem(schemaTypeName, schemaPropertyName, propertyValidator, rule.Name); if (!schema.ContainsRuleHistoryItem(ruleHistoryItem)) { lazyLog.LogOnce(); var ruleContext = new RuleContext( schema: schema, propertyKey: schemaPropertyName, validationRuleInfo: validationRuleInfo, propertyValidator: propertyValidator, reflectionContext: validationRuleInfo.ReflectionContext); rule.Apply(ruleContext); logger.LogDebug($"Rule '{rule.Name}' applied for property '{schemaTypeName}.{schemaPropertyName}'."); schema.AddRuleHistoryItem(ruleHistoryItem); } else { logger.LogDebug($"Rule '{rule.Name}' already applied for property '{schemaTypeName}.{schemaPropertyName}'."); } } catch (Exception e) { logger.LogWarning(0, e, $"Error on apply rule '{rule.Name}' for property '{schemaTypeName}.{schemaPropertyName}'."); } } } } } } }