私は苦労して私の質問に対する答えを見つけました。 私はそれを置いているので、次の人が私の問題を抱えていれば、私はもっと素敵な時を過ごすことができます。 DocumentFilterで次に
public static class SwashbuckleExtensions
{
public static IEnumerable<Operation> EnumerateOperations(this PathItem pathItem)
{
if (pathItem == null)
{
yield break;
}
yield return pathItem.get;
yield return pathItem.post;
yield return pathItem.put;
yield return pathItem.delete;
yield return pathItem.options;
yield return pathItem.head;
}
public static IEnumerable<Schema> EnumerateSchema(this Operation operation)
{
if (operation == null)
{
yield break;
}
foreach (var response in operation.responses ?? new Dictionary<string, Response>())
{
yield return response.Value.schema;
if (response.Value.schema.items != null)
{
yield return response.Value.schema.items;
}
}
foreach (var parameter in operation.parameters ?? new List<Parameter>())
{
yield return parameter.schema;
}
}
public static IEnumerable<Schema> FindAdditionalSchema(this Schema schema, IDictionary<string, Schema> listOfDefinition)
{
if (!string.IsNullOrEmpty([email protected]))
{
Schema definition;
if (listOfDefinition.TryGetValue([email protected]("#/definitions/", String.Empty), out definition))
{
foreach (var propertySchema in definition.properties)
{
yield return propertySchema.Value;
}
}
}
if (!string.IsNullOrEmpty([email protected]))
{
Schema definition;
if (listOfDefinition.TryGetValue([email protected]("#/definitions/", String.Empty), out definition))
{
foreach (var propertySchema in definition.properties)
{
yield return propertySchema.Value;
}
}
}
}
public static IEnumerable<Schema> EnumerateSchema(this Schema schema,IDictionary<string,Schema> listOfDefinition, int dept = 0)
{
if (schema == null)
{
yield break;
}
if (dept > 10)
{
yield break;
}
if (dept == 0)
{
yield return schema;
}
var ListOfAdditionalSchema = schema.FindAdditionalSchema(listOfDefinition) ?? new List<Schema>();
foreach (var additionalSchema in ListOfAdditionalSchema)
{
yield return additionalSchema;
foreach (var childSchema in additionalSchema.EnumerateSchema(listOfDefinition,dept++) ?? new List<Schema>())
{
yield return childSchema;
}
}
}
}
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
foreach (var value in swaggerDoc.paths.Values)
{
if (value.post != null && value.post.tags.Contains(ToHide))
value.post = null;
if (value.get != null && value.get.tags.Contains(ToHide))
value.get = null;
if (value.put != null && value.put.tags.Contains(ToHide))
value.put = null;
if (value.delete != null && value.delete.tags.Contains(ToHide))
value.delete = null;
if (value.head != null && value.head.tags.Contains(ToHide))
value.head = null;
if (value.options != null && value.options.tags.Contains(ToHide))
value.options = null;
}
var pathToDelete = swaggerDoc.paths.Where(x => !x.Value.EnumerateOperations().Any(y=>y != null))
.ToList();//Deleting item from source need list
foreach (var item in pathToDelete)
{
swaggerDoc.paths.Remove(item.Key);
}
var listOfSchemaWithReference = swaggerDoc.paths.SelectMany(x => x.Value.EnumerateOperations())//Find operation by path
.SelectMany(x => x.EnumerateSchema()) //Find schema by operation
.SelectMany(x => x.EnumerateSchema(swaggerDoc.definitions))//Find Schema by schema (dependent schema)
.Where(x=> [email protected] != null || [email protected] != null)//I only wany the schema that reference a definition.
.Select(x=> (([email protected]) ?? ([email protected])).Replace("#/definitions/", String.Empty))//remove the path and keep the Model name
.Distinct()//I dont like duplicates
.ToList();//commit to memory
//Not finding a definition in the built list of reference means its unreferenced and can be removed.
var listOfUnreferencedDefinition = swaggerDoc.definitions.Where(x => !listOfSchemaWithReference.Any(y => y == x.Key))
.ToList();//Deleting item from source need list
foreach (var unreferencedDefinition in listOfUnreferencedDefinition)
{
swaggerDoc.definitions.Remove(unreferencedDefinition.Key);
}
}
}