From 0e4d02e11a6dfc4e381556a93b2eeb3860f62f2a Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Wed, 22 May 2024 13:52:06 +0200 Subject: [PATCH 01/14] Add initial documentation --- .../documenting-your-controllers.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md new file mode 100644 index 00000000000..d5c761488bd --- /dev/null +++ b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md @@ -0,0 +1,68 @@ +# Documenting your controllers +Documenting your API controllers using Swagger in Umbraco Version 14 simplifies the creation of detailed and interactive API documentation. By adding Swagger attributes, you automatically generate comprehensive information about routes, parameters, and response types, enhancing the developer experience and ensuring clarity and consistency in your API documentation. + + +## ApiExplorerSettings +With the `ApiExplorerSettings` attribute, we can put all of our endpoints into a given group, this is a nice way of organizing our endpoints in the Swagger UI. + +```csharp +## ProducesResponseType Attribute + +Use [ProducesResponseType] to specify the possible responses for each action method. This helps Swagger generate accurate documentation for your API. +For example, in the GetItem method: +```csharp +[HttpGet("{id:guid}")] +[ProducesResponseType(StatusCodes.Status200OK)] +[ProducesResponseType(StatusCodes.Status404NotFound)] +public IActionResult GetItem(Guid id) +{ +// Method implementation +} +``` + +Here, `[ProducesResponseType]` specifies that a 200 OK response will return a MyItem, and a 404 Not Found response will return a ProblemDetails. + +## Example Documentation for Each Controller Method: +TO get a feel for how you'd document each of your controller methods, here are some examples of how you might document each of the operations for a simple API controller, this controller is from the [Creating your own api](./create-your-own-api.md) article: +### GetAllItems +```csharp +[HttpGet] +[ProducesResponseType>(StatusCodes.Status200OK)] +public IActionResult GetAllItems(int skip = 0, int take = 10) +``` +### GetItem + +```csharp +[HttpGet("{id:guid}")] +[ProducesResponseType(StatusCodes.Status200OK)] +[ProducesResponseType(StatusCodes.Status404NotFound)] +public IActionResult GetItem(Guid id) +``` +### CreateItem + +```csharp +[HttpPost] +[ProducesResponseType(StatusCodes.Status201Created)] +[ProducesResponseType(StatusCodes.Status400BadRequest)] +public IActionResult CreateItem(string value) +``` +### UpdateItem + +```csharp +[HttpPut("{id:guid}")] +[ProducesResponseType(StatusCodes.Status200OK)] +[ProducesResponseType(StatusCodes.Status400BadRequest)] +[ProducesResponseType(StatusCodes.Status404NotFound)] +public IActionResult UpdateItem(Guid id, string value) +``` +### DeleteItem + +```csharp +[HttpDelete("{id:guid}")] +[ProducesResponseType(StatusCodes.Status200OK)] +[ProducesResponseType(StatusCodes.Status404NotFound)] +public IActionResult DeleteItem(Guid id) +``` +## Verifying the changes +Run your application and navigate to the Swagger UI (typically found at /swagger). +Verify that your API documentation is correctly displaying the routes, parameters, and response types. From 0911259372c1153b67befd290c3e81052b44a773 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 23 May 2024 14:25:34 +0200 Subject: [PATCH 02/14] Start documentation --- .../document-your-own-api-in-swagger.md | 55 ++++++++++++++++++ .../backoffice/images/DefaultListOfAPi.png | Bin 0 -> 21930 bytes .../backoffice/images/under-default-api.png | Bin 0 -> 21930 bytes 3 files changed, 55 insertions(+) create mode 100644 14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md create mode 100644 14/umbraco-cms/fundamentals/backoffice/images/DefaultListOfAPi.png create mode 100644 14/umbraco-cms/fundamentals/backoffice/images/under-default-api.png diff --git a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md new file mode 100644 index 00000000000..2e93a488149 --- /dev/null +++ b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md @@ -0,0 +1,55 @@ +# Documenting your own API in swagger +When you open swagger, you are met by a list of 3 APIs: +![Default list of apis](images/DefaultListOfAPi.png) +If we implement the api from the [Creating your own API](./create-your-own-api.md) article, it is originally under the `Management API` section. If we want to hove that, we can replace the `ManagementApiBaseController` attribute with a `Controller` attribute. +```csharp +[ApiController] +[VersionedApiBackOfficeRoute("my/item")] +[ApiExplorerSettings(GroupName = "My item API")] +public class MyItemApiController : Controller +``` +When you open swagger, it will show up under the `Default API` section. +![Now it's under default API](images/DefaultListOfAPi.png) +This is great if you only have 1 API, but if you have multiple, you might want to organise these as well as their own separate silos. + +## Adding to the list of APIs +To add to the list of APIs, we need to configure the `SwaggerGenOptions` + +```csharp +public class ConfigureSwaggerGenOptions : IConfigureOptions +{ + public void Configure(SwaggerGenOptions options) + { + options.SwaggerDoc( + "myItem", + new OpenApiInfo + { + Title = "My Item Api", + Version = "Latest", + Description = "This is my awesome API", + }); + } +} + +``` + +```csharp +using Umbraco.Cms.Core.Composing; + +namespace Umbraco.Cms.Web.UI; + +public class MyComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) => builder.Services.ConfigureOptions(); +} + +``` + + +```csharp +[ApiController] +[VersionedApiBackOfficeRoute("my/item")] +[ApiExplorerSettings(GroupName = "My item API")] +[MapToApi("myItem")] +public class MyItemApiController : Controller +``` diff --git a/14/umbraco-cms/fundamentals/backoffice/images/DefaultListOfAPi.png b/14/umbraco-cms/fundamentals/backoffice/images/DefaultListOfAPi.png new file mode 100644 index 0000000000000000000000000000000000000000..0873cebb84d581980770827b96e42e38ca855634 GIT binary patch literal 21930 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 VK8Jw7{eilq4%s>WT4Z}X<~NRAYe)b9 literal 0 HcmV?d00001 diff --git a/14/umbraco-cms/fundamentals/backoffice/images/under-default-api.png b/14/umbraco-cms/fundamentals/backoffice/images/under-default-api.png new file mode 100644 index 0000000000000000000000000000000000000000..0873cebb84d581980770827b96e42e38ca855634 GIT binary patch literal 21930 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 VK8Jw7{eilq4%s>WT4Z}X<~NRAYe)b9 literal 0 HcmV?d00001 From 17fa511f7c86c416f573857ff860993214b6bdd5 Mon Sep 17 00:00:00 2001 From: jonat123 <54025331+jonat123@users.noreply.github.com> Date: Fri, 24 May 2024 10:18:13 +0200 Subject: [PATCH 03/14] Update 14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md --- .../fundamentals/backoffice/documenting-your-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md index d5c761488bd..9915b26132e 100644 --- a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md +++ b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md @@ -1,5 +1,5 @@ # Documenting your controllers -Documenting your API controllers using Swagger in Umbraco Version 14 simplifies the creation of detailed and interactive API documentation. By adding Swagger attributes, you automatically generate comprehensive information about routes, parameters, and response types, enhancing the developer experience and ensuring clarity and consistency in your API documentation. +Documenting your API controllers using Swagger in Umbraco Version 14 simplifies the creation of detailed and interactive API documentation. Adding Swagger attributes automatically generates comprehensive information about routes, parameters, and response types. This will enhance the developer experience and ensure clarity and consistency in your API documentation. ## ApiExplorerSettings From a32dde6b82539441f021f18b04da3ee91067c4ca Mon Sep 17 00:00:00 2001 From: jonat123 <54025331+jonat123@users.noreply.github.com> Date: Fri, 24 May 2024 10:18:18 +0200 Subject: [PATCH 04/14] Update 14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md --- .../fundamentals/backoffice/documenting-your-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md index 9915b26132e..6fae006ae64 100644 --- a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md +++ b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md @@ -22,7 +22,7 @@ public IActionResult GetItem(Guid id) Here, `[ProducesResponseType]` specifies that a 200 OK response will return a MyItem, and a 404 Not Found response will return a ProblemDetails. -## Example Documentation for Each Controller Method: +## Example Documentation for Each Controller Method TO get a feel for how you'd document each of your controller methods, here are some examples of how you might document each of the operations for a simple API controller, this controller is from the [Creating your own api](./create-your-own-api.md) article: ### GetAllItems ```csharp From f901a38b38c6d8e5091556224760bcf13408c205 Mon Sep 17 00:00:00 2001 From: jonat123 <54025331+jonat123@users.noreply.github.com> Date: Fri, 24 May 2024 10:18:32 +0200 Subject: [PATCH 05/14] Update 14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md --- .../fundamentals/backoffice/documenting-your-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md index 6fae006ae64..32d202ac894 100644 --- a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md +++ b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md @@ -3,7 +3,7 @@ Documenting your API controllers using Swagger in Umbraco Version 14 simplifies ## ApiExplorerSettings -With the `ApiExplorerSettings` attribute, we can put all of our endpoints into a given group, this is a nice way of organizing our endpoints in the Swagger UI. +With the `ApiExplorerSettings` attribute, we can put all our endpoints into a given group. This is a nice way of organizing our endpoints in the Swagger UI. ```csharp ## ProducesResponseType Attribute From 389c34374399773de4f727f6d6e10b74eef59d34 Mon Sep 17 00:00:00 2001 From: jonat123 <54025331+jonat123@users.noreply.github.com> Date: Fri, 24 May 2024 10:18:40 +0200 Subject: [PATCH 06/14] Update 14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md --- .../fundamentals/backoffice/documenting-your-controllers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md index 32d202ac894..2b9f851940f 100644 --- a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md +++ b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md @@ -23,7 +23,8 @@ public IActionResult GetItem(Guid id) Here, `[ProducesResponseType]` specifies that a 200 OK response will return a MyItem, and a 404 Not Found response will return a ProblemDetails. ## Example Documentation for Each Controller Method -TO get a feel for how you'd document each of your controller methods, here are some examples of how you might document each of the operations for a simple API controller, this controller is from the [Creating your own api](./create-your-own-api.md) article: +To get an idea of how to document each controller method, below are some examples of how to document each operation for an API controller. +The controller is from the [Creating your own API article](./create-your-own-api.md) ### GetAllItems ```csharp [HttpGet] From dc006578dc8699a3410d838c451b2ce40b8a81a8 Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Fri, 24 May 2024 10:40:46 +0200 Subject: [PATCH 07/14] Add missing example --- .../fundamentals/backoffice/documenting-your-controllers.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md index 2b9f851940f..6ca1019714f 100644 --- a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md +++ b/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md @@ -6,6 +6,9 @@ Documenting your API controllers using Swagger in Umbraco Version 14 simplifies With the `ApiExplorerSettings` attribute, we can put all our endpoints into a given group. This is a nice way of organizing our endpoints in the Swagger UI. ```csharp +[ApiExplorerSettings(GroupName = "My item API")] +public class MyItemApiController : ManagementApiControllerBase +``` ## ProducesResponseType Attribute Use [ProducesResponseType] to specify the possible responses for each action method. This helps Swagger generate accurate documentation for your API. From 3ea572138a709e306c2fc92956a0420201c8778c Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Fri, 24 May 2024 11:21:15 +0200 Subject: [PATCH 08/14] Add some missing text to article --- .../backoffice/document-your-own-api-in-swagger.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md index 2e93a488149..6f79faa69ef 100644 --- a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md +++ b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md @@ -13,7 +13,7 @@ When you open swagger, it will show up under the `Default API` section. This is great if you only have 1 API, but if you have multiple, you might want to organise these as well as their own separate silos. ## Adding to the list of APIs -To add to the list of APIs, we need to configure the `SwaggerGenOptions` +To add to the list of APIs, we need to configure the `SwaggerGenOptions`, we can do this using the `IConfigureOptions` pattern. ```csharp public class ConfigureSwaggerGenOptions : IConfigureOptions @@ -30,9 +30,10 @@ public class ConfigureSwaggerGenOptions : IConfigureOptions }); } } - ``` +We then need to register this with the DI container, we can do this by creating a composer and calling `ConfigureOptions` on the `IUmbracoBuilder`. + ```csharp using Umbraco.Cms.Core.Composing; @@ -45,6 +46,7 @@ public class MyComposer : IComposer ``` +We then need to use the `MapToApi` attribute to map the controller to the API we just created. ```csharp [ApiController] @@ -53,3 +55,5 @@ public class MyComposer : IComposer [MapToApi("myItem")] public class MyItemApiController : Controller ``` + +Now when you open swagger, you will see the new API in the list of APIs. From ccc140e24c97933fbc10ba32356ce12e2590bd7b Mon Sep 17 00:00:00 2001 From: jonat123 <54025331+jonat123@users.noreply.github.com> Date: Mon, 27 May 2024 11:03:46 +0200 Subject: [PATCH 09/14] Update 14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md --- .../fundamentals/backoffice/document-your-own-api-in-swagger.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md index 6f79faa69ef..199d8c6137d 100644 --- a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md +++ b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md @@ -10,7 +10,7 @@ public class MyItemApiController : Controller ``` When you open swagger, it will show up under the `Default API` section. ![Now it's under default API](images/DefaultListOfAPi.png) -This is great if you only have 1 API, but if you have multiple, you might want to organise these as well as their own separate silos. +It's great if you only have 1 API, however, if you have multiple, you might want to organize these as well as their own separate silos. ## Adding to the list of APIs To add to the list of APIs, we need to configure the `SwaggerGenOptions`, we can do this using the `IConfigureOptions` pattern. From 97adacb0fa776f07245c0da45abe172d31adaaf2 Mon Sep 17 00:00:00 2001 From: jonat123 <54025331+jonat123@users.noreply.github.com> Date: Mon, 27 May 2024 11:08:30 +0200 Subject: [PATCH 10/14] Update 14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md --- .../fundamentals/backoffice/document-your-own-api-in-swagger.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md index 199d8c6137d..ce183ca0f70 100644 --- a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md +++ b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md @@ -1,7 +1,7 @@ # Documenting your own API in swagger When you open swagger, you are met by a list of 3 APIs: ![Default list of apis](images/DefaultListOfAPi.png) -If we implement the api from the [Creating your own API](./create-your-own-api.md) article, it is originally under the `Management API` section. If we want to hove that, we can replace the `ManagementApiBaseController` attribute with a `Controller` attribute. +If we implement the API from the [Creating your own API](./create-your-own-api.md) article, it is originally under the `Management API` section. If we want to move that, we can replace the `ManagementApiBaseController` attribute with a `Controller` attribute. ```csharp [ApiController] [VersionedApiBackOfficeRoute("my/item")] From 4b2565c781a96299296e316a23d8f047bc2458f1 Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Mon, 27 May 2024 12:46:08 +0200 Subject: [PATCH 11/14] Delete obsolete files --- .../document-your-own-api-in-swagger.md | 59 ------------------ .../backoffice/images/DefaultListOfAPi.png | Bin 21930 -> 0 bytes .../backoffice/images/under-default-api.png | Bin 21930 -> 0 bytes 3 files changed, 59 deletions(-) delete mode 100644 14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md delete mode 100644 14/umbraco-cms/fundamentals/backoffice/images/DefaultListOfAPi.png delete mode 100644 14/umbraco-cms/fundamentals/backoffice/images/under-default-api.png diff --git a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md b/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md deleted file mode 100644 index ce183ca0f70..00000000000 --- a/14/umbraco-cms/fundamentals/backoffice/document-your-own-api-in-swagger.md +++ /dev/null @@ -1,59 +0,0 @@ -# Documenting your own API in swagger -When you open swagger, you are met by a list of 3 APIs: -![Default list of apis](images/DefaultListOfAPi.png) -If we implement the API from the [Creating your own API](./create-your-own-api.md) article, it is originally under the `Management API` section. If we want to move that, we can replace the `ManagementApiBaseController` attribute with a `Controller` attribute. -```csharp -[ApiController] -[VersionedApiBackOfficeRoute("my/item")] -[ApiExplorerSettings(GroupName = "My item API")] -public class MyItemApiController : Controller -``` -When you open swagger, it will show up under the `Default API` section. -![Now it's under default API](images/DefaultListOfAPi.png) -It's great if you only have 1 API, however, if you have multiple, you might want to organize these as well as their own separate silos. - -## Adding to the list of APIs -To add to the list of APIs, we need to configure the `SwaggerGenOptions`, we can do this using the `IConfigureOptions` pattern. - -```csharp -public class ConfigureSwaggerGenOptions : IConfigureOptions -{ - public void Configure(SwaggerGenOptions options) - { - options.SwaggerDoc( - "myItem", - new OpenApiInfo - { - Title = "My Item Api", - Version = "Latest", - Description = "This is my awesome API", - }); - } -} -``` - -We then need to register this with the DI container, we can do this by creating a composer and calling `ConfigureOptions` on the `IUmbracoBuilder`. - -```csharp -using Umbraco.Cms.Core.Composing; - -namespace Umbraco.Cms.Web.UI; - -public class MyComposer : IComposer -{ - public void Compose(IUmbracoBuilder builder) => builder.Services.ConfigureOptions(); -} - -``` - -We then need to use the `MapToApi` attribute to map the controller to the API we just created. - -```csharp -[ApiController] -[VersionedApiBackOfficeRoute("my/item")] -[ApiExplorerSettings(GroupName = "My item API")] -[MapToApi("myItem")] -public class MyItemApiController : Controller -``` - -Now when you open swagger, you will see the new API in the list of APIs. diff --git a/14/umbraco-cms/fundamentals/backoffice/images/DefaultListOfAPi.png b/14/umbraco-cms/fundamentals/backoffice/images/DefaultListOfAPi.png deleted file mode 100644 index 0873cebb84d581980770827b96e42e38ca855634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21930 zcmdSBcT`j9+ct{BjOZw!V?$6P;|NNZUWAMy77!5WQUYQ?y3%W+gMv~-=`BP=iu8`u zC@3XBg7hA#p$8Hmq@O3w`+L9d{PBHjowL3_&RI(r3EA2E+4pmo>$>iH^XjhQP5$47 zf9K)h;lF+B`aK?=-wb$o_RSvn1^mWjU$7+jvCrq;&1*cRxHHS(&9BZ^4X*O=RKy)( zI{XISAAEev%7=$XppE-~Ux!!0LmnP8=-Z4)fl z^XDW>uKs%c^e+cW+Oxk{^c|{jxqJ2WnFGJy;1V7frh`c;Je}{C^z?(i%Z*A^Jk^k$DIyQ++swZ6#tu?E~ zXV<(n7y^B~cI=p;O+(jZqdNx%_?XmowD!CfDeX=AK5(u!Pc2mi|RG&{Y#_eKbsoW_gX#q6fBpXeGViY0onw~;RfI{E4l zMj9nCMml)fv07^qU$lz4%kuN=7tG4cPreCri$;5&J3`GN;4Fv4I7|AN-TcThtDXKr z3!aFFL;7;lhCwKJ?j@zTDEh~zgBxN;ZbKG!^2})x30*V zTmJp5ee4SpJ&pPp9i1*3gcZu9H{ZuWSH25!raH8nX(Rr{=DX66y?*G63lp-HPj(OH&$(MoYq$&s6@_wgmMAIpW`If>{ZX{ zC`!`mzS+Xw>LVB2R4o~CZVuZBX~wMlu)xsGI%%tAggG}FhXUnLR*K3D73;eaBnVGB z&Pt$s@1^5W{^Kr4HU+ICnBm#597IH^x(yd6Nm;b)%|-_h!l*}Yo_QwH1Q}Wb{DvSwO6z9HnLl$?yD}?Gxh)6COucAV}dk9 zMop*+E{8Sh)OigCq^##VLFS5!A69t+}@4~O)&?+AH)64d{j1YgE z^r#(ka$(z&=<8lc5!Yl{+w?^ryf(xA<+j7@Q(l3<{())A-U%Y`nnf;2~i$s2+EoKk`=VHre=erWx9_fsu6`gUxt8nOra_V$QB)>tL z!h#pLTCD1H;O>|+azP5#RdZpDADOl(h@C<<@G-HzZV8MUF zV1rfHDG%X!`c*n3S3v-qp7O3V!26H_t!!EVIi%9PJ^HZB4 zyjU9C^mWx`U25$nmiJn}c0k`)LrZpAzEQI`BC|LxDERGs(Q@X7LjiHYaPw(Tzg9&Cug=CWz(X>069)Wu^k#i+%7L@>1imuzpi3?kE z%wFtK#K%;n*!qthl50AWpW_&(rJ|Io^S-3?=te}oIR(;op>%%@_ zVRQ7R#ho$lL?R1Au zT2Lw}jpCejdi>1ejkH(;B|fW|tGGzxI@|*D7}^z~h6Krw764&vp?JjxSbwn#q`h|jy2ZrR4?p819-;f&w-Afb;7E*r|bfOd$#tMg{`|~FC< z`nPu5mLHc-^hurFIa}O)gKB`6(46x1Dw}pRw+hS1PHoA4Wa>ZUGNk;$^81yO_1-&` zL;MRb>EjtuUly5`iVNfy3%*TXvLrY{TGHFAjf=uf2!$8jQp) zhVb`Z#nR-j$3fYF>4i&HV<~>JLc>>k4W#{lEkeNt@Rt7%ojpV2i87pw^7e9Af}>`h46b{I*YAbdpSs2$0w z%IQTe10+x+YXk|R+3l3g@}3$=_xFLQVR!t-E~SRe*ucu+h0^R;(A-ld^P zp%SJD)+$VJ0Jz>vUWRA7-`hjCTY6|*V8HeIaVDrkA>=NJd?U0d{Z;gPV6fGay6NBf zTl1XpS+>nI4#>VLEi{ZCj_>KP>(?nm(cU&!y_Sz=HkMrtVKuJ|8XowBH5i2{>uss? zS2V<~Y_8-)l|)^b()o!0>R+=yqFK;0Wd2c5!Z2TV=r@*-H?C~T6fZ>q1vC?4=DAE{ z9abiGMDEU6@DA4fF;bGO_G9Ah z$PD+yZ}fX@s^qFg-no_5FXpD$MGc5$!u-eJP{tU( z5LSf*FlZ`xwFJ8NMey3^*I(Ee4g;g}6p0Vfz)aV%>8p_`d1se#{Ijc%OST-Pv5r4S!@WJ zP_rgHD@d=5mbY7fKW&>Cz3!^Na@Kb-J?G3uF~q z)K%)aoR*bmEvTTyG_eV^H}+D8Xo!32fhw0TpMi5B>rAFa9?)*@B(kSYkC9e9D)6s| zuvzeKRwV%s4fS6S*m>Zk37I+%<(v8v0-%l!h`U=;Pj*KD)<`hYJ{`Ziy}Zm3_y?d$ zS@xYU+D;&FC6KI#64}5PmA;Y`hy)+JmgdfU<68ZBZlJW`f&NH&{Ys6SEZG^rb%xFD=h22=HGZdNm9* zQXbni=0dzfZjm74KKZV2Jb9)$;CGq0tVWj_1;mjbENi9?fW1r_g^LvR<(ie6u6&^p z(U5EGXt@?4C<1aO@W(STT|Q70LW&R8j=L6FS|PUB0A30^kuV%~xPZn*b|AYchyoH{ zZJMHU`~I7vK@T5oa%*SYFbq^qE~*nZ$~u#>9|>aI4*Uk>Jt>t>Yn9!GSGK;c*AcX3 zSwm%r6Xuwu_tCRzcn~0c?3d?XABYZKWX2(xa{wN8bHlzppO@$9R*tB@TUA*50HV@U zOyyF%C;UbGuAbI=zkrYdkMJD*pWgiV>*|yYh+h@dujb? zk&0n+z?d^S3

