diff --git a/Webshop.Api/Program.cs b/Webshop.Api/Program.cs index 1b33985..c5be8cc 100644 --- a/Webshop.Api/Program.cs +++ b/Webshop.Api/Program.cs @@ -198,12 +198,18 @@ builder.Services.AddSwaggerGen(c => } }); + c.SchemaFilter(); c.OperationFilter(); + + // Endpunktspezifische Beispiele c.OperationFilter(); c.OperationFilter(); c.OperationFilter(); c.OperationFilter(); - c.SchemaFilter(); + c.OperationFilter(); + c.OperationFilter(); + c.OperationFilter(); + c.OperationFilter(); }); diff --git a/Webshop.Api/SwaggerFilters/AdminCategoryExampleOperationFilter.cs b/Webshop.Api/SwaggerFilters/AdminCategoryExampleOperationFilter.cs new file mode 100644 index 0000000..dff29c0 --- /dev/null +++ b/Webshop.Api/SwaggerFilters/AdminCategoryExampleOperationFilter.cs @@ -0,0 +1,59 @@ +// src/Webshop.Api/SwaggerFilters/AdminCategoryExampleOperationFilter.cs +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Microsoft.OpenApi.Any; +using System.Net.Mime; +using System.Collections.Generic; + +namespace Webshop.Api.SwaggerFilters +{ + public class AdminCategoryExampleOperationFilter : IOperationFilter + { + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (context.MethodInfo.DeclaringType == typeof(Controllers.Admin.AdminCategoriesController) && + context.MethodInfo.Name == "CreateCategory") + { + if (operation.RequestBody == null || + !operation.RequestBody.Content.TryGetValue(MediaTypeNames.Application.Json, out var mediaType)) + { + return; + } + + if (mediaType.Examples == null) + { + mediaType.Examples = new Dictionary(); + } + mediaType.Examples.Clear(); + + mediaType.Examples["Hauptkategorie"] = new OpenApiExample + { + Summary = "Beispiel: Hauptkategorie", + Value = new OpenApiObject + { + ["name"] = new OpenApiString("Elektronik"), + ["slug"] = new OpenApiString("elektronik"), + ["description"] = new OpenApiString("Alles rund um elektronische Geräte."), + ["parentCategoryId"] = new OpenApiNull(), + ["isActive"] = new OpenApiBoolean(true), + ["displayOrder"] = new OpenApiInteger(1) + } + }; + + mediaType.Examples["Unterkategorie"] = new OpenApiExample + { + Summary = "Beispiel: Unterkategorie", + Value = new OpenApiObject + { + ["name"] = new OpenApiString("Smartphones"), + ["slug"] = new OpenApiString("smartphones"), + ["description"] = new OpenApiString("Mobile Endgeräte."), + ["parentCategoryId"] = new OpenApiString("EXISTING_CATEGORY_ID_HERE"), + ["isActive"] = new OpenApiBoolean(true), + ["displayOrder"] = new OpenApiInteger(1) + } + }; + } + } + } +} \ No newline at end of file diff --git a/Webshop.Api/SwaggerFilters/AdminProductExampleOperationFilter.cs b/Webshop.Api/SwaggerFilters/AdminProductExampleOperationFilter.cs new file mode 100644 index 0000000..c0c37af --- /dev/null +++ b/Webshop.Api/SwaggerFilters/AdminProductExampleOperationFilter.cs @@ -0,0 +1,51 @@ +// src/Webshop.Api/SwaggerFilters/AdminProductExampleOperationFilter.cs +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Microsoft.OpenApi.Any; +using System.Net.Mime; +using System.Collections.Generic; +using System; + +namespace Webshop.Api.SwaggerFilters +{ + public class AdminProductExampleOperationFilter : IOperationFilter + { + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (context.MethodInfo.DeclaringType == typeof(Controllers.Admin.AdminProductsController) && + context.MethodInfo.Name == "CreateAdminProduct") + { + if (operation.RequestBody == null || + !operation.RequestBody.Content.TryGetValue(MediaTypeNames.Application.Json, out var mediaType)) + { + return; + } + + if (mediaType.Examples == null) + { + mediaType.Examples = new Dictionary(); + } + mediaType.Examples.Clear(); + + var uniqueId = Guid.NewGuid().ToString().Substring(0, 8); + + mediaType.Examples["Standard"] = new OpenApiExample + { + Summary = "Beispiel: Standardprodukt", + Value = new OpenApiObject + { + ["name"] = new OpenApiString($"Neues Produkt {uniqueId}"), + ["description"] = new OpenApiString("Detaillierte Beschreibung des neuen Produkts."), + ["sku"] = new OpenApiString($"SKU-{uniqueId}"), + ["price"] = new OpenApiDouble(99.99), + ["isActive"] = new OpenApiBoolean(true), + ["isInStock"] = new OpenApiBoolean(true), + ["stockQuantity"] = new OpenApiInteger(100), + ["slug"] = new OpenApiString($"neues-produkt-{uniqueId}"), + ["categoryIds"] = new OpenApiArray { new OpenApiString("EXISTING_CATEGORY_ID_HERE") } + } + }; + } + } + } +} \ No newline at end of file diff --git a/Webshop.Api/SwaggerFilters/CustomerAddressExampleOperationFilter.cs b/Webshop.Api/SwaggerFilters/CustomerAddressExampleOperationFilter.cs new file mode 100644 index 0000000..91f9480 --- /dev/null +++ b/Webshop.Api/SwaggerFilters/CustomerAddressExampleOperationFilter.cs @@ -0,0 +1,46 @@ +// src/Webshop.Api/SwaggerFilters/CustomerAddressExampleOperationFilter.cs +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Microsoft.OpenApi.Any; +using System.Net.Mime; +using System.Collections.Generic; +using Webshop.Domain.Enums; + +namespace Webshop.Api.SwaggerFilters +{ + public class CustomerAddressExampleOperationFilter : IOperationFilter + { + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (context.MethodInfo.DeclaringType == typeof(Controllers.Customer.AddressesController) && + context.MethodInfo.Name == "CreateAddress") + { + if (operation.RequestBody == null || + !operation.RequestBody.Content.TryGetValue(MediaTypeNames.Application.Json, out var mediaType)) + { + return; + } + + if (mediaType.Examples == null) + { + mediaType.Examples = new Dictionary(); + } + mediaType.Examples.Clear(); + + mediaType.Examples["Lieferadresse"] = new OpenApiExample + { + Summary = "Beispiel: Lieferadresse", + Value = new OpenApiObject + { + ["street"] = new OpenApiString("Musterweg"), + ["houseNumber"] = new OpenApiString("1a"), + ["city"] = new OpenApiString("Musterstadt"), + ["postalCode"] = new OpenApiString("12345"), + ["country"] = new OpenApiString("Deutschland"), + ["type"] = new OpenApiString(AddressType.Shipping.ToString()) + } + }; + } + } + } +} \ No newline at end of file diff --git a/Webshop.Api/SwaggerFilters/CustomerOrderExampleOperationFilter.cs b/Webshop.Api/SwaggerFilters/CustomerOrderExampleOperationFilter.cs new file mode 100644 index 0000000..16b1cb6 --- /dev/null +++ b/Webshop.Api/SwaggerFilters/CustomerOrderExampleOperationFilter.cs @@ -0,0 +1,51 @@ +// src/Webshop.Api/SwaggerFilters/CustomerOrderExampleOperationFilter.cs +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Microsoft.OpenApi.Any; +using System.Net.Mime; +using System.Collections.Generic; + +namespace Webshop.Api.SwaggerFilters +{ + public class CustomerOrderExampleOperationFilter : IOperationFilter + { + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (context.MethodInfo.DeclaringType == typeof(Controllers.Customer.OrdersController) && + context.MethodInfo.Name == "CreateOrder") + { + if (operation.RequestBody == null || + !operation.RequestBody.Content.TryGetValue(MediaTypeNames.Application.Json, out var mediaType)) + { + return; + } + + if (mediaType.Examples == null) + { + mediaType.Examples = new Dictionary(); + } + mediaType.Examples.Clear(); + + mediaType.Examples["Standardbestellung"] = new OpenApiExample + { + Summary = "Beispiel: Standardbestellung", + Value = new OpenApiObject + { + ["shippingAddressId"] = new OpenApiString("EXISTING_ADDRESS_ID_HERE"), + ["billingAddressId"] = new OpenApiString("EXISTING_ADDRESS_ID_HERE"), + ["paymentMethodId"] = new OpenApiString("EXISTING_PAYMENT_METHOD_ID_HERE"), + ["shippingMethodId"] = new OpenApiString("EXISTING_SHIPPING_METHOD_ID_HERE"), + ["items"] = new OpenApiArray + { + new OpenApiObject + { + ["productId"] = new OpenApiString("EXISTING_PRODUCT_ID_HERE"), + ["quantity"] = new OpenApiInteger(1) + } + } + } + }; + } + } + } +} \ No newline at end of file