swagger test data

This commit is contained in:
Tizian.Breuch
2025-07-23 21:21:18 +02:00
parent ce69373adb
commit 226e82c513
3 changed files with 374 additions and 75 deletions

View File

@@ -118,6 +118,8 @@ builder.Services.AddSwaggerGen(c =>
// 3. Optional: Filtern und Anzeigen von Autorisierungsinformationen (Rollen)
// Damit Swagger die "Authorize"-Informationen von Ihren Controllern anzeigt.
c.OperationFilter<AuthorizeOperationFilter>();
c.OperationFilter<LoginExampleOperationFilter>();
c.SchemaFilter<AddExampleSchemaFilter>();
});
// --- ENDE: DIENSTE ZUM CONTAINER HINZUF<55>GEN ---
@@ -152,16 +154,16 @@ using (var scope = app.Services.CreateScope())
}
// Erstelle einen initialen Admin-Benutzer
var adminUser = await userManager.FindByEmailAsync("admin-user@example.com"); // << ANPASSEN >>
var adminUser = await userManager.FindByEmailAsync("admin@yourwebshop.com"); // << ANPASSEN >>
if (adminUser == null)
{
adminUser = new IdentityUser
{
UserName = "admin-user@example.com", // << ANPASSEN >>
Email = "admin-user@example.com", // << ANPASSEN >>
UserName = "admin@yourwebshop.com", // << ANPASSEN >>
Email = "admin@yourwebshop.com", // << ANPASSEN >>
EmailConfirmed = true
};
var createAdmin = await userManager.CreateAsync(adminUser, "string"); // << ANPASSEN >>
var createAdmin = await userManager.CreateAsync(adminUser, "SecureAdminPass123!"); // << ANPASSEN >>
if (createAdmin.Succeeded)
{
await userManager.AddToRoleAsync(adminUser, "Admin");
@@ -174,16 +176,16 @@ using (var scope = app.Services.CreateScope())
}
// Erstelle einen initialen Kunden-Benutzer
var customerUser = await userManager.FindByEmailAsync("customer-user@example.com"); // << ANPASSEN >>
var customerUser = await userManager.FindByEmailAsync("customer@yourwebshop.com"); // << ANPASSEN >>
if (customerUser == null)
{
customerUser = new IdentityUser
{
UserName = "customer-user@example.com", // << ANPASSEN >>
Email = "customer-user@example.com", // << ANPASSEN >>
UserName = "customer@yourwebshop.com", // << ANPASSEN >>
Email = "customer@yourwebshop.com", // << ANPASSEN >>
EmailConfirmed = true
};
var createCustomer = await userManager.CreateAsync(customerUser, "string"); // << ANPASSEN >>
var createCustomer = await userManager.CreateAsync(customerUser, "SecureCustomerPass123!"); // << ANPASSEN >>
if (createCustomer.Succeeded)
{
await userManager.AddToRoleAsync(customerUser, "Customer");

View File

@@ -2,9 +2,10 @@
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Microsoft.OpenApi.Any; // Wichtig für OpenApiString, OpenApiDouble etc.
using Webshop.Application.DTOs; // Ihre DTOs
using Webshop.Application.DTOs.Auth;
using Webshop.Application.DTOs.Users;
using Webshop.Application.DTOs; // ProductDto, AdminProductDto, SupplierDto
using Webshop.Application.DTOs.Auth; // LoginRequestDto, RegisterRequestDto, AuthResponseDto
using Webshop.Application.DTOs.Users; // UserDto
using Webshop.Domain.Enums; // Für Enums in DTOs (z.B. AddressType, DiscountType etc.)
namespace Webshop.Api.SwaggerFilters
{
@@ -12,75 +13,19 @@ namespace Webshop.Api.SwaggerFilters
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
// Überprüfe den Typ des DTOs und setze ein Beispiel
if (context.Type == typeof(AdminProductDto))
var type = context.Type;
// --- Authentifizierung & Benutzer ---
if (type == typeof(LoginRequestDto))
{
// Beispiel für AdminProductDto (beachten Sie die realistischen Werte)
schema.Example = new OpenApiObject
{
// Bei POST-Requests wird die ID von der API generiert, daher hier eine Null-GUID oder weglassen.
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Admin Testprodukt XYZ"),
["description"] = new OpenApiString("Vollständige Beschreibung des Admin Testprodukts mit allen Details."),
["sku"] = new OpenApiString("ADM-XYZ-001"), // Muss einzigartig sein!
["price"] = new OpenApiDouble(199.99),
["oldPrice"] = new OpenApiNull(),
["isActive"] = new OpenApiBoolean(true),
["isInStock"] = new OpenApiBoolean(true),
["stockQuantity"] = new OpenApiInteger(50),
["weight"] = new OpenApiDouble(2.5),
["imageUrl"] = new OpenApiString("https://example.com/images/admin_test_xyz.jpg"),
["slug"] = new OpenApiString("admin-testprodukt-xyz"), // Muss einzigartig sein!
["createdDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["lastModifiedDate"] = new OpenApiNull(),
// Wichtig: supplierId auf null setzen, wenn noch keine Lieferanten in DB sind.
// Ansonsten eine echte, existierende Lieferanten-ID hier eintragen.
["supplierId"] = new OpenApiNull(), // Oder new OpenApiString("HIER-EINE-ECHTE-SUPPLIER-ID-EINFUEGEN")
["purchasePrice"] = new OpenApiDouble(120.00)
["email"] = new OpenApiString("admin@yourwebshop.com"),
["password"] = new OpenApiString("SecureAdminPass123!")
};
}
else if (context.Type == typeof(ProductDto))
else if (type == typeof(RegisterRequestDto))
{
// Beispiel für Public ProductDto
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Öffentliches Beispielprodukt"),
["description"] = new OpenApiString("Eine kurze Beschreibung des Produkts für den Webshop."),
["sku"] = new OpenApiString("PUB-ABC-001"),
["price"] = new OpenApiDouble(49.99),
["isActive"] = new OpenApiBoolean(true),
["isInStock"] = new OpenApiBoolean(true),
["stockQuantity"] = new OpenApiInteger(100),
["imageUrl"] = new OpenApiString("https://example.com/images/public_abc.jpg")
};
}
else if (context.Type == typeof(SupplierDto))
{
// Beispiel für SupplierDto
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Lieferant A GmbH"),
["contactPerson"] = new OpenApiString("Max Mustermann"),
["email"] = new OpenApiString("kontakt@lieferant-a.com"),
["phoneNumber"] = new OpenApiString("+49170123456"),
["addressId"] = new OpenApiNull(),
["notes"] = new OpenApiString("Hauptlieferant für Hardware.")
};
}
else if (context.Type == typeof(LoginRequestDto))
{
// Beispiel für LoginRequestDto
schema.Example = new OpenApiObject
{
["email"] = new OpenApiString("admin@yourwebshop.com"), // Oder customer@yourwebshop.com
["password"] = new OpenApiString("SecureAdminPass123!") // Oder SecureCustomerPass123!
};
}
else if (context.Type == typeof(RegisterRequestDto))
{
// Beispiel für RegisterRequestDto
schema.Example = new OpenApiObject
{
["email"] = new OpenApiString("neuer.kunde@example.com"),
@@ -90,7 +35,303 @@ namespace Webshop.Api.SwaggerFilters
["lastName"] = new OpenApiString("Musterfrau")
};
}
// Fügen Sie hier weitere else if Blöcke für andere DTOs hinzu, die Beispielwerte benötigen
else if (type == typeof(AuthResponseDto))
{
schema.Example = new OpenApiObject
{
["isAuthSuccessful"] = new OpenApiBoolean(true),
["errorMessage"] = new OpenApiString(""),
["token"] = new OpenApiString("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"),
["userId"] = new OpenApiString(Guid.NewGuid().ToString()),
["email"] = new OpenApiString("test@example.com"),
["roles"] = new OpenApiArray { new OpenApiString("Customer") }
};
}
else if (type == typeof(UserDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["email"] = new OpenApiString("admin@yourwebshop.com"),
["userName"] = new OpenApiString("admin@yourwebshop.com"),
["roles"] = new OpenApiArray { new OpenApiString("Admin") },
["createdDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["emailConfirmed"] = new OpenApiBoolean(true)
};
}
// --- Produkte & Lieferanten ---
else if (type == typeof(ProductDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()), // Bei POST leer lassen/null
["name"] = new OpenApiString("Beispiel Produkt X"),
["description"] = new OpenApiString("Eine kurze Beschreibung für das Produkt X."),
["sku"] = new OpenApiString("SKU-PUB-X001"), // Muss einzigartig sein!
["price"] = new OpenApiDouble(29.99),
["isActive"] = new OpenApiBoolean(true),
["isInStock"] = new OpenApiBoolean(true),
["stockQuantity"] = new OpenApiInteger(100),
["imageUrl"] = new OpenApiString("https://example.com/images/productX.jpg")
};
}
else if (type == typeof(AdminProductDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()), // Bei POST leer lassen/null
["name"] = new OpenApiString("Admin Produkt Z (Full Details)"),
["description"] = new OpenApiString("Detaillierte Beschreibung für das Admin-Produkt Z."),
["sku"] = new OpenApiString("SKU-ADM-Z001"), // Muss einzigartig sein!
["price"] = new OpenApiDouble(149.99),
["oldPrice"] = new OpenApiNull(),
["isActive"] = new OpenApiBoolean(true),
["isInStock"] = new OpenApiBoolean(true),
["stockQuantity"] = new OpenApiInteger(50),
["weight"] = new OpenApiDouble(1.2),
["imageUrl"] = new OpenApiString("https://example.com/images/admin_prodZ.jpg"),
["slug"] = new OpenApiString("admin-produkt-z-details"), // Muss einzigartig sein!
["createdDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["lastModifiedDate"] = new OpenApiNull(),
["supplierId"] = new OpenApiNull(), // ODER new OpenApiString("IHR-ECHTER-LIEFERANTEN-GUID-HIER"), wenn schon in DB
["purchasePrice"] = new OpenApiDouble(80.00)
};
}
else if (type == typeof(SupplierDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()), // Bei POST leer lassen/null
["name"] = new OpenApiString("Zulieferer Solutions GmbH"),
["contactPerson"] = new OpenApiString("Anna Bauer"),
["email"] = new OpenApiString("kontakt@zulieferer.com"),
["phoneNumber"] = new OpenApiString("+49 151 98765432"),
["addressId"] = new OpenApiNull(), // Oder new OpenApiString("IHR-ECHTER-ADRESS-GUID-HIER")
["notes"] = new OpenApiString("Wichtiger Lieferant für Rohstoffe.")
};
}
else if (type == typeof(ProductVariantDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["productId"] = new OpenApiString("PRODUCT_ID_HERE"), // MUSS ECHTE Produkt-ID sein
["name"] = new OpenApiString("Farbe"),
["value"] = new OpenApiString("Rot"),
["sku"] = new OpenApiString("VAR-RED-001"),
["priceAdjustment"] = new OpenApiDouble(5.00),
["stockQuantity"] = new OpenApiInteger(20),
["imageUrl"] = new OpenApiString("https://example.com/images/prod-variant-red.jpg"),
["isActive"] = new OpenApiBoolean(true)
};
}
// --- Kategorien ---
else if (type == typeof(CategoryDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Elektronik"),
["slug"] = new OpenApiString("elektronik"),
["description"] = new OpenApiString("Produkte rund um Elektronik."),
["parentCategoryId"] = new OpenApiNull(),
["imageUrl"] = new OpenApiString("https://example.com/images/category_electronics.jpg"),
["isActive"] = new OpenApiBoolean(true),
["displayOrder"] = new OpenApiInteger(1)
};
}
else if (type == typeof(CreateCategoryDto))
{
schema.Example = new OpenApiObject
{
["name"] = new OpenApiString("Neue Kategorie"),
["slug"] = new OpenApiString("neue-kategorie"), // Muss einzigartig sein!
["description"] = new OpenApiString("Eine Beschreibung für die neue Kategorie."),
["parentCategoryId"] = new OpenApiNull(),
["imageUrl"] = new OpenApiString("https://example.com/images/new_category.jpg"),
["isActive"] = new OpenApiBoolean(true),
["displayOrder"] = new OpenApiInteger(1)
};
}
// --- Adressen ---
else if (type == typeof(AddressDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["street"] = new OpenApiString("Musterstraße"),
["houseNumber"] = new OpenApiString("123a"),
["city"] = new OpenApiString("Musterstadt"),
["postalCode"] = new OpenApiString("12345"),
["country"] = new OpenApiString("Deutschland"),
["type"] = new OpenApiString(AddressType.Shipping.ToString()) // Enum-Beispiel
};
}
// --- Kunden ---
else if (type == typeof(CustomerDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["userId"] = new OpenApiString("EXISTING_IDENTITY_USER_ID"), // MUSS ECHTE IdentityUser ID sein
["firstName"] = new OpenApiString("Max"),
["lastName"] = new OpenApiString("Mustermann"),
["email"] = new OpenApiString("max.mustermann@example.com"),
["phoneNumber"] = new OpenApiString("+491719876543"),
["defaultShippingAddressId"] = new OpenApiNull(),
["defaultBillingAddressId"] = new OpenApiNull()
};
}
// --- Rabatte ---
else if (type == typeof(DiscountDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Sommerrabatt"),
["description"] = new OpenApiString("10% Rabatt auf alles"),
["type"] = new OpenApiString(DiscountType.Percentage.ToString()),
["value"] = new OpenApiDouble(10.00),
["couponCode"] = new OpenApiString("SOMMER2025"), // Optional, muss eindeutig sein
["startDate"] = new OpenApiString(DateTimeOffset.UtcNow.AddDays(1).ToString("o")),
["endDate"] = new OpenApiString(DateTimeOffset.UtcNow.AddDays(30).ToString("o")),
["isActive"] = new OpenApiBoolean(true),
["maxUses"] = new OpenApiInteger(100),
["currentUses"] = new OpenApiInteger(0)
};
}
// --- Bestellungen ---
else if (type == typeof(CreateOrderDto))
{
schema.Example = new OpenApiObject
{
["customerId"] = new OpenApiString("CUSTOMER_ID_HERE"), // Oder null für Gastbestellung
["guestEmail"] = new OpenApiString("guest@example.com"), // Nur bei Gastbestellung
["guestPhoneNumber"] = new OpenApiString("+491701234567"),
["shippingAddressId"] = new OpenApiString("VALID_ADDRESS_ID_HERE"), // MUSS EXISTIEREN
["billingAddressId"] = new OpenApiString("VALID_ADDRESS_ID_HERE"), // MUSS EXISTIEREN
["paymentMethodId"] = new OpenApiString("VALID_PAYMENT_METHOD_ID_HERE"), // MUSS EXISTIEREN
["shippingMethodId"] = new OpenApiString("VALID_SHIPPING_METHOD_ID_HERE"), // MUSS EXISTIEREN
["items"] = new OpenApiArray
{
new OpenApiObject
{
["productId"] = new OpenApiString("VALID_PRODUCT_ID_HERE"), // MUSS EXISTIEREN
["quantity"] = new OpenApiInteger(1)
},
new OpenApiObject
{
["productId"] = new OpenApiString("ANOTHER_PRODUCT_ID_HERE"),
["productVariantId"] = new OpenApiString("VALID_VARIANT_ID_HERE"), // Optional
["quantity"] = new OpenApiInteger(2)
}
}
};
}
else if (type == typeof(CreateOrderItemDto))
{
schema.Example = new OpenApiObject
{
["productId"] = new OpenApiString("VALID_PRODUCT_ID_HERE"),
["productVariantId"] = new OpenApiNull(), // Oder new OpenApiString("VALID_VARIANT_ID_HERE")
["quantity"] = new OpenApiInteger(1)
};
}
else if (type == typeof(OrderSummaryDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["orderNumber"] = new OpenApiString("WS-2025-0001"),
["orderDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["status"] = new OpenApiString(OrderStatus.Processing.ToString()),
["totalAmount"] = new OpenApiDouble(123.45),
["paymentStatus"] = new OpenApiString(PaymentStatus.Paid.ToString()),
["paymentMethodName"] = new OpenApiString("Kreditkarte"),
["shippingMethodName"] = new OpenApiString("Standardversand")
};
}
else if (type == typeof(OrderDetailDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["orderNumber"] = new OpenApiString("WS-2025-0002"),
["customerId"] = new OpenApiString(Guid.NewGuid().ToString()),
["orderDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["status"] = new OpenApiString(OrderStatus.Shipped.ToString()),
["totalAmount"] = new OpenApiDouble(245.67),
["shippingAddressId"] = new OpenApiString("VALID_ADDRESS_ID"),
["billingAddressId"] = new OpenApiString("VALID_ADDRESS_ID"),
["paymentMethodId"] = new OpenApiString("VALID_PAYMENT_METHOD_ID"),
["orderItems"] = new OpenApiArray {
new OpenApiObject { ["id"] = new OpenApiString(Guid.NewGuid().ToString()), ["productId"] = new OpenApiString("PROD_A_ID"), ["productName"] = new OpenApiString("Produkt A"), ["quantity"] = new OpenApiInteger(1), ["unitPrice"] = new OpenApiDouble(100.00), ["totalPrice"] = new OpenApiDouble(100.00) }
}
};
}
// --- Bewertungen ---
else if (type == typeof(ReviewDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["productId"] = new OpenApiString("PRODUCT_ID_HERE"),
["customerId"] = new OpenApiString("CUSTOMER_ID_HERE"),
["rating"] = new OpenApiInteger(5),
["title"] = new OpenApiString("Super Produkt!"),
["comment"] = new OpenApiString("Ich bin sehr zufrieden mit diesem Produkt."),
["reviewDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["isApproved"] = new OpenApiBoolean(true)
};
}
else if (type == typeof(CreateReviewDto))
{
schema.Example = new OpenApiObject
{
["productId"] = new OpenApiString("PRODUCT_ID_HERE"),
["rating"] = new OpenApiInteger(4),
["title"] = new OpenApiString("Gute Qualität"),
["comment"] = new OpenApiString("Das Produkt ist gut, aber die Lieferung dauerte etwas.")
};
}
// --- Einstellungen ---
else if (type == typeof(SettingDto))
{
schema.Example = new OpenApiObject
{
["key"] = new OpenApiString("ShippingCostFlatRate"),
["value"] = new OpenApiString("5.99"),
["description"] = new OpenApiString("Pauschale Versandkosten für alle Bestellungen"),
["lastModifiedDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o"))
};
}
// --- Zahlungsmethoden ---
else if (type == typeof(PaymentMethodDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Kreditkarte (Stripe)"),
["description"] = new OpenApiString("Zahlung über Stripe-Gateway."),
["isActive"] = new OpenApiBoolean(true),
["gatewayType"] = new OpenApiString(PaymentGatewayType.Stripe.ToString()),
["processingFee"] = new OpenApiDouble(0.02)
};
}
// --- Versandmethoden ---
else if (type == typeof(ShippingMethodDto))
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Standardversand DHL"),
["description"] = new OpenApiString("Standardlieferung innerhalb von 2-3 Werktagen."),
["cost"] = new OpenApiDouble(4.99),
["isActive"] = new OpenApiBoolean(true),
["minDeliveryDays"] = new OpenApiInteger(2),
["maxDeliveryDays"] = new OpenApiInteger(3)
};
}
}
}
}

