From e160c212efc667aee0bb1d63530d374887a52b65 Mon Sep 17 00:00:00 2001 From: kjac Date: Tue, 28 May 2024 11:13:04 +0200 Subject: [PATCH 1/5] Advanced Management API: Custom Swagger doc, polymorphism and schema/operation IDs --- 14/umbraco-cms/SUMMARY.md | 3 + .../adding-a-custom-swagger-document.md | 68 +++++++++++ .../images/my-item-api-swagger-ui.png | Bin 0 -> 84797 bytes ...olymorphic-output-in-the-management-api.md | 113 ++++++++++++++++++ .../umbraco-schema-and-operation-ids.md | 98 +++++++++++++++ 5 files changed, 282 insertions(+) create mode 100644 14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md create mode 100644 14/umbraco-cms/tutorials/creating-a-backoffice-api/images/my-item-api-swagger-ui.png create mode 100644 14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md create mode 100644 14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md diff --git a/14/umbraco-cms/SUMMARY.md b/14/umbraco-cms/SUMMARY.md index 592b5d596e0..25f22d452d5 100644 --- a/14/umbraco-cms/SUMMARY.md +++ b/14/umbraco-cms/SUMMARY.md @@ -111,4 +111,7 @@ * [Default Property Editor Schema aliases](tutorials/creating-a-property-editor/default-property-editor-schema-aliases.md) * [Creating a backoffice API](tutorials/creating-a-backoffice-api/README.md) * [Documenting your controllers](tutorials/creating-a-backoffice-api/documenting-your-controllers.md) + * [Adding a custom Swagger document](tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md) + * [Polymorphic output in the Management API](tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md) + * [Umbraco schema and operation IDs](tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md) * [Implementing Custom Error Pages](tutorials/custom-error-page.md) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md new file mode 100644 index 00000000000..7acaa7420a2 --- /dev/null +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md @@ -0,0 +1,68 @@ +--- +description: Adding a custom Swagger document for a custom Management API. +--- + +# Adding a custom Swagger document + +By default, all controllers based on ManagementApiControllerBase will be included in the default Management API Swagger document. + +When building custom Management API controllers, sometimes it's preferable to have a dedicated Swagger document for them. Doing so is a three-step process: + +1. Register the Swagger document with Swagger UI. +2. Instruct Swagger UI to utilize Umbraco authentication for the Swagger document. +3. Move the controllers to the Swagger document. + +The following code exemplifies how to achieve the first two steps; + +{% code title="MyItemApiComposer.cs" %} +```csharp +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Umbraco.Cms.Api.Management.OpenApi; +using Umbraco.Cms.Core.Composing; + +namespace UmbracoDocs.Samples; + +public class MyItemApiComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) + { + builder.Services.ConfigureOptions(); + } +} + +public class MyItemApiSwaggerGenOptions : IConfigureOptions +{ + public void Configure(SwaggerGenOptions options) + { + // register the custom Swagger document "my-item-api" + options.SwaggerDoc( + "my-item-api", + new OpenApiInfo { Title = "My item API", Version = "1.0" } + ); + + // enable Umbraco authentication for the "my-item-api" Swagger document + options.OperationFilter(); + } +} + +public class MyItemApiOperationSecurityFilter : BackOfficeSecurityRequirementsOperationFilterBase +{ + protected override string ApiName => "my-item-api"; +} +``` +{% endcode %} + +With this in place, the last step is to annotate the relevant API controllers with the MapToApi attribute: + +{% code title="MyItemApiController.cs" %} +```csharp +[MapToApi("my-item-api")] +public class MyItemApiController : ManagementApiControllerBase +``` +{% endcode %} + +Now when we visit the Swagger UI, "My item API" has its own Swagger document: + +![My item API in Swagger UI](images/my-item-api-swagger-ui.png) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/images/my-item-api-swagger-ui.png b/14/umbraco-cms/tutorials/creating-a-backoffice-api/images/my-item-api-swagger-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..7926fe84e622f94b94bee44d6b738d9ce822d8a7 GIT binary patch literal 84797 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.Status200OK)] +public IActionResult GetAllItems(int skip = 0, int take = 10) +... +[ProducesResponseType(StatusCodes.Status200OK)] +public IActionResult GetItem(Guid id) +... +``` +{% endcode %} + +## Polymorphism by annotation + +This approach requires that all output models implement a common base class. The base class will define all its derived types by annotation - for example: + +{% code title="MyItemBase.cs" %} +```csharp +[JsonDerivedType(typeof(MyItem), nameof(MyItem))] +[JsonDerivedType(typeof(MyOtherItem), nameof(MyOtherItem))] +public abstract class MyItemBase(string value) +{ + public Guid Id { get; } = Guid.NewGuid(); + + public string Value { get; set; } = value; +} +``` +{% endcode %} + +{% code title="MyItem.cs" %} +```csharp +public class MyItem(string value) : MyItemBase(value) +{ +} + +``` +{% endcode %} + +{% code title="MyOtherItem.cs" %} +```csharp +public class MyOtherItem(string value, int otherValue) : MyItemBase(value) +{ + public int OtherValue { get; } = otherValue; +} + +``` +{% endcode %} + +The `ProducesResponseType` annotation on the endpoints must also be updated to use the base class: + + +{% code title="MyItemApiController.cs" %} +```csharp +... +[ProducesResponseType>(StatusCodes.Status200OK)] +public IActionResult GetAllItems(int skip = 0, int take = 10) +... +[ProducesResponseType(StatusCodes.Status200OK)] +public IActionResult GetItem(Guid id) +... +``` +{% endcode %} diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md new file mode 100644 index 00000000000..eaf818e1b9b --- /dev/null +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md @@ -0,0 +1,98 @@ +--- +description: How to apply the Umbraco schema and operation IDs for custom Management APIs. +--- + +# Umbraco schema and operation IDs + +All core Management APIs have a custom scheme for their generated OpenAPI schema and operation IDs. + +This scheme is strictly opt-in to avoid affecting custom APIs by default. In this article, we'll see how to opt-in to the scheme. + +{% hint style="info" %} +If you are happy with the default schema and operation IDs for your APIs, there is likely nothing gained by using the Umbraco ones. +{% endhint %} + +## Schema IDs + +Schema IDs are handled by `ISchemaIdHandler` implementations. To opt-in to the Umbraco schema IDs, we base our implementation on the core handler: + +{% code title="SampleSchemaIdHandler.cs" %} +```csharp +using Umbraco.Cms.Api.Common.OpenApi; + +namespace UmbracoDocs.Samples; + +// this schema ID handler extends the Umbraco schema IDs +// to all types in the UmbracoDocs.Samples namespace +public class SampleSchemaIdHandler : SchemaIdHandler +{ + public override bool CanHandle(Type type) + => type.Namespace == "UmbracoDocs.Samples"; +} +``` +{% endcode %} + +Then, we implement a composer to register the new schema ID handler: + +{% code title="SampleSchemaIdComposer.cs" %} +```csharp +using Umbraco.Cms.Api.Common.OpenApi; +using Umbraco.Cms.Core.Composing; + +namespace UmbracoDocs.Samples; + +public class SampleSchemaIdComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) + => builder.Services.AddSingleton(); +} +``` +{% endcode %} + +## Operation IDs + +Operation IDs follow the same patter as schema IDs. The only difference is that the `IOperationIdHandler` operates at API level, not at type level. + +Again, to opt-in to the Umbraco operation IDs, we base our implementation on the core handler: + +{% code title="SampleOperationIdHandler.cs" %} +```csharp +using Asp.Versioning; +using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Api.Common.OpenApi; + +namespace UmbracoDocs.Samples; + +// this operation ID handler extends the Umbraco operation IDs +// to all API controllers in the UmbracoDocs.Samples namespace +public class SampleOperationIdHandler : OperationIdHandler +{ + public SampleOperationIdHandler(IOptions apiVersioningOptions) + : base(apiVersioningOptions) + { + } + + protected override bool CanHandle(ApiDescription apiDescription, ControllerActionDescriptor controllerActionDescriptor) + => controllerActionDescriptor.ControllerTypeInfo.Namespace == "UmbracoDocs.Samples"; +} +``` +{% endcode %} + +Then, we implement a composer to register the new operation ID handler: + +{% code title="SampleOperationIdComposer.cs" %} +```csharp +using Umbraco.Cms.Api.Common.OpenApi; +using Umbraco.Cms.Core.Composing; + +namespace UmbracoDocs.Samples; + +public class SampleOperationIdComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) + => builder.Services.AddSingleton(); +} +``` +{% endcode %} From 7ef15a2dae624b2ac7ffa3404c7f694a621d328f Mon Sep 17 00:00:00 2001 From: kjac Date: Tue, 28 May 2024 11:37:42 +0200 Subject: [PATCH 2/5] Make the linter happier --- .../adding-a-custom-swagger-document.md | 2 +- .../polymorphic-output-in-the-management-api.md | 4 ++-- .../umbraco-schema-and-operation-ids.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md index 7acaa7420a2..2cbd04ad292 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/adding-a-custom-swagger-document.md @@ -1,5 +1,5 @@ --- -description: Adding a custom Swagger document for a custom Management API. +description: Adding a custom Swagger document for a custom Management API --- # Adding a custom Swagger document diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md index 9fa6c0cbff9..cc86eebedd0 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md @@ -1,12 +1,12 @@ --- -description: How to support polymorphic outputs from custom Management APIs. +description: How to support polymorphic outputs from custom Management APIs --- # Polymorphic output in the Management API For security reasons, the `System.Text.Json` serializer will not serialize types that are not explicitly referenced at compile time. -This can be quite the challenge with when dealing with polymorphic API outputs. As a workaround, the Management API provides two options for enabling polymorphic outputs. +This can be a challenge with when dealing with polymorphic API outputs. As a workaround, the Management API provides two options for enabling polymorphic outputs. ## Polymorphism by interface diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md index eaf818e1b9b..388ae01e77e 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md @@ -1,5 +1,5 @@ --- -description: How to apply the Umbraco schema and operation IDs for custom Management APIs. +description: How to apply the Umbraco schema and operation IDs for custom Management APIs --- # Umbraco schema and operation IDs From 83c2fd8e0f246570ba37d9764a38d9bd6bc9904b Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 28 May 2024 11:59:28 +0200 Subject: [PATCH 3/5] Update 14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md Co-authored-by: jonat123 <54025331+jonat123@users.noreply.github.com> --- .../polymorphic-output-in-the-management-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md index cc86eebedd0..698ea8151b8 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/polymorphic-output-in-the-management-api.md @@ -6,7 +6,7 @@ description: How to support polymorphic outputs from custom Management APIs For security reasons, the `System.Text.Json` serializer will not serialize types that are not explicitly referenced at compile time. -This can be a challenge with when dealing with polymorphic API outputs. As a workaround, the Management API provides two options for enabling polymorphic outputs. +This can be a challenge when dealing with polymorphic API outputs. As a workaround, the Management API provides two options for enabling polymorphic outputs. ## Polymorphism by interface From 1a59bd046ea78934d6dd4877c7c9c042b4e8ce76 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 28 May 2024 12:11:27 +0200 Subject: [PATCH 4/5] Update 14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md Co-authored-by: jonat123 <54025331+jonat123@users.noreply.github.com> --- .../umbraco-schema-and-operation-ids.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md index 388ae01e77e..014bdd7652d 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md @@ -9,7 +9,7 @@ All core Management APIs have a custom scheme for their generated OpenAPI schema This scheme is strictly opt-in to avoid affecting custom APIs by default. In this article, we'll see how to opt-in to the scheme. {% hint style="info" %} -If you are happy with the default schema and operation IDs for your APIs, there is likely nothing gained by using the Umbraco ones. +If you are happy with your APIs' default schema and operation IDs, nothing is likely gained by using the Umbraco ones. {% endhint %} ## Schema IDs From 2d2c4b74bbe7c6e8695048cdbf415f21ae9dd78c Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 28 May 2024 12:11:36 +0200 Subject: [PATCH 5/5] Update 14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md Co-authored-by: jonat123 <54025331+jonat123@users.noreply.github.com> --- .../umbraco-schema-and-operation-ids.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md index 014bdd7652d..d69941068df 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/umbraco-schema-and-operation-ids.md @@ -51,7 +51,7 @@ public class SampleSchemaIdComposer : IComposer ## Operation IDs -Operation IDs follow the same patter as schema IDs. The only difference is that the `IOperationIdHandler` operates at API level, not at type level. +Operation IDs follow the same pattern as schema IDs. The only difference is that the `IOperationIdHandler` operates at the API level, not at the type level. Again, to opt-in to the Umbraco operation IDs, we base our implementation on the core handler: