Exemplo n.º 1
0
        /// <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,
            };
        }
Exemplo n.º 2
0
 public SchemaBuilder()
 {
     _schemaGenerationSettings = new SchemaGenerationSettings()
     {
         NameResolver     = new SystemTextJsonNameResolver(),
         SchemaIdSelector = new SchemaGeneratorOptions().SchemaIdSelector
     };
 }
Exemplo n.º 3
0
 /// <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));
 }
Exemplo n.º 4
0
        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;
 }
Exemplo n.º 6
0
        /// <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);
        }