/// <summary> /// Initializes a new instance of the <see cref="FluentValidationOperationFilter"/> class. /// </summary> /// <param name="swaggerGenOptions">Swagger generation options.</param> /// <param name="validatorFactory">FluentValidation factory.</param> /// <param name="rules">External FluentValidation rules. External rule overrides default rule with the same name.</param> /// <param name="loggerFactory">Logger factory.</param> /// <param name="schemaGenerationOptions">Schema generation options.</param> public FluentValidationOperationFilter( // System services ILoggerFactory?loggerFactory = null, // FluentValidation services IValidatorFactory?validatorFactory = null, // MicroElements services IEnumerable <FluentValidationRule>?rules = null, IOptions <SchemaGenerationOptions>?schemaGenerationOptions = null, INameResolver?nameResolver = null, // Swashbuckle services IOptions <SwaggerGenOptions>?swaggerGenOptions = null) { // System services _logger = loggerFactory?.CreateLogger(typeof(FluentValidationRules)) ?? NullLogger.Instance; // FluentValidation services _validatorFactory = validatorFactory; // MicroElements services _rules = new DefaultFluentValidationRuleProvider(schemaGenerationOptions).GetRules().ToArray().OverrideRules(rules); _schemaGenerationOptions = schemaGenerationOptions?.Value ?? new SchemaGenerationOptions(); _schemaGenerationSettings = new SchemaGenerationSettings { NameResolver = nameResolver, }; // Swashbuckle services _schemaGenerationSettings = _schemaGenerationSettings with { SchemaIdSelector = swaggerGenOptions?.Value?.SchemaGeneratorOptions.SchemaIdSelector ?? new SchemaGeneratorOptions().SchemaIdSelector, }; }
public SchemaBuilder() { _schemaGenerationSettings = new SchemaGenerationSettings() { NameResolver = new SystemTextJsonNameResolver(), SchemaIdSelector = new SchemaGeneratorOptions().SchemaIdSelector }; }
/// <summary> /// Creates an instance of <see cref="SchemaReferenceRegistry"/>. /// </summary> /// <param name="schemaGenerationSettings">The schema generation settings.</param> /// <param name="propertyDescriptionMap">The property description map.</param> public SchemaReferenceRegistry(SchemaGenerationSettings schemaGenerationSettings, Dictionary <string, string> propertyDescriptionMap) { _schemaGenerationSettings = schemaGenerationSettings ?? throw new ArgumentNullException(nameof(schemaGenerationSettings)); _propertyNameResolver = schemaGenerationSettings.PropertyNameResolver; _propertyDescriptionMap = propertyDescriptionMap ?? throw new ArgumentNullException(nameof(propertyDescriptionMap)); }
public SchemaBuilder <T> ConfigureSchemaGenerationOptions( Action <SchemaGenerationOptions> configureSchemaGenerationOptions, Func <SchemaGenerationSettings, SchemaGenerationSettings>?configureSchemaGenerationSettings = null) { configureSchemaGenerationOptions(_schemaGenerationOptions); if (configureSchemaGenerationSettings != null) { _schemaGenerationSettings = configureSchemaGenerationSettings(_schemaGenerationSettings); } return(this); }
/// <summary> /// Creates an instance of <see cref="SchemaReferenceRegistry"/>. /// </summary> /// <param name="schemaGenerationSettings">The schema generation settings.</param> public SchemaReferenceRegistry(SchemaGenerationSettings schemaGenerationSettings) { _schemaGenerationSettings = schemaGenerationSettings ?? throw new ArgumentNullException(nameof(schemaGenerationSettings)); _propertyNameResolver = schemaGenerationSettings.PropertyNameResolver; }
/// <summary> /// Builds <see cref="InternalGenerationContext"/> by reflecting into contract assemblies. /// </summary> /// <param name="contractAssembliesPaths">The contract assemlby paths.</param> /// <param name="operationElements">The operation xelements.</param> /// <param name="propertyElements">The property xelements</param> /// <param name="documentVariantElementName">The document variant element name.</param> /// <param name="internalSchemaGenerationSettings"><see cref="InternalSchemaGenerationSettings"/></param> /// <returns>Serialized <see cref="InternalGenerationContext"/></returns> public string BuildInternalGenerationContext( IList <string> contractAssembliesPaths, IList <string> operationElements, IList <string> propertyElements, string documentVariantElementName, InternalSchemaGenerationSettings internalSchemaGenerationSettings) { var crefSchemaMap = new Dictionary <string, InternalSchemaGenerationInfo>(); List <XElement> xPropertyElements = propertyElements.Select(XElement.Parse).ToList(); var propertyMap = new Dictionary <string, string>(); foreach (var xPropertyElement in xPropertyElements) { var name = xPropertyElement .Attributes(KnownXmlStrings.Name)?.FirstOrDefault()?.Value?.Split(':')[1]; var description = xPropertyElement.Element(KnownXmlStrings.Summary)?.Value.RemoveBlankLines(); if (!propertyMap.ContainsKey(name)) { propertyMap.Add(name, description); } } var referenceRegistryMap = new Dictionary <DocumentVariantInfo, SchemaReferenceRegistry>(); var schemaGenerationSettings = new SchemaGenerationSettings(new DefaultPropertyNameResolver()); if (internalSchemaGenerationSettings.PropertyNameResolverName == typeof(CamelCasePropertyNameResolver).FullName) { schemaGenerationSettings = new SchemaGenerationSettings(new CamelCasePropertyNameResolver()); } var internalGenerationContext = new InternalGenerationContext(); #if !NETFRAMEWORK var typeFetcher = new TypeFetcher(contractAssembliesPaths, Context); #else var typeFetcher = new TypeFetcher(contractAssembliesPaths); #endif List <XElement> xOperationElements = operationElements.Select(XElement.Parse).ToList(); foreach (var xOperationElement in xOperationElements) { if (!referenceRegistryMap.ContainsKey(DocumentVariantInfo.Default)) { referenceRegistryMap.Add( DocumentVariantInfo.Default, new SchemaReferenceRegistry(schemaGenerationSettings, propertyMap)); } // Recursively build the various cref-schema, cref-fieldValue map. BuildMap( xOperationElement, crefSchemaMap, internalGenerationContext.CrefToFieldValueMap, typeFetcher, referenceRegistryMap[DocumentVariantInfo.Default]); var customElements = xOperationElement.Descendants(documentVariantElementName); // Build the various cref-schema, cref-fieldValue map for each customElement. foreach (var customElement in customElements) { var documentVariantInfo = new DocumentVariantInfo { Categorizer = customElement.Name.LocalName.Trim(), Title = customElement.Value.Trim() }; if (!referenceRegistryMap.ContainsKey(documentVariantInfo)) { referenceRegistryMap.Add( documentVariantInfo, new SchemaReferenceRegistry(schemaGenerationSettings, propertyMap)); } BuildMap( xOperationElement, crefSchemaMap, internalGenerationContext.CrefToFieldValueMap, typeFetcher, referenceRegistryMap[documentVariantInfo]); } } foreach (var key in referenceRegistryMap.Keys) { var references = referenceRegistryMap[key].References; internalGenerationContext.VariantSchemaReferenceMap.Add( key.ToString(), references.ToDictionary(k => k.Key, k => k.Value.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0))); } internalGenerationContext.CrefToSchemaMap = crefSchemaMap; // Serialize the context to transfer across app domain. var document = JsonConvert.SerializeObject(internalGenerationContext); return(document); }