This commit is contained in:
Tizian.Breuch
2025-07-23 22:42:43 +02:00
parent 8219bf8d98
commit b85e07f14e

View File

@@ -1,10 +1,12 @@
// src/Webshop.Api/SwaggerFilters/AddExampleSchemaFilter.cs
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Microsoft.OpenApi.Any; // Wichtig für OpenApiString, OpenApiDouble etc.
using Webshop.Application.DTOs; // ProductDto, AdminProductDto, SupplierDto
using Webshop.Application.DTOs.Auth; // LoginRequestDto, RegisterRequestDto, AuthResponseDto
using Webshop.Application.DTOs.Users; // UserDto
using Microsoft.OpenApi.Any;
using Webshop.Application.DTOs;
using Webshop.Application.DTOs.Auth;
using Webshop.Application.DTOs.Users;
using Webshop.Domain.Enums;
using System; // Für Guid.NewGuid()
namespace Webshop.Api.SwaggerFilters
{
@@ -13,21 +15,23 @@ namespace Webshop.Api.SwaggerFilters
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
var type = context.Type;
// Eine eindeutige Kennung, die wir an SKU/Slug anhängen können
var uniqueId = Guid.NewGuid().ToString().Substring(0, 8); // Z.B. 8 Zeichen der GUID
// --- Authentifizierung & Benutzer ---
// --- Authentifizierung & Benutzer (Allgemeine Schemas) ---
if (type == typeof(LoginRequestDto))
{
schema.Example = new OpenApiObject
{
["email"] = new OpenApiString("admin@yourwebshop.com"),
["password"] = new OpenApiString("SecureAdminPass123!")
["email"] = new OpenApiString("user@example.com"),
["password"] = new OpenApiString("Password123!")
};
}
else if (type == typeof(RegisterRequestDto))
{
schema.Example = new OpenApiObject
{
["email"] = new OpenApiString("neuer.kunde@example.com"),
["email"] = new OpenApiString($"neuer.kunde.{uniqueId}@example.com"), // Eindeutige E-Mail
["password"] = new OpenApiString("NeuesPasswort123!"),
["confirmPassword"] = new OpenApiString("NeuesPasswort123!"),
["firstName"] = new OpenApiString("Erika"),
@@ -42,7 +46,7 @@ namespace Webshop.Api.SwaggerFilters
["errorMessage"] = new OpenApiString(""),
["token"] = new OpenApiString("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"),
["userId"] = new OpenApiString(Guid.NewGuid().ToString()),
["email"] = new OpenApiString("test@example.com"),
["email"] = new OpenApiString("loggedin@example.com"),
["roles"] = new OpenApiArray { new OpenApiString("Customer") }
};
}
@@ -51,9 +55,9 @@ namespace Webshop.Api.SwaggerFilters
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") },
["email"] = new OpenApiString("user@example.com"),
["userName"] = new OpenApiString("user@example.com"),
["roles"] = new OpenApiArray { new OpenApiString("Customer") },
["createdDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["emailConfirmed"] = new OpenApiBoolean(true)
};
@@ -63,36 +67,36 @@ namespace Webshop.Api.SwaggerFilters
{
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!
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString($"Public Produkt Beispiel {uniqueId}"),
["description"] = new OpenApiString("Eine kurze Beschreibung für das öffentliche Produkt."),
["sku"] = new OpenApiString($"PUB-PROD-{uniqueId}"),
["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")
["imageUrl"] = new OpenApiString("https://example.com/images/public_prod.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!
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString($"Admin Produkt (Beispiel) {uniqueId}"),
["description"] = new OpenApiString("Detaillierte Beschreibung für das Admin-Produkt."),
["sku"] = new OpenApiString($"ADM-PROD-{uniqueId}"),
["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!
["imageUrl"] = new OpenApiString("https://example.com/images/admin_prod.jpg"),
["slug"] = new OpenApiString($"admin-produkt-beispiel-slug-{uniqueId}"),
["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
["supplierId"] = new OpenApiNull(), // ODER new OpenApiString("IHR-ECHTER-LIEFERANTEN-GUID-HIER")
["purchasePrice"] = new OpenApiDouble(80.00)
};
}
@@ -100,12 +104,12 @@ namespace Webshop.Api.SwaggerFilters
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()), // Bei POST leer lassen/null
["name"] = new OpenApiString("Zulieferer Solutions GmbH"),
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString($"Zulieferer Solutions GmbH {uniqueId}"),
["contactPerson"] = new OpenApiString("Anna Bauer"),
["email"] = new OpenApiString("kontakt@zulieferer.com"),
["email"] = new OpenApiString($"kontakt.{uniqueId}@zulieferer.com"),
["phoneNumber"] = new OpenApiString("+4915198765432"),
["addressId"] = new OpenApiNull(), // Oder new OpenApiString("IHR-ECHTER-ADRESS-GUID-HIER")
["addressId"] = new OpenApiNull(),
["notes"] = new OpenApiString("Wichtiger Lieferant für Rohstoffe.")
};
}
@@ -114,12 +118,12 @@ namespace Webshop.Api.SwaggerFilters
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"),
["productId"] = new OpenApiString("EIN_PRODUKT_GUID_HIER"),
["name"] = new OpenApiString("Variante: Schwarz L"),
["value"] = new OpenApiString("Schwarz, L"),
["sku"] = new OpenApiString($"VARIANT-ABC-{uniqueId}"),
["priceAdjustment"] = new OpenApiDouble(5.00),
["stockQuantity"] = new OpenApiInteger(20),
["stockQuantity"] = new OpenApiInteger(25),
["imageUrl"] = new OpenApiString("https://example.com/images/prod-variant-red.jpg"),
["isActive"] = new OpenApiBoolean(true)
};
@@ -129,9 +133,9 @@ namespace Webshop.Api.SwaggerFilters
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Elektronik"),
["slug"] = new OpenApiString("elektronik"),
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["name"] = new OpenApiString($"Elektronik {uniqueId}"),
["slug"] = new OpenApiString($"elektronik-{uniqueId}"),
["description"] = new OpenApiString("Produkte rund um Elektronik."),
["parentCategoryId"] = new OpenApiNull(),
["imageUrl"] = new OpenApiString("https://example.com/images/category_electronics.jpg"),
@@ -143,8 +147,8 @@ namespace Webshop.Api.SwaggerFilters
{
schema.Example = new OpenApiObject
{
["name"] = new OpenApiString("Neue Kategorie"),
["slug"] = new OpenApiString("neue-kategorie"), // Muss einzigartig sein!
["name"] = new OpenApiString($"Neue Kategorie {uniqueId}"),
["slug"] = new OpenApiString($"neue-kategorie-{uniqueId}"),
["description"] = new OpenApiString("Eine Beschreibung für die neue Kategorie."),
["parentCategoryId"] = new OpenApiNull(),
["imageUrl"] = new OpenApiString("https://example.com/images/new_category.jpg"),
@@ -163,7 +167,7 @@ namespace Webshop.Api.SwaggerFilters
["city"] = new OpenApiString("Musterstadt"),
["postalCode"] = new OpenApiString("12345"),
["country"] = new OpenApiString("Deutschland"),
["type"] = new OpenApiString(AddressType.Shipping.ToString()) // Enum-Beispiel
["type"] = new OpenApiString(AddressType.Shipping.ToString())
};
}
// --- Kunden ---
@@ -171,11 +175,11 @@ namespace Webshop.Api.SwaggerFilters
{
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["userId"] = new OpenApiString("EXISTING_IDENTITY_USER_ID"), // MUSS ECHTE IdentityUser ID sein
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["userId"] = new OpenApiString("EIN_IDENTITY_USER_ID_HIER"),
["firstName"] = new OpenApiString("Max"),
["lastName"] = new OpenApiString("Mustermann"),
["email"] = new OpenApiString("max.mustermann@example.com"),
["email"] = new OpenApiString($"max.mustermann.{uniqueId}@example.com"),
["phoneNumber"] = new OpenApiString("+491719876543"),
["defaultShippingAddressId"] = new OpenApiNull(),
["defaultBillingAddressId"] = new OpenApiNull()
@@ -187,16 +191,17 @@ namespace Webshop.Api.SwaggerFilters
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Sommerrabatt"),
["name"] = new OpenApiString($"Sommerrabatt {uniqueId}"),
["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
["couponCode"] = new OpenApiString($"SOMMER-{uniqueId}"), // 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)
["currentUses"] = new OpenApiInteger(0),
["description"] = new OpenApiString("Gültig vom 1. September bis 30. September.")
};
}
// --- Bestellungen ---
@@ -204,24 +209,24 @@ namespace Webshop.Api.SwaggerFilters
{
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
["customerId"] = new OpenApiString("CUSTOMER_ID_HERE"),
["guestEmail"] = new OpenApiString($"gast.besteller.{uniqueId}@example.com"),
["guestPhoneNumber"] = new OpenApiString("+4917611223344"),
["shippingAddressId"] = new OpenApiString("VALID_ADDRESS_ID_HERE"),
["billingAddressId"] = new OpenApiString("VALID_ADDRESS_ID_HERE"),
["paymentMethodId"] = new OpenApiString("VALID_PAYMENT_METHOD_ID_HERE"),
["shippingMethodId"] = new OpenApiString("VALID_SHIPPING_METHOD_ID_HERE"),
["items"] = new OpenApiArray
{
new OpenApiObject
{
["productId"] = new OpenApiString("VALID_PRODUCT_ID_HERE"), // MUSS EXISTIEREN
["productId"] = new OpenApiString("VALID_PRODUCT_ID_HERE"),
["quantity"] = new OpenApiInteger(1)
},
new OpenApiObject
{
["productId"] = new OpenApiString("ANOTHER_PRODUCT_ID_HERE"),
["productVariantId"] = new OpenApiString("VALID_VARIANT_ID_HERE"), // Optional
["productVariantId"] = new OpenApiString("VALID_VARIANT_ID_HERE"),
["quantity"] = new OpenApiInteger(2)
}
}
@@ -232,7 +237,7 @@ namespace Webshop.Api.SwaggerFilters
schema.Example = new OpenApiObject
{
["productId"] = new OpenApiString("VALID_PRODUCT_ID_HERE"),
["productVariantId"] = new OpenApiNull(), // Oder new OpenApiString("VALID_VARIANT_ID_HERE")
["productVariantId"] = new OpenApiNull(),
["quantity"] = new OpenApiInteger(1)
};
}
@@ -241,7 +246,7 @@ namespace Webshop.Api.SwaggerFilters
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["orderNumber"] = new OpenApiString("WS-2025-0001"),
["orderNumber"] = new OpenApiString($"WS-2025-{uniqueId}"),
["orderDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["status"] = new OpenApiString(OrderStatus.Processing.ToString()),
["totalAmount"] = new OpenApiDouble(123.45),
@@ -255,16 +260,16 @@ namespace Webshop.Api.SwaggerFilters
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["orderNumber"] = new OpenApiString("WS-2025-0002"),
["orderNumber"] = new OpenApiString($"WS-2025-{uniqueId}-Detail"),
["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"),
["shippingAddressId"] = new OpenApiString("EXISTING_ADDRESS_ID"),
["billingAddressId"] = new OpenApiString("EXISTING_ADDRESS_ID"),
["paymentMethodId"] = new OpenApiString("EXISTING_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) }
new OpenApiObject { ["id"] = new OpenApiString(Guid.NewGuid().ToString()), ["productId"] = new OpenApiString("PROD_B_ID"), ["productName"] = new OpenApiString("Produkt B"), ["quantity"] = new OpenApiInteger(1), ["unitPrice"] = new OpenApiDouble(199.99), ["totalPrice"] = new OpenApiDouble(199.99) }
}
};
}
@@ -274,22 +279,22 @@ namespace Webshop.Api.SwaggerFilters
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.NewGuid().ToString()),
["productId"] = new OpenApiString("PRODUCT_ID_HERE"),
["customerId"] = new OpenApiString("CUSTOMER_ID_HERE"),
["productId"] = new OpenApiString("EXISTING_PRODUCT_ID_HERE"),
["customerId"] = new OpenApiString("EXISTING_CUSTOMER_ID_HERE"),
["rating"] = new OpenApiInteger(5),
["title"] = new OpenApiString("Super Produkt!"),
["title"] = new OpenApiString($"Super Produkt! ({uniqueId})"),
["comment"] = new OpenApiString("Ich bin sehr zufrieden mit diesem Produkt."),
["reviewDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o")),
["isApproved"] = new OpenApiBoolean(true)
["isApproved"] = new OpenApiBoolean(false)
};
}
else if (type == typeof(CreateReviewDto))
{
schema.Example = new OpenApiObject
{
["productId"] = new OpenApiString("PRODUCT_ID_HERE"),
["productId"] = new OpenApiString("EXISTING_PRODUCT_ID_HERE"),
["rating"] = new OpenApiInteger(4),
["title"] = new OpenApiString("Gute Qualität"),
["title"] = new OpenApiString($"Gute Qualität ({uniqueId})"),
["comment"] = new OpenApiString("Das Produkt ist gut, aber die Lieferung dauerte etwas.")
};
}
@@ -298,9 +303,9 @@ namespace Webshop.Api.SwaggerFilters
{
schema.Example = new OpenApiObject
{
["key"] = new OpenApiString("ShippingCostFlatRate"),
["value"] = new OpenApiString("5.99"),
["description"] = new OpenApiString("Pauschale Versandkosten für alle Bestellungen"),
["key"] = new OpenApiString($"GlobalTaxRate-{uniqueId}"), // Für POST: Muss eindeutig sein
["value"] = new OpenApiString("0.19"),
["description"] = new OpenApiString("Allgemeiner Mehrwertsteuersatz"),
["lastModifiedDate"] = new OpenApiString(DateTimeOffset.UtcNow.ToString("o"))
};
}
@@ -310,11 +315,11 @@ namespace Webshop.Api.SwaggerFilters
schema.Example = new OpenApiObject
{
["id"] = new OpenApiString(Guid.Empty.ToString()),
["name"] = new OpenApiString("Kreditkarte (Stripe)"),
["description"] = new OpenApiString("Zahlung über Stripe-Gateway."),
["name"] = new OpenApiString($"Kreditkarte (Stripe) {uniqueId}"),
["description"] = new OpenApiString("Online-Zahlungsdienstleister."),
["isActive"] = new OpenApiBoolean(true),
["gatewayType"] = new OpenApiString(PaymentGatewayType.Stripe.ToString()),
["processingFee"] = new OpenApiDouble(0.02)
["processingFee"] = new OpenApiDouble(0.035)
};
}
// --- Versandmethoden ---
@@ -323,12 +328,12 @@ namespace Webshop.Api.SwaggerFilters
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),
["name"] = new OpenApiString($"Expressversand UPS {uniqueId}"),
["description"] = new OpenApiString("Lieferung am nächsten Werktag."),
["cost"] = new OpenApiDouble(12.50),
["isActive"] = new OpenApiBoolean(true),
["minDeliveryDays"] = new OpenApiInteger(2),
["maxDeliveryDays"] = new OpenApiInteger(3)
["minDeliveryDays"] = new OpenApiInteger(1),
["maxDeliveryDays"] = new OpenApiInteger(1)
};
}
}