Qr~yh38Qd(F9VtrxCWkO)on;(6CjNZz?6n;b?h`yZf)v%l=G>3uipJh zDPsOY1pMt%R8l(*(361Hb|1(>DrWn5<_z?T%yj>Xb*XuOle}JJU{N=Fv4&Wv}h5u60lv z^qHkCcg2l3mNnYDRm+AX!{#!6kR;jv{B}qdAaNzw=!0k(J75j~86Wq5xGlEHjRTjf zV(i`N=@1fXao4Co5{+J_xBhSU6?A(!DrTdo@4EvM)eM*1`z-a>T`S z$}YcFd(`!xvY$36yYLaDQxBr%gnKoXD5)R97?<AC@y9=h47F+VefF)-7v-3d&mk*RKvI+hc|MPC4juA;X|aMV>7173 zu|)Y|JHIL3R?Gd6(5tl(8gkQ4ig!)fEZ_!SJx~fbE&K()y zY(_#q&?aw)c=&$TJ@tYPe1}v|%yO6o7)Za{+uEaMCwga^ih-OX4LlOFuv6gw(A1U;hy?9L8ZenUFi_O6eV_oQwqF4YU`LY;BcP z1voZBbH?+*Wu)A-1RL*OTV?QH4vDR{R1!#5q&)bHb+J#an-C1Gc?Tp7W>^q*9KJ$E4 zywSs)QToGB{HMpf@Lf4A7$HXF%U}-#n>dG_>)yP)P7MlyA~ny!f|pQ`y}k}N%rib7 z9^S;#MyVF>ej)-&sdTMHf^>k!%IsUxxuXAkKv(0*d>SW!YWK6i+Jww@hF0|~JWmEx`8%v=OqhAO4wo0_rJE*DWpXkWqR~fa(WvW*>^)_%*eAzbF zOPYY5(e@Q2umAwdM8mef2eqwr?*bL$HJ8ES5UbXND999ay?OwfYs{Q!Ca^XF9O!tU znmB7y(&QTf9_+~da#Nf9wm3SVd9~dpQ((3qpg%Y$^>@s8cvhQyzuRubL8g9ea>iFz z8j;P9w%!NQS^%upt$$Jf8_$WYo+J1_W_*w0MWRp2HLa9J3udt8M34`|eZ4>4l6ZI7 zYtI|u*~~w^Qz2K3nYcvK+DwnlpJqIBM5jKU?KgNG^q_U{G(>H4B{o27x!HQ7k{uk* z>2C%u4+)rjBI4EbBpt>p;!*t_!(PQiyaG8pbXgx3mBc^cg<*j-ne5~(hK6o_=A8gZ z8o+u{GUvBbHb+*GJ4G-cSX^lN?MNm-J$z?<@1~{#fF_{%0qu~g8Q__DAS-b8)h5Xy z^6V}kstR}9LGg|C+9QA>+*%8YbHl4+674@L2eT1qFgD&@7b^DiJOu{XL)XWJGIa=Q z9wT8m=41+fY_S_U?nEBbrOgayuRTeAe^D?0tD;WO`vVfOk5@*iJ$N8wMoO?9uM~YS zxg&;p+TP@Vqn)28u-6IN+u4FIUbb+_;uu$>GeOe_0V5Lmhw7B!u?uSYPBe`9pn%f} zc1eyymIHYdVMBjq6gr#kR(jAw8&o1Bts5r5FK&>2Ja`Y#D3QFjsE)G%Hl6E0#A0xk z(QKDCe$~VJI$^#GNfvep+Jb}56P1Ug0YlC8rJOkS7#?v_9GeNbwgEFMTaoYQ$L%A+0p|kb0B3d4SqBc0d}!F_ z7rsbcF(MauiOm492neV~X$rZa-rB#1;nEZ(icjPLC0og*AHvz|0LUt$_gf~H1aajc z;9eb|{*<$JCnD3|P#{R=7FSa%EGoq|bej3F0lcN<%7tB0Vh}hCWaJp&JsQ43uC4M9 z!n@@#OaLT)*Gdc^&54_r+&7z^;p4GP$#q+g3X~Bo?dA~KRVQ?fBXXacV7aBfV?bYH zYOPOBH-4Zm=~#;IxUg;xRsmX5)3si{Y9f!cBAxPX?uZ*ma@ zS3Jh6-%!8@q{u6f5&i)&B3JPf7yz-c1tiX+=}A{ulnbO-BSr z9AmqEx#E4wW4(jw80SGFiJZ&sq4UfmYjK(zpLRxINFY6`gJ^}amW==}|1Kuu1;S2@ z82J)tmq@MZNtb+7%T}z{bEgH$ZnpMcG$fmd6wrE(030nvi#n;Ojpnpao4o)yqYu}$ zfbBJ~ybL=}$)Yw9LHXs+*4l=+?Glh21C_CdfT4{6pwWuSPPkhSc+b~~y=-yqNX`qn zP_Y<^J7@ey9U#mfd~Mes4;tV6_Ugy;V}@#!9>sivjFT8sx$1*e-=7~mc5M*4-KXQ& z4dk6a53Aid10>WL!dd^(nIag=wdGeHdsMP)^`Wglu2|aQU|V|=esax$cd86>r0ZF^ zO$!534JUVOHv$*d>tHm$oJzabLEF7R9jELPOeK+&Sqd#r0~;&wP6s$kGuK&IQ-m&B zj^uuZ{p{CQXy&}c+;-n{9uCmtqvy^xK_+@v6L<>k7T4auToNre3LBRdgVaCHZUa2E9r~6YV`*?&@`!9f9W{cj# z;XRjAREH?e%RVUIv)}e?ue70We`Jgp1!R?awUfPfN(&&vSk?QGxXiMPj>X`%IC~I| z4h}Q}-X_Ub9NL=I6uO5i`*lYzdBZ9#cjNf7CP`pBg;Jzk^GC#6a%ip*eq9QiDg`8f z9E1jGzW{~3@~6vDS=_zOf2C#df>*0Kc6D3!|SqD57z zL~$E!IbyaCPGR3b4r>!r0v3z#^EYWFJFcH`c{!?R2%W{;;6Fi<^VO;&T=H&tUmW`< zXxM#zbSq`_g)){#li9X3X+*=44L@&ODZ<>quUmNiAm$F-z*!_-HlGjW;Su6r{-d#c zzd96CW4E}emyD|n$Sfr?k1tnY6DgW9Ma?@XN>w`9g=vWmlmmMpB*pCk#zgqOvK4a2 zm3_Rqai#jE?sVz?wJX!kS$4+tv9Mj*;(FXkXsbnO5>)Q)tEDN(nFG0jd{_VP*OX5M zhK*8qsnFuXUIkte!4x)A~ z97>8P6{Qe!A@kk_s5E?{fj_o7Ah2@#t7=2iuoh++lI5oM+lynyYG+?0+*4D2am-Z1 zEcOC-?T+c-!q}x#>Y(*?BkF(g8vEG?@rYMm`lpF5d27ql|9#b#2;|%Pfl}vbl#}<^wuGMD>E_C- z-7M64F^2C(40mtO!)<$jo{m^Zx{zXIYcL4;mI>LfxUlV$f9CN{ys7b6aQxXJ-{Seu zcEz8|#cE_x!Z*^>o%%)9XI{SGABwXc8LmpY$ycrq zxEo(S`!y5kS17&V6j@W5F#$I?={9$NNcA^tsfIP)>-$JU;fmo7YW|FGR)So=9|eJ6 z*}l>n#Rb1!J;}20pP7voD2OX(pkDNuX~&EoSO~ojgfb8X3VQ0$7ems2omy6Md&9SA zY31@Je=@X0p(CPQcXEAxLT}zPZ>zdm({SXT@1Rv~_W zNgbpv)w+X%FT#KelMsB_Ra1R=nFVWz??xWh@L)L!*VY+HDXC_7Y=A-B!LR+K=`VrY zM)v1hr}Hw=x&yvw_0u*uQnB^dAHnDF<6qxtEW+M|e9fc=cE%<9C zkl1u*Cu#bcgo|-7?A*i{y`eckO!Hhen$GjjhCzP78Ei>F0_8ORU*|ZVM3LH8BOD+# zuprso79{hRg`$W0loT(u-aI?2Ioy5qqj)uG5-+!nrBy8SbmyOJlT`?{b+q34&bm7` zROzE8%bW)QBK_7|?SOJZy zlCv|5c(SvcIVdWMlK-x7^#Kmbn!J>BQREMAyMg{ppp_MPeV{tw%8F(G`=FdRl&YHx zMi`CfG-hp3=bN$j4>Vq?b5=~Po)7)`=9KbsX^6R`*YAn8ezjT9JiFCG$<^_M?4El;NP(@UowgzDbWrWGrPY=2K1cb5 zla2oB1cH1y{m@^;s@i|;cHn;aC1?$LfV&>05M5dZwr(>+K@(vOP01 ze^ueraLRBN9{+7J*id_{7w);n}Y$PA8?o1o1DI{-Z@_l!* z>>V6lIbo#}?w;c?r63x)+uZQGNB6e%dad*OjhMpP@3ZF~vI1_zx8LRG)GU+x;7O<) z;b2_dgpa(|&7_ihqOmJNmCLpR=Xol&L;CDTzhy#0cHOyGjj+OJa=<`=g%4L#GzWF{ zva;~MA^UyheucrE4`X#p-_DJne>>a=RuCO?HsaJjVZ$w*GrBnZaMVP)M($FHbM=OL zVequ9z_on*`-jbDH?2{!g0?Egu!^9E^j;cjCh3C5`vwfZw|35-ppF1}!WAb-JoEGV zS3kwPHpXZYp^UXE{S;YSKp^gVBQD%F_i=$Y*yOf&zEv!88)|h1@m;)IZ!V_vasn%k zm78DnH9LF9xnbNx!We9?M~?0TJl*T{hcXYpVXPG8ReDzV@>@!y%DBtGYTt!s0pY`q zsT4@)<`=*U9?Z19m{NyEFwdb1+y4NoczRjJ?sfo?c|yuOQJvEzfwr;5;T0cV&~UP< zeu)~gxt}JR;Gtstusc-4>#nVoAR2YX&SSEt9hEx1Tqx##!)NGOe!Q6`d ziaI956s{N7@gZTfNJl21slZ)jY5T5L49yq+#nk$Sm4PF*dn%D)HPLzr-X3!rjuXrm z{%MSxP4NOLgELr78@samHIg>YkwxooC@FFe~ z-48`1flmq>uSo@f1F>MzgGqNTSinPpSaGn_$DJ zQ&iBo>&;O0+M4|ajx@ZU{fwLSbdHyO5K+g_kFxfX7~bs9W?9t%ijZI+FU|l$2D(ov z(pHu3W0hdEBO)P=`wcfqyW1)1Q0)eYH-ff=U`lFphc9Ll6~F)pmp%cL8foneRsq@$ z;vf=S>MA$66~7IMc|7A z24SF4(nE_rDU+`1HO=KzA-ij!?dS!3BVfvJk7yfzN{)xk8w0(3091wJ;4m!slA3L3R=c7eE(QojkNvcfZ06%MQ3a&@ zsds`~(nk$XT~+gXUUjql(f9XnHqi+BvJe?9*W!XX`aj+8v%uSD%gWnw{qY45*$zM- z#{j7nw?RdIhR6Jd$dlqPR_G|Q- z>!2W(Z?C%=@92(uZSTE8)wDTWeKf6MR7IJBCoJ*ggR+9V{I3^NW$b@Tn6! zj^nVTL#GxlZ{8H!L7@N&cW-r&CK4t5@ z@!>1#L@C2 zaRW{~PaTqEOMSNf(R?{Vh^>Y+9gx4Zy#4kNF+pKIf570vJm2zHCGjrW;fzi6XOicq zozVp3{2ww^l(qCfcb+k}d+~jf%e&K18 zu!Rx({Q^qUcXI+`1>_%t^G7=;`9^i+ni$EV;@c(F(K8i~woIJSRCMf`7JXroB6t7O z(nqB{S$*^A5H##v6uNTHwxyjYYa9<=kt%)rw4Zd3Zvuxsse8&{B5n z8w9hEB;VRf&euGuB{z`L@td4M*~o}R=v*??*Q}+I+*ko0os=po)yv@Hi7;!JEWI@{ z*Zj4}|EcG)(szB0deaZb`cfr`iibnk;^RXVkx~{9*4`WOay5J1-Uq>P>qXVc$I7W9X(jnn zOyq9oif$U~UcvqPA6w&Vyg$r52|{w+6!{jP$H0pAcEQSqke7kt6Mn z{X02NhGR^pl&BHMWY5r5E1*wi5DVfD#(*wiQB_wImgYYmMxI~$Wb5DNDAliF7G0)M z-oFHIh0m=&=Y=FxxooUkoV3jt4t``+_u1h=vsX+&H~&Tpo`Nl z7npi!)g&7A@T>%W|HGLRHw{+C`@W)f8{Iu!d_=Vd)zikGvgM# zzdD32NDmK66W{PB`}O9izRN^z;ALGOt`%>;rBDu|`F4b+D1X747164l6r_9KZ8q(G zk|zU$<_sJ{pxRR!e{A%2|CkD_)=qNWBi#uQ?Ub`#tfME~kcf@^kdYjI_w}8<{MeFp}|{8|fZ%BQkm!c-kQ^Z8!3U%kmo^b_~V8*!{iqO+p{Z z_$;&A*KFN|x^ID*kjJWiTT#_d@L?ob(|a=s2RYgB)1+=q=8!1?i4)Axo9kw64s+@b zPlI|t^l7^4NpVa%{x@H(Uyi7t_JfIDdGZY@Vx)r0xJR=nKP0L?Wo>FXh#HQhJS?`W zag_tIbEiHV6RxqB;?nU^)k5P;-wz|!3|{24rW9)mAGf1L zB3hvFapVw2MO|w*g>$@N1xk!G&fQu-gidGzo8WyIL2%XpBPa}?za1^Yh?QG$)BYce z0n@^&B>S@a^$#{OR}qQOk9L=eI9F&qy=rCs9&;zR$L0IgkwfeG$y#ele)PE4E54rw zj7N4TX)oEZyb+6%RL#}O^VA~frMp^Lyu!@wXv9S4sMRuxQdGCfz|p<|`Q;Dm_Rasc z%_19b`aTdtXgd`iW^%r#qkrxr+th0Lin|6s7$LTwkG+GF>uo0g80Xz32m_Q}=BSSR zrkrFCU5GfL@1@q1Ips1^b}CMBTmD^&%Ys(^npN$=g+XgFh5dQ9F!Vm)$I8UuTkV)J5b68t57pbp$GY7 zQ@8jJ7rx-%aG0tjR%RVNMKDLO-F#+<8C(t0Sn-p{FQ%(va9S zR1!IZ;-g!RKNd1~GOSGXw|H_(SZIBNT{3(iSXm4BEHY^5$A>JrTAI=9Ti^nt=)#jcFq0#GcW9zi^5gIzKdG zcN^3b9-$L}sEW)qrN2p;QmXMD39Cye3qGgq*1VQYFhz=DR*&tmu5TQ9=A~9o{^kwS z+KKpf30D?O&QfeKv#Jn&6z+hheHTV(V|J?m@&0ZdG%#q$`ijDnSdRiZawfZeuc~A< z$wlz+rZY$r;@ltMLd<_&=)cyYb;NdR(J#a}%)HOIC|72uYl>>`a(!O@V{n1ub z4Mj5!jM_K2D|sW(SH$`%VSL9Y&XnV2V&2SN>6p#-YB3`!E zE>L%Bfa;`h`^jjL`?aV(m(qG=`^bVAS;l^U{|QMI{?LWUhqAk(FCwl zHl_MB*IVjNl87S;594fX4^1>`ap|%t0UFPYhj_g2DCql?yZlb-rJbXkj+DEuD1J7K~#d#)O zwSC>!e{1MrjZO3Ty+hMQ-86kKC?|tA@R)-;kx7r67yJNHcMudI@71x*6`grv6oKD4 zqs(F_8Fp5`&cDUdikvc4>#LNc68tsymQ3B%uONV)?gq`m%(V~+Fou6EqLm3YhQ(OFd4)KF8MJ@5 zu!^}P=w%4xNFK|Mn8!HS<<;UTjb35ZOcFGQ3@3+U->~MHxjWB>5Mt0z&QH}bWW@D; zVj1uLHZ(YM2J~hBo>&-{LD-*Fyax(Flmw(9k0wT2^up{g7&O-D&GXx_qyn!iHh1x~ zojVhI#UT{_=%YAp)Dl2e_}Gv?jz6X%-2Lwz0MUe3G9hnjn1iof_a~bPN=Mg+4)v>B zoUJF|65=#=V)RQhwnqEgEqbZcNiep^NxM1fG|Agq@+8FO z3!m9Qi{579WS9tS9J-ka~^?iKZ4jmi;E(l3Jd8>eW6`YiA=!#ioVcxH$9 zG|T0Q$+|P85pxZb(w=YtWhC_`sP|jq};_Ntc2&M`N2z!^=6;9 zcm^y?Sshxny}Nvq)JVW>weNi>+t6BAD{}g3G-p9VMBbX*N&M0pBAXSwIbS`S6+#MO z)?4&o33&wwV*qi5r<>hY#F&sRCirKPRxFC={dI@#DEd=_Xz zB&Fvk8>)xQI9J_se{xRws?hw8*Jl3nt8GF8;iB!EhiIK}U3}TO!98 z&WCY_Nb*%~bYlG<7a(WA%2^^=nNUjni_57=$HI@rTgGTT`SW3Y&07jXIMf`5rzNEu z?#h~zY!hBv!be*BuSV=1?V^Q4+RG0yP7oGu)4OO6)v=i7mJ>h&={Shx_0I5bgJir4xzLcb)mHf8j>`Ns!|d!t7R-bpINI7YB9f% z|1CXnxRT$jv1E~1MNyg#>V8-6ITjQq=j4p?ZGBjPdFUczA22fCaQ>08$*;I~K3?iE zSMJR7RgF?Z3u1LF*6dXlL%&}@Ju!E!WVbEOz9&CUQvP-~dK$a+P}ypZUSuMmMuNiX zMpG&y$)8Uur$~P+H7i?=`D??St?(lE+tw@F+!XuoV=2egG3+zf)jQp9eOpa(qF5*j zD6{xKG+(q^Xlg6JSpAXYPSsAGisQqQ;pQsFx0_HO5{DA4N|)w8Iy*0R754OB%3ctY_p&OEztE23 zxmNcP{zheFEIO(@SZ^-KOUn(bmJa{^!F*usZKyp>{#rO)+nlQLT0+FZJ+mZ9MflW^ zYkw*lmDZkM=H#gFF>7D>3MXKG3Vt>($D&l^{$ftB%JZJ8Dzhl<5YbKC8+z%b{bN>A z0_P6&R^~bwU-__Ln3S`!efRL%PFj^?v;QA^ne0JWN%DU-y#Dduv&gs07 z_32lr-rSm~kzDt&onMk7-&cx(yG4|Y`7p#{=f`q-B)(nOyIZdpaqxTHP4k2N*y;qM z51s>2X{j$Y>I)?C*S^X0C05?Mqo-f>_P7rJy^P{I_iqm}lM>AiDAW3J8@?mHzAE=G zx;1%$N;ksVWaz%ve0%J92o(t3RP_Y-dOsS`d{XPh0nobPCTIES{982JPni?>VC zC6JYWuSAebl=k;&eW*_IHm!J`YsL9i+b>pfrn!2D{4O_MhCf!5kx>#ahxJ!2 zm~&Z0W$8rHZir}Ry!NpS?y6Fhd)1*1yR6uwDRM$tm$(eaI<3mx&E=5exKR$vNul^$ z8a@8~;wg<+>iHUP{j9An@1HszAa$)fapT@x;#MVnv{LByilWKE#cY*4W_H;Ac_O zSST2Pdy0s)$Hgh@Vt=o{0I$7qL~_7FA|lsQQ$*6+IQb>{oT;>An^A3&G#oC|=09-5 zq}x47TFHqY>!+C^MSfU+$~MYS1Dh^?v{8m{tV+DZ&i%c=((H|@S9H68UD;T9Ytu1; z>A+}o=${0epd(RXq&55drUE&Pp@YiNdGp{g%Gi9HzCf1;g5UN*ZW%c1jE!n|w2sbR zuec~WF?%t$S!&``o0Oo-*rzMUhlVJp{#;#l5GrLpVN;`6yH1|;c*hgG^ZubxOnTUxcO+%Y|G zkeo=axhEejRy%!L+dA~JoyyZUiTCdOUinsu??{em3wWSp|4{QS%~Vs3+mgx)ZyNZ< zM#|f6^$Tg_U|T$8tkZWUWBkWfwk(G*`zprO(62K-6$VON*f74>s{-fQ5Wexmp3*Zm z7QEH(dv?5Q#rMwv*8lcr_Ua9dN=*ez`KaQhi^FQ$RNhEYd8(-EZZrI91v?7vOP2UlN8UpaME zW2Mw3R(WDfdOC$v4n96CrH)qauRm{#lzxAIK)9{4>Pb@aS&*LX*MzdULNrhDZ`?BX zzkRItfAhre|A~)^Z{yH@!-kE9R~*gL51q6N*)%jMyT3Org5f2* zw?oYu;O^#nguw`pG+vEV?7A(?P)Ghc{o5x_%#9E3E705i$)z(_-CS@G?A9{7yT^xZ zrPzOG4cg+$HB6s^4vuDZPs8no*0I+wG6|T9Gz!Bu?A`q&ispV~XfO+|;)5VQ=0fMc zyTOwl&d=(l#7o490a+-+S5jWc;nOAqIfL-b?v=T=AtLI;!2LB^RG)`Aq0_6Pa@<)x zqUzcKQt>?%SrJnwH*#WNdytDzQdrl$uwrS_ehVk5N>Q>dP2gl?0e+}WJSsdH^W?Fe zM?t;eoSv+V=9Sf$Qb#+{s5?h}`4BydT7q60g*Bs-V}$qkPdm?=9;V%Z>n&@=8TC=_ z{zW^WQ&nu>>{7wVeP5?nRcZ^&BE)^px5_uM^6ss>x~VbWWp$T=7p3E^RjgFH#S1IS zlea3dSE8H;D&ReiVYSi>>5e{X|4MmVzmrYOTe*#E+9<)w_=8oGLYkx?DCWC@q3WM- zn`VyFe1NE~?5_ z+shJ>WULvFeO%VoZWh$dR*1*y+iW1>cOV%_Eb1tja((*b(Ia)}uh|M$;Z{XylajZk zyH5JK_DiBZoH7l6WMwtqTwHmq`Ch|n6?{Ypi^WL>F-vcLje1{ab5z_d39h~NIz6nq zM^bb7^5L?Wl$|ry>*Wnem2IJN=`swp#f7cqpg@a|9tN^Yqw#EJtn%6RnEF!| z1TE|E&Cuc_=MLN3LVvBQ9~t*wmP@2meKj*OxZITVtVGktzbyV9EUh@I#|l>Ge7xsR zE6e8L%5=lV_Pgf(9u4vz&QTA3b@)nD2b`@2_3L>|ME2Uf)+g70+C-tkg21ocq zj71){xS{5fm&eCSZ^2A=uPj=@!*U!1AB zvdb!MW8Tf|JUs0$2EJlS-vpj1OVubf+wkf?{cu_V`l$CTiIF-YaP7O9$Ik1;)HdH~ zqZ<68{_ttLs!F;CP3!gFb9awND#7a1YaiGzWT_-+ZU2`G^{HdBihsZS7$<$r{=zG> zhgMQrr>0&Zr_vM+h%!}W{&I70n#`82_+gE(Jil)3BF827i-Oe^PlnHxSTD;LisSG9 z(lh64hdm?2Sk@4Scdun^M(3i28WUVE|8V*tJ=~i&(1231HebXD^j%p*nc+UEtQpsi z@In`Buvv0eW*X%ck?umgfn6FM<@eI+)>Mfj0=mvAV9=_vruAu2$bA#5BDYf@Fx#`U z!vqNhtBQ6C=0RQH7sLD2(Qjui0G@3rG9P*)A_Y`8dk-Orf2j%2|2a)Yj5@0pO`bM1iE!0+#_(VM3qy{%>Ec>L+(4Y9z*|0 zabJdj$0Ll;48{@iz!f*^m-Ku*BP`IiKQ#I$B|pCb#$KV!xB63E5Y1M%Cwu2pUW{Dm zt$WGE5Av1Z8K9Ck63`IRm`hfLSks>~elCO@#?KRX{(hTWGh&xO=}6y$qiKrCdvM3wr9lRwiJMq^WS z4j$vsKjR};R}XXVk|*Lpst>zWU&kUlvr69Va9@9itWfLyE+6C-HFsZJrjq7;Hn?5+ zMYLSQj+a;DW6m%}u1URTdWSh#9oYN4^rz$Q_XzZ1^ZHc2K_@-S-QZiadA#m3_BF7F zc1oJ=BSdK{%6eTT*z!rO$L`ZSPOUNGn#E7Z6s}UNj>M^pdEpzjGp)o{VD!HW*G$-X zpTQm0%-^JNjZFI_&NXJL$kPZFPQrPv>$bknkUIesm-&UkmZ5ofc2_-u+>v z3nwmyvZt>~SFt}S4d;sNr7T9vhQ0HFV*1tOp5&nN4`W3m!ZV@2{%cy{_Dn)O6o!1$ z;*1kan4(hVB$IZx_B|8ArPx|)iyvXgK~66rJfUF*e-FQ_OlqogtrDZHij;+tzIO{E z=lhXC=NKE!q$|EpQUw+!1Z|Il6{dn&{31Kngow)vv4gfh<-o(^n+r^B1sae|stmN> zN``ya9$m{&hfWQVg7eRLKG}g>Tp~>2@rO`lwLN>Q%<9%R&qe>ss-s|J<}+W=d&8q) zo$46#(}}A<;+@Njc1J59b3e!kjM?JxB>|(2lRM0&|M`2Lyb*dMvGL9%<7PA@U(=z* zABwc>q`6(=I)#uGn8KX%psbwVN=kRCH5v%2C4oG8FL(qzK0MDH72koFO&bVh^~e#+ z4sxU1{vp2+4xbPt5lDRS0iP2RMX;Ji6erN4fyYLLO;O~g@UY1Lad~gHeb;}l1-#MP?eACUp_+&ym(%{IyD-2({&7q0 z)h1U+`KJXLrmg&6)m(iz(|a3N&pD+$NQaQ*5Kg5bd5cDL^kR{hW=y8XtlG3`-sXLU zc%qfc2*VOqwpq$cjHEI}miMN-7tJlD1B+VA@QzQ5n^ z-o4NFd*8qN{@i!tv@qRTE-704A@=sD)A>K32c~5%t1I62E045>7awa>e4v!~ABMB= zZ%U;(%M0-#{k*ntevFf2H8)3gUvet+!E=d18g`~ghLa>&sSoMZQ#`dfYculuEopJL z#KWFsSSd@^ziRe`v@pRc@>#6jhWIX>jESu_?*j&w=>A#F!32bMmHwy_PGMQkPe5IjC!qB63gJw*qGJ`bQb^TW$)vm}z%E%v z?J4Oi)1ZaRKYOMnOnOS`FPp?4w@XU2{V)>#0ob;jmEP+3A;NW*X{LWSz_zT|?-{ZC z(+vgcGGGTfTNYYx55DP;|C$)}|34G+^`Xqmn!}6As7UNotCCFW4zlk=+kg5;CAP+_ zx1G3}uV?$(p@kF)d{Oy@J>;qB5${kTC_V|7m|mo2+^coL$~#b2MK_n60+!z9>pjY5 zJO*c^AnR97f{R_GHYdbiol)N5G2tkAHDxQVoQ$b!bp3r;BYh#LHv$Zw%32p88C(8O zZh?aJZwth7BF@aW>oW#E9Yz|7Y7M8JJ1`i9EPV%AoBW(wUBNoWXKTJE0*<-wNWHMld z&U-wKMFm#qXf&59<*nw+u*zhbO5|n(xgBE&g?8`S3wkX)QT(9Zqe!#CH{62*rKL%j z>Mj|Jm+TM?ggtb47nQ&4rv%5)yb%r)!5;3Q=|KuzFP-ZY;)3@|gFGYjGECm@teWfy zppLthS%_*Q3*K!rT{}I{F~%?h!Xfv89n2LE{f+)IhqT#`t$)@2i)bD;80nG!fO z4KD8dh5RbI2_3d1P1YI&BC_=Uw1)p8jE~N06iNUN>JnS~!IgWH;vTB`_^*8^Xa=wa zIL#)%843cAm7?3(zLqUE`|&mL)YjeN^UB`HJE39Sfuva=!zs$TfPL**HK9Tog9o&g zAI*(ZXc}=Kjy;--&P5upu_h>R>#eNJ;=z8bKGo`Esl(=?I*f2@)3ud zE(y=s&T`mtLrbE$4-459eI6`Dlpv}ySqxF#$M39Ej;}60lxna z?Nezpu8l|eT=ETCO}NA^HE;C0KErIeMcqwisRZ#gC{Hc;k0PxlNTHi_nvaltP#jtg zLDvlV`Nj(#CYuHF7#DqSJD~VnYk0`?OA#^mooNTd<<(e`{LhmNM2eTl+`C46@vhDI z{_y+<6}MoR%lzvd>c29%PMc=l|FmEiC5n#T_)zs;p@ENxoj#8i&nmc?Zrm_yVSWhj zeDY(*K4o5W!aTEWMp}N}KoenYMO_i3fdbZsh;s;7YL9irC1SS^F^!B(Tai0v5B9Y9 z3vdC{dU|u!R-C#a2BD9jtfxVC$;krDRib0O5gCKf|BgUMKgt zn;>4;Y_F4$hO1|Dlp>aPeiFX-bqkDJ5W?P76I5pfIY9&dP@ukx%6=&`jh2;Rd+pnr znmv6PS~b)PW}%pevDJHfjA&pn;I_6LbL#Neuov}4@%n9O|2o4&-)`wj(F?f{n(#e^ zSiqy63pTzCSM^5okMyNZDm*E25tI;d%f98n!Qdn}z>rCIY4Y#9Yk;8WWUHyj_2;kWe}D zW#4GjV8rmE{VR5RUP}lS$Df?qe1PNS-b5S=*0!u9-7!~$mUXL=$>cRrOXEs+vlmdH z-J~Ib6~^c6foG>Frn&`=aS0}r2v&ENV?=%vD$EGae8*OaEDpa}KL6n%&qMW44jT3k znS4a&xTBy$ebidpEKLqnxTwXCi3aCiae28DE9Pos)a#Pq0F5n*9&ol5*-T66Hh2w7m$j&A}fN$)ks`*xSPHRQ{ROeca+dKmj1 zk5Kua6vAVTc6Gt7%oV;|o7FyzGfXDB<)Yaq3|Hrgz4TY&OBHMHS2V^x6GG)3CHTgW zVbvj3)7wFM=~Jjl;|ky&&o4*-UhGrs2kj38yEORCdLtw)H^}|Y0CaU!xs@8p79A#E zp{lUpUQWvXkXOsX?3(XP?VQFLoh5Fl#J#sE;gFyK)MLG4b2F9+TK>s6E@?N#loAM1 z)2=-PbiHMmd5V>sql;%d^h-Ynb~_|4;vyu-vb!ekl*wub$(szX2DC(M={%C{oAuTJ z2yxs5RC+0p*8qSqHAi+``T_$-?iAv(YjbwRH+wjLKSBMqrt&YW=>PT<1T>NnuQo_d VK8Jw7{eilq4%s>WT4Z}X<~NRAYe)b9 diff --git a/14/umbraco-cms/fundamentals/backoffice/images/under-default-api.png b/14/umbraco-cms/fundamentals/backoffice/images/under-default-api.png deleted file mode 100644 index 0873cebb84d581980770827b96e42e38ca855634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21930 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 VK8Jw7{eilq4%s>WT4Z}X<~NRAYe)b9 From 7c3c7d2324aef159bf7c4b3f805c15b9d9ffd3f5 Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Mon, 27 May 2024 12:46:16 +0200 Subject: [PATCH 12/14] Move to correct folder --- .../creating-a-backoffice-api}/documenting-your-controllers.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 14/umbraco-cms/{fundamentals/backoffice => tutorials/creating-a-backoffice-api}/documenting-your-controllers.md (100%) diff --git a/14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/documenting-your-controllers.md similarity index 100% rename from 14/umbraco-cms/fundamentals/backoffice/documenting-your-controllers.md rename to 14/umbraco-cms/tutorials/creating-a-backoffice-api/documenting-your-controllers.md From c042bf2c36a1838b9a5a2b5809d43fce887d5450 Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Mon, 27 May 2024 13:00:06 +0200 Subject: [PATCH 13/14] Add {%code} tags --- .../documenting-your-controllers.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/14/umbraco-cms/tutorials/creating-a-backoffice-api/documenting-your-controllers.md b/14/umbraco-cms/tutorials/creating-a-backoffice-api/documenting-your-controllers.md index 6ca1019714f..9df6f3f8962 100644 --- a/14/umbraco-cms/tutorials/creating-a-backoffice-api/documenting-your-controllers.md +++ b/14/umbraco-cms/tutorials/creating-a-backoffice-api/documenting-your-controllers.md @@ -5,14 +5,17 @@ Documenting your API controllers using Swagger in Umbraco Version 14 simplifies ## ApiExplorerSettings With the `ApiExplorerSettings` attribute, we can put all our endpoints into a given group. This is a nice way of organizing our endpoints in the Swagger UI. +{% code title="MyItemApiController.cs" %} ```csharp [ApiExplorerSettings(GroupName = "My item API")] public class MyItemApiController : ManagementApiControllerBase ``` +{% endcode %} ## ProducesResponseType Attribute Use [ProducesResponseType] to specify the possible responses for each action method. This helps Swagger generate accurate documentation for your API. For example, in the GetItem method: +{% code title="MyItemApiController.cs" %} ```csharp [HttpGet("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] @@ -22,6 +25,7 @@ public IActionResult GetItem(Guid id) // Method implementation } ``` +{% endcode %} Here, `[ProducesResponseType]` specifies that a 200 OK response will return a MyItem, and a 404 Not Found response will return a ProblemDetails. @@ -29,29 +33,36 @@ Here, `[ProducesResponseType]` specifies that a 200 OK response will return a My To get an idea of how to document each controller method, below are some examples of how to document each operation for an API controller. The controller is from the [Creating your own API article](./create-your-own-api.md) ### GetAllItems +{% code title="MyItemApiController.cs" %} ```csharp [HttpGet] [ProducesResponseType>(StatusCodes.Status200OK)] public IActionResult GetAllItems(int skip = 0, int take = 10) ``` +{% endcode %} ### GetItem +{% code title="MyItemApiController.cs" %} ```csharp [HttpGet("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public IActionResult GetItem(Guid id) ``` +{% endcode %} ### CreateItem +{% code title="MyItemApiController.cs" %} ```csharp [HttpPost] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public IActionResult CreateItem(string value) ``` +{% endcode %} ### UpdateItem +{% code title="MyItemApiController.cs" %} ```csharp [HttpPut("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] @@ -59,14 +70,17 @@ public IActionResult CreateItem(string value) [ProducesResponseType(StatusCodes.Status404NotFound)] public IActionResult UpdateItem(Guid id, string value) ``` +{% endcode %} ### DeleteItem +{% code title="MyItemApiController.cs" %} ```csharp [HttpDelete("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public IActionResult DeleteItem(Guid id) ``` +{% endcode %} ## Verifying the changes Run your application and navigate to the Swagger UI (typically found at /swagger). Verify that your API documentation is correctly displaying the routes, parameters, and response types. From 1db7ff268f0e6a671febb243aa367f1336a061d7 Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Mon, 27 May 2024 13:01:08 +0200 Subject: [PATCH 14/14] Add to summary.MD --- 14/umbraco-cms/SUMMARY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/14/umbraco-cms/SUMMARY.md b/14/umbraco-cms/SUMMARY.md index eb7235fd388..4bd79ed0dfb 100644 --- a/14/umbraco-cms/SUMMARY.md +++ b/14/umbraco-cms/SUMMARY.md @@ -109,4 +109,5 @@ * [Custom value conversion for rendering](tutorials/creating-a-property-editor/custom-value-conversion-for-rendering.md) * [Adding server-side validation](tutorials/creating-a-property-editor/adding-server-side-validation.md) * [Creating a backoffice API](tutorials/creating-a-backoffice-api/README.md) + * [Documenting your controllers](tutorials/creating-a-backoffice-api/documenting-your-controllers.md) * [Implementing Custom Error Pages](tutorials/custom-error-page.md)