View File

@@ -0,0 +1,56 @@
// src/Webshop.Api/SwaggerFilters/LoginExampleOperationFilter.cs
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Microsoft.OpenApi.Any;
using Webshop.Application.DTOs.Auth;
using System.Linq; // Für .FirstOrDefault()
using System.Net.Mime; // Für MediaTypeNames
namespace Webshop.Api.SwaggerFilters
{
public class LoginExampleOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
// Prüfen, ob dies der AuthController und eine der Login-Methoden ist
if (context.MethodInfo.DeclaringType == typeof(Controllers.Auth.AuthController) &&
(context.MethodInfo.Name == "LoginAdmin" || context.MethodInfo.Name == "LoginCustomer"))
{
// Beispiel für Admin-Login
if (context.MethodInfo.Name == "LoginAdmin")
{
operation.RequestBody.Content[MediaTypeNames.Application.Json].Examples["AdminLoginExample"] = new OpenApiExample
{
Value = new OpenApiObject
{
["email"] = new OpenApiString("admin@yourwebshop.com"),
["password"] = new OpenApiString("SecureAdminPass123!")
}
};
// Optional: Entfernen Sie andere Beispiele, falls sie den Standard überschreiben
// operation.RequestBody.Content[MediaTypeNames.Application.Json].Examples.Remove("Default");
}
// Beispiel für Customer-Login
else if (context.MethodInfo.Name == "LoginCustomer")
{
operation.RequestBody.Content[MediaTypeNames.Application.Json].Examples["CustomerLoginExample"] = new OpenApiExample
{
Value = new OpenApiObject
{
["email"] = new OpenApiString("customer@yourwebshop.com"),
["password"] = new OpenApiString("SecureCustomerPass123!")
}
};
// Optional: Entfernen Sie andere Beispiele
// operation.RequestBody.Content[MediaTypeNames.Application.Json].Examples.Remove("Default");
}
// Stellen Sie sicher, dass der Default-Beispielwert für LoginRequestDto aus dem Schemafilter nicht angezeigt wird,
// wenn wir hier spezifische Beispiele hinzufügen.
// Dies kann je nach Swashbuckle-Version und Konfiguration variieren.
// Eine Möglichkeit: Setzen Sie den Schema-Beispiel explizit auf Null für diese DTOs,
// oder lassen Sie ihn im SchemaFilter nur für DTOs, die keine OperationFilter erhalten.
}
}
}
}