diff --git a/Webshop.Api/SwaggerFilters/AddExampleSchemaFilter.cs b/Webshop.Api/SwaggerFilters/AddExampleSchemaFilter.cs index 0fa325e..1976652 100644 --- a/Webshop.Api/SwaggerFilters/AddExampleSchemaFilter.cs +++ b/Webshop.Api/SwaggerFilters/AddExampleSchemaFilter.cs @@ -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"), - ["phoneNumber"] = new OpenApiString("+49 151 98765432"), - ["addressId"] = new OpenApiNull(), // Oder new OpenApiString("IHR-ECHTER-ADRESS-GUID-HIER") + ["email"] = new OpenApiString($"kontakt.{uniqueId}@zulieferer.com"), + ["phoneNumber"] = new OpenApiString("+4915198765432"), + ["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) }; } }