From 1c68e3d8251de8c1c8a518f5efd420bcfee097f4 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 4 Feb 2025 06:36:38 +0100 Subject: [PATCH] Added deliveries workspace view to the webhook details workspace (#18175) * Added deliveries workspace view to the webhook details workspace. * Front-end linting fixes. * rename to unique * update filter value * make delivery feature folder * move delivery workspace view for delivery feature folder * correct details workspace view label and pathname to match name * remove unused alias * use singular form to align naming * remove pagination as the default collection kind already includes this * show icon * remove double registration * add observables for webhook data, add get methods + add jsdocs * align UX with languages * remove hardcoded fake name + make url the link * remove redundant url in table * render status code as tag * use tags for enabled/disabled webhook state to align with users * make the name more explicit * move webhook root to a feature folder * export consts * fix webhook collection pagination * move menu item manifests into root folder * move webhook delivery filering responsibility from repo to workspace view * reorganize * move workspace * fix import * move entity actions * export delivery consts * dot not export const * rename folder * update name * make event feature folder * export consts * move repository files * more clean up * split types * add deprecation warning for a temp method * bring back url to deliveries table --------- Co-authored-by: Mads Rasmussen --- .../Webhook/AllWebhookController.cs | 2 +- .../Webhook/Logs/AllWebhookLogController.cs | 11 +- .../Webhook/Logs/WebhookLogController.cs | 33 ++++ .../Webhook/Logs/WebhookLogControllerBase.cs | 21 ++- src/Umbraco.Cms.Api.Management/OpenApi.json | 165 ++++++++++++++++-- .../Repositories/IWebhookLogRepository.cs | 13 +- .../Services/IWebhookLogService.cs | 14 +- .../Services/WebhookLogService.cs | 9 +- .../Implement/WebhookLogRepository.cs | 9 +- .../src/assets/lang/en.ts | 5 +- .../src/external/backend-api/src/sdk.gen.ts | 30 +++- .../src/external/backend-api/src/types.gen.ts | 31 +++- .../core/collection/collection.element.ts | 28 ++- .../date-table-column-view.element.ts | 20 +++ .../core/collection/components/index.ts | 1 + .../src/packages/core/collection/index.ts | 1 + .../collection-workspace-view.element.ts | 21 ++- .../packages/webhook/components/constants.ts | 1 - .../src/packages/webhook/constants.ts | 8 +- .../src/packages/webhook/entity.ts | 3 + .../src/packages/webhook/index.ts | 5 +- .../src/packages/webhook/manifests.ts | 25 +-- .../src/packages/webhook/repository/index.ts | 3 - .../src/packages/webhook/types.ts | 20 +-- .../webhook-delivery/collection/constants.ts | 3 + .../webhook-delivery/collection/index.ts | 2 + .../webhook-delivery/collection/manifests.ts | 20 +++ .../collection/repository/constants.ts | 1 + .../collection/repository/index.ts | 1 + .../collection/repository/manifests.ts | 10 ++ .../collection/repository/types.ts | 8 + .../webhook-delivery-collection.repository.ts | 25 +++ ...-delivery-collection.server.data-source.ts | 62 +++++++ .../webhook-delivery/collection/types.ts | 5 + .../collection/views/manifests.ts | 21 +++ ...table-status-code-column-layout.element.ts | 42 +++++ ...-delivery-table-collection-view.element.ts | 114 ++++++++++++ .../webhook/webhook-delivery/constants.ts | 1 + .../webhook/webhook-delivery/manifests.ts | 4 + .../webhook/webhook-delivery/types.ts | 11 ++ .../workspace-view/manifests.ts | 25 +++ ...ivery-collection-workspace-view.element.ts | 28 +++ .../webhook/webhook-event/constants.ts | 2 + .../packages/webhook/webhook-event/index.ts | 1 + .../input-webhook-events.element.ts | 4 +- .../webhook/webhook-event/manifests.ts | 4 + .../webhook/webhook-event/modal/constants.ts | 1 + .../webhook/webhook-event/modal/manifests.ts | 8 + .../modal}/webhook-events-modal.element.ts | 4 +- .../modal}/webhook-events-modal.token.ts | 2 +- .../repository}/constants.ts | 0 .../repository}/index.ts | 0 .../repository}/manifests.ts | 0 .../repository}/webhook-event.repository.ts | 0 .../webhook-event.server.data-source.ts | 0 .../repository}/webhook-event.store.ts | 2 +- .../packages/webhook/webhook-event/types.ts | 5 + .../webhook/webhook-root/constants.ts | 1 + .../webhook/webhook-root/manifests.ts | 4 + .../{ => webhook-root}/menu-item/manifests.ts | 2 +- .../workspace}/constants.ts | 0 .../workspace}/manifests.ts | 2 +- .../collection/action/manifests.ts | 0 .../{ => webhook}/collection/constants.ts | 0 .../webhook/{ => webhook}/collection/index.ts | 0 .../{ => webhook}/collection/manifests.ts | 0 .../collection/repository/constants.ts | 0 .../collection/repository/index.ts | 0 .../collection/repository/manifests.ts | 0 .../collection/repository/types.ts | 0 .../webhook-collection.repository.ts | 0 .../webhook-collection.server.data-source.ts | 4 +- .../webhook/{ => webhook}/collection/types.ts | 2 +- .../collection/views/constants.ts | 0 .../collection/views/manifests.ts | 0 ...ebhook-table-name-column-layout.element.ts | 0 ...ebhook-table-name-column-layout.element.ts | 0 .../webhook-table-collection-view.element.ts | 41 ++--- .../src/packages/webhook/webhook/constants.ts | 3 + .../{ => webhook}/entity-actions/manifests.ts | 2 +- .../src/packages/webhook/webhook/index.ts | 2 + .../src/packages/webhook/webhook/manifests.ts | 11 ++ .../{ => webhook}/repository/constants.ts | 1 - .../repository/detail/constants.ts | 0 .../{ => webhook}/repository/detail/index.ts | 0 .../repository/detail/manifests.ts | 0 .../detail/webhook-detail.repository.ts | 14 +- .../webhook-detail.server.data-source.ts | 4 +- .../repository/detail/webhook-detail.store.ts | 2 +- .../webhook/webhook/repository/index.ts | 2 + .../repository/item/constants.ts | 0 .../{ => webhook}/repository/item/index.ts | 0 .../repository/item/manifests.ts | 0 .../{ => webhook}/repository/item/types.ts | 0 .../item/webhook-item.repository.ts | 0 .../item/webhook-item.server.data-source.ts | 0 .../repository/item/webhook-item.store.ts | 0 .../{ => webhook}/repository/manifests.ts | 3 +- .../src/packages/webhook/webhook/types.ts | 14 ++ .../workspace}/constants.ts | 0 .../workspace}/manifests.ts | 4 +- .../webhook-details-workspace-view.element.ts | 18 +- .../webhook-workspace-editor.element.ts | 43 +++++ .../webhook-workspace.context-token.ts | 0 .../workspace/webhook-workspace.context.ts | 150 ++++++++++++++++ .../packages/webhook/workspace/constants.ts | 2 - .../packages/webhook/workspace/manifests.ts | 4 - .../webhook-workspace-editor.element.ts | 22 --- .../webhook/webhook-workspace.context.ts | 72 -------- .../utils/all-umb-consts/index.ts | 2 +- .../Services/WebhookLogServiceTests.cs | 35 ++-- 111 files changed, 1107 insertions(+), 254 deletions(-) create mode 100644 src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogController.cs create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/collection/components/date-table-column-view/date-table-column-view.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/components/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/column-layouts/status-code/webhook-delivery-table-status-code-column-layout.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/webhook-delivery-table-collection-view.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/webhook-delivery-collection-workspace-view.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/index.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{components => webhook-event}/input-webhook-events.element.ts (94%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{components/webhook-events-modal => webhook-event/modal}/webhook-events-modal.element.ts (94%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{components/webhook-events-modal => webhook-event/modal}/webhook-events-modal.token.ts (86%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{repository/event => webhook-event/repository}/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{repository/event => webhook-event/repository}/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{repository/event => webhook-event/repository}/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{repository/event => webhook-event/repository}/webhook-event.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{repository/event => webhook-event/repository}/webhook-event.server.data-source.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{repository/event => webhook-event/repository}/webhook-event.store.ts (94%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook-root}/menu-item/manifests.ts (89%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{workspace/webhook-root => webhook-root/workspace}/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{workspace/webhook-root => webhook-root/workspace}/manifests.ts (92%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/action/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/repository/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/repository/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/repository/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/repository/types.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/repository/webhook-collection.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/repository/webhook-collection.server.data-source.ts (93%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/types.ts (97%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/views/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/views/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/views/table/column-layouts/content-type/webhook-table-name-column-layout.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/views/table/column-layouts/name/webhook-table-name-column-layout.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/collection/views/table/webhook-table-collection-view.element.ts (81%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/constants.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/entity-actions/manifests.ts (89%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/constants.ts (66%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/detail/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/detail/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/detail/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/detail/webhook-detail.repository.ts (64%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/detail/webhook-detail.server.data-source.ts (97%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/detail/webhook-detail.store.ts (93%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/index.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/types.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/webhook-item.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/webhook-item.server.data-source.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/item/webhook-item.store.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{ => webhook}/repository/manifests.ts (63%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/types.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{workspace/webhook => webhook/workspace}/constants.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{workspace/webhook => webhook/workspace}/manifests.ts (96%) rename src/Umbraco.Web.UI.Client/src/packages/webhook/{workspace/webhook => webhook/workspace}/views/webhook-details-workspace-view.element.ts (90%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace-editor.element.ts rename src/Umbraco.Web.UI.Client/src/packages/webhook/{workspace/webhook => webhook/workspace}/webhook-workspace.context-token.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace.context.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/manifests.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace-editor.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/AllWebhookController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/AllWebhookController.cs index c5429ab814..db11f532f1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/AllWebhookController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/AllWebhookController.cs @@ -34,7 +34,7 @@ public class AllWebhookController : WebhookControllerBase var viewModel = new PagedViewModel { Total = result.Total, - Items = webhooks.Select(x => _webhookPresentationFactory.CreateResponseModel(x)), + Items = webhooks.Select(_webhookPresentationFactory.CreateResponseModel), }; return Ok(viewModel); diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/AllWebhookLogController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/AllWebhookLogController.cs index a40b9d4e6a..d9ab9e9963 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/AllWebhookLogController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/AllWebhookLogController.cs @@ -1,8 +1,8 @@ -using Asp.Versioning; +using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.ViewModels.Webhook; using Umbraco.Cms.Api.Management.ViewModels.Webhook.Logs; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; @@ -23,12 +23,11 @@ public class AllWebhookLogController : WebhookLogControllerBase [HttpGet("logs")] [MapToApiVersion("1.0")] - [ProducesResponseType(typeof(WebhookResponseModel), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] public async Task Logs(CancellationToken cancellationToken, int skip = 0, int take = 100) { PagedModel logs = await _webhookLogService.Get(skip, take); - IEnumerable logResponseModels = logs.Items.Select(x => _webhookPresentationFactory.CreateResponseModel(x)); - return Ok(logResponseModels); + PagedViewModel viewModel = CreatePagedWebhookLogResponseModel(logs, _webhookPresentationFactory); + return Ok(viewModel); } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogController.cs new file mode 100644 index 0000000000..9d353b7979 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogController.cs @@ -0,0 +1,33 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Common.ViewModels.Pagination; +using Umbraco.Cms.Api.Management.Factories; +using Umbraco.Cms.Api.Management.ViewModels.Webhook.Logs; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services; + +namespace Umbraco.Cms.Api.Management.Controllers.Webhook.Logs; + +[ApiVersion("1.0")] +public class WebhookLogController : WebhookLogControllerBase +{ + private readonly IWebhookLogService _webhookLogService; + private readonly IWebhookPresentationFactory _webhookPresentationFactory; + + public WebhookLogController(IWebhookLogService webhookLogService, IWebhookPresentationFactory webhookPresentationFactory) + { + _webhookLogService = webhookLogService; + _webhookPresentationFactory = webhookPresentationFactory; + } + + [HttpGet("{id:guid}/logs")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] + public async Task Logs(CancellationToken cancellationToken, Guid id, int skip = 0, int take = 100) + { + PagedModel logs = await _webhookLogService.Get(id, skip, take); + PagedViewModel viewModel = CreatePagedWebhookLogResponseModel(logs, _webhookPresentationFactory); + return Ok(viewModel); + } +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogControllerBase.cs index 84888184ab..6581335165 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/WebhookLogControllerBase.cs @@ -1,9 +1,26 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Common.ViewModels.Pagination; +using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Routing; +using Umbraco.Cms.Api.Management.ViewModels.Webhook.Logs; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Api.Management.Controllers.Webhook.Logs; [VersionedApiBackOfficeRoute($"{Constants.UdiEntityType.Webhook}")] [ApiExplorerSettings(GroupName = "Webhook")] -public class WebhookLogControllerBase : ManagementApiControllerBase; +public class WebhookLogControllerBase : ManagementApiControllerBase +{ + protected PagedViewModel CreatePagedWebhookLogResponseModel(PagedModel logs, IWebhookPresentationFactory webhookPresentationFactory) + { + WebhookLogResponseModel[] logResponseModels = logs.Items.Select(webhookPresentationFactory.CreateResponseModel).ToArray(); + + return new PagedViewModel + { + Total = logs.Total, + Items = logResponseModels, + }; + } + +} diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index af29c9fd8d..964d4dd594 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -33846,6 +33846,67 @@ ] } }, + "/umbraco/management/api/v1/webhook/{id}/logs": { + "get": { + "tags": [ + "Webhook" + ], + "operationId": "GetWebhookByIdLogs", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "skip", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "take", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/PagedWebhookLogResponseModel" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + } + }, + "security": [ + { + "Backoffice User": [ ] + } + ] + } + }, "/umbraco/management/api/v1/webhook/events": { "get": { "tags": [ @@ -33935,21 +33996,7 @@ "schema": { "oneOf": [ { - "$ref": "#/components/schemas/WebhookResponseModel" - } - ] - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/ProblemDetails" + "$ref": "#/components/schemas/PagedWebhookLogResponseModel" } ] } @@ -42320,6 +42367,30 @@ }, "additionalProperties": false }, + "PagedWebhookLogResponseModel": { + "required": [ + "items", + "total" + ], + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookLogResponseModel" + } + ] + } + } + }, + "additionalProperties": false + }, "PagedWebhookResponseModel": { "required": [ "items", @@ -46190,6 +46261,70 @@ }, "additionalProperties": false }, + "WebhookLogResponseModel": { + "required": [ + "date", + "eventAlias", + "exceptionOccured", + "isSuccessStatusCode", + "key", + "requestBody", + "requestHeaders", + "responseBody", + "responseHeaders", + "retryCount", + "statusCode", + "url", + "webhookKey" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "format": "uuid" + }, + "webhookKey": { + "type": "string", + "format": "uuid" + }, + "statusCode": { + "type": "string" + }, + "isSuccessStatusCode": { + "type": "boolean" + }, + "date": { + "type": "string", + "format": "date-time" + }, + "eventAlias": { + "type": "string" + }, + "url": { + "type": "string" + }, + "retryCount": { + "type": "integer", + "format": "int32" + }, + "requestHeaders": { + "type": "string" + }, + "requestBody": { + "type": "string" + }, + "responseHeaders": { + "type": "string" + }, + "responseBody": { + "type": "string" + }, + "exceptionOccured": { + "type": "boolean" + } + }, + "additionalProperties": false + }, "WebhookResponseModel": { "required": [ "contentTypeKeys", diff --git a/src/Umbraco.Core/Persistence/Repositories/IWebhookLogRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IWebhookLogRepository.cs index c719df2b50..cbb012bf04 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IWebhookLogRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IWebhookLogRepository.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Core.Persistence.Repositories; @@ -8,6 +8,17 @@ public interface IWebhookLogRepository Task> GetPagedAsync(int skip, int take); + // TODO (V16): Remove the default implementation on this method. + async Task> GetPagedAsync(Guid webhookKey, int skip, int take) + { + // This is very inefficient as the filter/skip/take is in-memory, but it will return the correct data. + // As it's only here to avoid a breaking change on the interface that is unlikely to have a custom + // implementation, this seems reasonable. + PagedModel allLogs = await GetPagedAsync(0, int.MaxValue); + var logsForId = allLogs.Items.Where(x => x.WebhookKey == webhookKey).ToList(); + return new PagedModel(logsForId.Count, logsForId.Skip(skip).Take(take)); + } + Task> GetOlderThanDate(DateTime date); Task DeleteByIds(int[] ids); diff --git a/src/Umbraco.Core/Services/IWebhookLogService.cs b/src/Umbraco.Core/Services/IWebhookLogService.cs index 12b53bfa76..ee404e38e4 100644 --- a/src/Umbraco.Core/Services/IWebhookLogService.cs +++ b/src/Umbraco.Core/Services/IWebhookLogService.cs @@ -1,5 +1,4 @@ -using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Webhooks; +using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Core.Services; @@ -8,4 +7,15 @@ public interface IWebhookLogService Task CreateAsync(WebhookLog webhookLog); Task> Get(int skip = 0, int take = int.MaxValue); + + // TODO (V16): Remove the default implementation on this method. + async Task> Get(Guid webhookKey, int skip = 0, int take = int.MaxValue) + { + // This is very inefficient as the filter/skip/take is in-memory, but it will return the correct data. + // As it's only here to avoid a breaking change on the interface that is unlikely to have a custom + // implementation, this seems reasonable. + PagedModel allLogs = await Get(0, int.MaxValue); + var logsForId = allLogs.Items.Where(x => x.WebhookKey == webhookKey).ToList(); + return new PagedModel(logsForId.Count, logsForId.Skip(skip).Take(take)); + } } diff --git a/src/Umbraco.Core/Services/WebhookLogService.cs b/src/Umbraco.Core/Services/WebhookLogService.cs index 3b0bbebf19..4257b775d4 100644 --- a/src/Umbraco.Core/Services/WebhookLogService.cs +++ b/src/Umbraco.Core/Services/WebhookLogService.cs @@ -1,7 +1,6 @@ -using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Scoping; -using Umbraco.Cms.Core.Webhooks; namespace Umbraco.Cms.Core.Services; @@ -30,4 +29,10 @@ public class WebhookLogService : IWebhookLogService using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true); return await _webhookLogRepository.GetPagedAsync(skip, take); } + + public async Task> Get(Guid webhookKey, int skip = 0, int take = int.MaxValue) + { + using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true); + return await _webhookLogRepository.GetPagedAsync(webhookKey, skip, take); + } } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/WebhookLogRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/WebhookLogRepository.cs index af6c561d90..334407d018 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/WebhookLogRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/WebhookLogRepository.cs @@ -1,4 +1,4 @@ -using NPoco; +using NPoco; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; @@ -37,10 +37,17 @@ public class WebhookLogRepository : IWebhookLogRepository } public async Task> GetPagedAsync(int skip, int take) + => await GetPagedAsyncInternal(null, skip, take); + + public async Task> GetPagedAsync(Guid webhookKey, int skip, int take) + => await GetPagedAsyncInternal(webhookKey, skip, take); + + private async Task> GetPagedAsyncInternal(Guid? webhookKey, int skip, int take) { Sql sql = Database.SqlContext.Sql() .Select() .From() + .Where(x => !webhookKey.HasValue || x.WebhookKey == webhookKey) .OrderByDescending(x => x.Date); PaginationHelper.ConvertSkipTakeToPaging(skip, take, out var pageNumber, out var pageSize); diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index ccf2cfb681..83b6219a6f 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -392,6 +392,7 @@ export default { contentType: { copyFailed: 'Failed to copy content type', moveFailed: 'Failed to move content type', + contentTypes: 'Content Types', }, mediaType: { copyFailed: 'Failed to copy media type', @@ -1765,10 +1766,11 @@ export default { noHeaders: 'No webhook headers have been added', noEventsFound: 'No events were found.', enabled: 'Enabled', + disabled: 'Disabled', events: 'Events', event: 'Event', url: 'URL', - types: 'Types', + types: 'Content Types', webhookKey: 'Webhook key', retryCount: 'Retry count', urlDescription: 'The URL to call when the webhook is triggered.', @@ -1780,6 +1782,7 @@ export default { headers: 'Headers', selectEventFirst: 'Please select an event first.', selectEvents: 'Select events', + statusCode: 'Status code', }, languages: { addLanguage: 'Add language', diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts index 773300fc9d..9026fd4055 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts @@ -3,7 +3,7 @@ import type { CancelablePromise } from './core/CancelablePromise'; import { OpenAPI } from './core/OpenAPI'; import { request as __request } from './core/request'; -import type { GetCultureData, GetCultureResponse, PostDataTypeData, PostDataTypeResponse, GetDataTypeByIdData, GetDataTypeByIdResponse, DeleteDataTypeByIdData, DeleteDataTypeByIdResponse, PutDataTypeByIdData, PutDataTypeByIdResponse, PostDataTypeByIdCopyData, PostDataTypeByIdCopyResponse, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedResponse, PutDataTypeByIdMoveData, PutDataTypeByIdMoveResponse, GetDataTypeByIdReferencesData, GetDataTypeByIdReferencesResponse, GetDataTypeConfigurationResponse, PostDataTypeFolderData, PostDataTypeFolderResponse, GetDataTypeFolderByIdData, GetDataTypeFolderByIdResponse, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdResponse, PutDataTypeFolderByIdData, PutDataTypeFolderByIdResponse, GetFilterDataTypeData, GetFilterDataTypeResponse, GetItemDataTypeData, GetItemDataTypeResponse, GetItemDataTypeSearchData, GetItemDataTypeSearchResponse, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsResponse, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenResponse, GetTreeDataTypeRootData, GetTreeDataTypeRootResponse, GetDictionaryData, GetDictionaryResponse, PostDictionaryData, PostDictionaryResponse, GetDictionaryByIdData, GetDictionaryByIdResponse, DeleteDictionaryByIdData, DeleteDictionaryByIdResponse, PutDictionaryByIdData, PutDictionaryByIdResponse, GetDictionaryByIdExportData, GetDictionaryByIdExportResponse, PutDictionaryByIdMoveData, PutDictionaryByIdMoveResponse, PostDictionaryImportData, PostDictionaryImportResponse, GetItemDictionaryData, GetItemDictionaryResponse, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsResponse, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenResponse, GetTreeDictionaryRootData, GetTreeDictionaryRootResponse, GetCollectionDocumentByIdData, GetCollectionDocumentByIdResponse, PostDocumentData, PostDocumentResponse, GetDocumentByIdData, GetDocumentByIdResponse, DeleteDocumentByIdData, DeleteDocumentByIdResponse, PutDocumentByIdData, PutDocumentByIdResponse, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogResponse, PostDocumentByIdCopyData, PostDocumentByIdCopyResponse, GetDocumentByIdDomainsData, GetDocumentByIdDomainsResponse, PutDocumentByIdDomainsData, PutDocumentByIdDomainsResponse, PutDocumentByIdMoveData, PutDocumentByIdMoveResponse, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinResponse, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsResponse, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsResponse, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessResponse, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessResponse, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessResponse, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessResponse, PutDocumentByIdPublishData, PutDocumentByIdPublishResponse, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsResponse, GetDocumentByIdPublishedData, GetDocumentByIdPublishedResponse, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByResponse, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsResponse, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishResponse, PutDocumentByIdValidateData, PutDocumentByIdValidateResponse, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Response, GetDocumentAreReferencedData, GetDocumentAreReferencedResponse, GetDocumentConfigurationResponse, PutDocumentSortData, PutDocumentSortResponse, GetDocumentUrlsData, GetDocumentUrlsResponse, PostDocumentValidateData, PostDocumentValidateResponse, GetItemDocumentData, GetItemDocumentResponse, GetItemDocumentSearchData, GetItemDocumentSearchResponse, DeleteRecycleBinDocumentResponse, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdResponse, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentResponse, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreResponse, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenResponse, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootResponse, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsResponse, GetTreeDocumentChildrenData, GetTreeDocumentChildrenResponse, GetTreeDocumentRootData, GetTreeDocumentRootResponse, PostDocumentBlueprintData, PostDocumentBlueprintResponse, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdResponse, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveResponse, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderResponse, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdResponse, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdResponse, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdResponse, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentResponse, GetItemDocumentBlueprintData, GetItemDocumentBlueprintResponse, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsResponse, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenResponse, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootResponse, PostDocumentTypeData, PostDocumentTypeResponse, GetDocumentTypeByIdData, GetDocumentTypeByIdResponse, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdResponse, PutDocumentTypeByIdData, PutDocumentTypeByIdResponse, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenResponse, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintResponse, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesResponse, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyResponse, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportResponse, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportResponse, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveResponse, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootResponse, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsResponse, GetDocumentTypeConfigurationResponse, PostDocumentTypeFolderData, PostDocumentTypeFolderResponse, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdResponse, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdResponse, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdResponse, PostDocumentTypeImportData, PostDocumentTypeImportResponse, GetItemDocumentTypeData, GetItemDocumentTypeResponse, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchResponse, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsResponse, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenResponse, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootResponse, GetDocumentVersionData, GetDocumentVersionResponse, GetDocumentVersionByIdData, GetDocumentVersionByIdResponse, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupResponse, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackResponse, PostDynamicRootQueryData, PostDynamicRootQueryResponse, GetDynamicRootStepsResponse, GetHealthCheckGroupData, GetHealthCheckGroupResponse, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameResponse, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckResponse, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionResponse, GetHelpData, GetHelpResponse, GetImagingResizeUrlsData, GetImagingResizeUrlsResponse, GetImportAnalyzeData, GetImportAnalyzeResponse, GetIndexerData, GetIndexerResponse, GetIndexerByIndexNameData, GetIndexerByIndexNameResponse, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildResponse, GetInstallSettingsResponse, PostInstallSetupData, PostInstallSetupResponse, PostInstallValidateDatabaseData, PostInstallValidateDatabaseResponse, GetItemLanguageData, GetItemLanguageResponse, GetItemLanguageDefaultResponse, GetLanguageData, GetLanguageResponse, PostLanguageData, PostLanguageResponse, GetLanguageByIsoCodeData, GetLanguageByIsoCodeResponse, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeResponse, PutLanguageByIsoCodeData, PutLanguageByIsoCodeResponse, GetLogViewerLevelData, GetLogViewerLevelResponse, GetLogViewerLevelCountData, GetLogViewerLevelCountResponse, GetLogViewerLogData, GetLogViewerLogResponse, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateResponse, GetLogViewerSavedSearchData, GetLogViewerSavedSearchResponse, PostLogViewerSavedSearchData, PostLogViewerSavedSearchResponse, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameResponse, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameResponse, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeResponse, GetManifestManifestResponse, GetManifestManifestPrivateResponse, GetManifestManifestPublicResponse, GetCollectionMediaData, GetCollectionMediaResponse, GetItemMediaData, GetItemMediaResponse, GetItemMediaSearchData, GetItemMediaSearchResponse, PostMediaData, PostMediaResponse, GetMediaByIdData, GetMediaByIdResponse, DeleteMediaByIdData, DeleteMediaByIdResponse, PutMediaByIdData, PutMediaByIdResponse, GetMediaByIdAuditLogData, GetMediaByIdAuditLogResponse, PutMediaByIdMoveData, PutMediaByIdMoveResponse, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinResponse, GetMediaByIdReferencedByData, GetMediaByIdReferencedByResponse, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsResponse, PutMediaByIdValidateData, PutMediaByIdValidateResponse, GetMediaAreReferencedData, GetMediaAreReferencedResponse, GetMediaConfigurationResponse, PutMediaSortData, PutMediaSortResponse, GetMediaUrlsData, GetMediaUrlsResponse, PostMediaValidateData, PostMediaValidateResponse, DeleteRecycleBinMediaResponse, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdResponse, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentResponse, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreResponse, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenResponse, GetRecycleBinMediaRootData, GetRecycleBinMediaRootResponse, GetTreeMediaAncestorsData, GetTreeMediaAncestorsResponse, GetTreeMediaChildrenData, GetTreeMediaChildrenResponse, GetTreeMediaRootData, GetTreeMediaRootResponse, GetItemMediaTypeData, GetItemMediaTypeResponse, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedResponse, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersResponse, GetItemMediaTypeSearchData, GetItemMediaTypeSearchResponse, PostMediaTypeData, PostMediaTypeResponse, GetMediaTypeByIdData, GetMediaTypeByIdResponse, DeleteMediaTypeByIdData, DeleteMediaTypeByIdResponse, PutMediaTypeByIdData, PutMediaTypeByIdResponse, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenResponse, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesResponse, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyResponse, GetMediaTypeByIdExportData, GetMediaTypeByIdExportResponse, PutMediaTypeByIdImportData, PutMediaTypeByIdImportResponse, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveResponse, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootResponse, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsResponse, GetMediaTypeConfigurationResponse, PostMediaTypeFolderData, PostMediaTypeFolderResponse, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdResponse, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdResponse, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdResponse, PostMediaTypeImportData, PostMediaTypeImportResponse, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsResponse, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenResponse, GetTreeMediaTypeRootData, GetTreeMediaTypeRootResponse, GetFilterMemberData, GetFilterMemberResponse, GetItemMemberData, GetItemMemberResponse, GetItemMemberSearchData, GetItemMemberSearchResponse, PostMemberData, PostMemberResponse, GetMemberByIdData, GetMemberByIdResponse, DeleteMemberByIdData, DeleteMemberByIdResponse, PutMemberByIdData, PutMemberByIdResponse, PutMemberByIdValidateData, PutMemberByIdValidateResponse, GetMemberConfigurationResponse, PostMemberValidateData, PostMemberValidateResponse, GetItemMemberGroupData, GetItemMemberGroupResponse, GetMemberGroupData, GetMemberGroupResponse, PostMemberGroupData, PostMemberGroupResponse, GetMemberGroupByIdData, GetMemberGroupByIdResponse, DeleteMemberGroupByIdData, DeleteMemberGroupByIdResponse, PutMemberGroupByIdData, PutMemberGroupByIdResponse, GetTreeMemberGroupRootData, GetTreeMemberGroupRootResponse, GetItemMemberTypeData, GetItemMemberTypeResponse, GetItemMemberTypeSearchData, GetItemMemberTypeSearchResponse, PostMemberTypeData, PostMemberTypeResponse, GetMemberTypeByIdData, GetMemberTypeByIdResponse, DeleteMemberTypeByIdData, DeleteMemberTypeByIdResponse, PutMemberTypeByIdData, PutMemberTypeByIdResponse, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesResponse, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyResponse, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsResponse, GetMemberTypeConfigurationResponse, GetTreeMemberTypeRootData, GetTreeMemberTypeRootResponse, PostModelsBuilderBuildResponse, GetModelsBuilderDashboardResponse, GetModelsBuilderStatusResponse, GetObjectTypesData, GetObjectTypesResponse, GetOembedQueryData, GetOembedQueryResponse, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationResponse, GetPackageConfigurationResponse, GetPackageCreatedData, GetPackageCreatedResponse, PostPackageCreatedData, PostPackageCreatedResponse, GetPackageCreatedByIdData, GetPackageCreatedByIdResponse, DeletePackageCreatedByIdData, DeletePackageCreatedByIdResponse, PutPackageCreatedByIdData, PutPackageCreatedByIdResponse, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadResponse, GetPackageMigrationStatusData, GetPackageMigrationStatusResponse, GetItemPartialViewData, GetItemPartialViewResponse, PostPartialViewData, PostPartialViewResponse, GetPartialViewByPathData, GetPartialViewByPathResponse, DeletePartialViewByPathData, DeletePartialViewByPathResponse, PutPartialViewByPathData, PutPartialViewByPathResponse, PutPartialViewByPathRenameData, PutPartialViewByPathRenameResponse, PostPartialViewFolderData, PostPartialViewFolderResponse, GetPartialViewFolderByPathData, GetPartialViewFolderByPathResponse, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathResponse, GetPartialViewSnippetData, GetPartialViewSnippetResponse, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdResponse, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsResponse, GetTreePartialViewChildrenData, GetTreePartialViewChildrenResponse, GetTreePartialViewRootData, GetTreePartialViewRootResponse, DeletePreviewResponse, PostPreviewResponse, GetProfilingStatusResponse, PutProfilingStatusData, PutProfilingStatusResponse, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedResponse, PostPublishedCacheRebuildResponse, PostPublishedCacheReloadResponse, GetRedirectManagementData, GetRedirectManagementResponse, GetRedirectManagementByIdData, GetRedirectManagementByIdResponse, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdResponse, GetRedirectManagementStatusResponse, PostRedirectManagementStatusData, PostRedirectManagementStatusResponse, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdResponse, GetItemRelationTypeData, GetItemRelationTypeResponse, GetRelationTypeData, GetRelationTypeResponse, GetRelationTypeByIdData, GetRelationTypeByIdResponse, GetItemScriptData, GetItemScriptResponse, PostScriptData, PostScriptResponse, GetScriptByPathData, GetScriptByPathResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, PutScriptByPathData, PutScriptByPathResponse, PutScriptByPathRenameData, PutScriptByPathRenameResponse, PostScriptFolderData, PostScriptFolderResponse, GetScriptFolderByPathData, GetScriptFolderByPathResponse, DeleteScriptFolderByPathData, DeleteScriptFolderByPathResponse, GetTreeScriptAncestorsData, GetTreeScriptAncestorsResponse, GetTreeScriptChildrenData, GetTreeScriptChildrenResponse, GetTreeScriptRootData, GetTreeScriptRootResponse, GetSearcherData, GetSearcherResponse, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryResponse, GetSecurityConfigurationResponse, PostSecurityForgotPasswordData, PostSecurityForgotPasswordResponse, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetResponse, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyResponse, GetSegmentData, GetSegmentResponse, GetServerConfigurationResponse, GetServerInformationResponse, GetServerStatusResponse, GetServerTroubleshootingResponse, GetServerUpgradeCheckResponse, GetItemStaticFileData, GetItemStaticFileResponse, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsResponse, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenResponse, GetTreeStaticFileRootData, GetTreeStaticFileRootResponse, GetItemStylesheetData, GetItemStylesheetResponse, PostStylesheetData, PostStylesheetResponse, GetStylesheetByPathData, GetStylesheetByPathResponse, DeleteStylesheetByPathData, DeleteStylesheetByPathResponse, PutStylesheetByPathData, PutStylesheetByPathResponse, PutStylesheetByPathRenameData, PutStylesheetByPathRenameResponse, PostStylesheetFolderData, PostStylesheetFolderResponse, GetStylesheetFolderByPathData, GetStylesheetFolderByPathResponse, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathResponse, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsResponse, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenResponse, GetTreeStylesheetRootData, GetTreeStylesheetRootResponse, GetTagData, GetTagResponse, GetTelemetryData, GetTelemetryResponse, GetTelemetryLevelResponse, PostTelemetryLevelData, PostTelemetryLevelResponse, GetItemTemplateData, GetItemTemplateResponse, GetItemTemplateSearchData, GetItemTemplateSearchResponse, PostTemplateData, PostTemplateResponse, GetTemplateByIdData, GetTemplateByIdResponse, DeleteTemplateByIdData, DeleteTemplateByIdResponse, PutTemplateByIdData, PutTemplateByIdResponse, GetTemplateConfigurationResponse, PostTemplateQueryExecuteData, PostTemplateQueryExecuteResponse, GetTemplateQuerySettingsResponse, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsResponse, GetTreeTemplateChildrenData, GetTreeTemplateChildrenResponse, GetTreeTemplateRootData, GetTreeTemplateRootResponse, PostTemporaryFileData, PostTemporaryFileResponse, GetTemporaryFileByIdData, GetTemporaryFileByIdResponse, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdResponse, GetTemporaryFileConfigurationResponse, PostUpgradeAuthorizeResponse, GetUpgradeSettingsResponse, GetFilterUserData, GetFilterUserResponse, GetItemUserData, GetItemUserResponse, PostUserData, PostUserResponse, DeleteUserData, DeleteUserResponse, GetUserData, GetUserResponse, GetUserByIdData, GetUserByIdResponse, DeleteUserByIdData, DeleteUserByIdResponse, PutUserByIdData, PutUserByIdResponse, GetUserById2FaData, GetUserById2FaResponse, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameResponse, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesResponse, PostUserByIdChangePasswordData, PostUserByIdChangePasswordResponse, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsResponse, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsResponse, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdResponse, PostUserByIdResetPasswordData, PostUserByIdResetPasswordResponse, DeleteUserAvatarByIdData, DeleteUserAvatarByIdResponse, PostUserAvatarByIdData, PostUserAvatarByIdResponse, GetUserConfigurationResponse, GetUserCurrentResponse, GetUserCurrent2FaResponse, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameResponse, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameResponse, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameResponse, PostUserCurrentAvatarData, PostUserCurrentAvatarResponse, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordResponse, GetUserCurrentConfigurationResponse, GetUserCurrentLoginProvidersResponse, GetUserCurrentPermissionsData, GetUserCurrentPermissionsResponse, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentResponse, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaResponse, PostUserDisableData, PostUserDisableResponse, PostUserEnableData, PostUserEnableResponse, PostUserInviteData, PostUserInviteResponse, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordResponse, PostUserInviteResendData, PostUserInviteResendResponse, PostUserInviteVerifyData, PostUserInviteVerifyResponse, PostUserSetUserGroupsData, PostUserSetUserGroupsResponse, PostUserUnlockData, PostUserUnlockResponse, PostUserDataData, PostUserDataResponse, GetUserDataData, GetUserDataResponse, PutUserDataData, PutUserDataResponse, GetUserDataByIdData, GetUserDataByIdResponse, GetFilterUserGroupData, GetFilterUserGroupResponse, GetItemUserGroupData, GetItemUserGroupResponse, DeleteUserGroupData, DeleteUserGroupResponse, PostUserGroupData, PostUserGroupResponse, GetUserGroupData, GetUserGroupResponse, GetUserGroupByIdData, GetUserGroupByIdResponse, DeleteUserGroupByIdData, DeleteUserGroupByIdResponse, PutUserGroupByIdData, PutUserGroupByIdResponse, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersResponse, PostUserGroupByIdUsersData, PostUserGroupByIdUsersResponse, GetItemWebhookData, GetItemWebhookResponse, GetWebhookData, GetWebhookResponse, PostWebhookData, PostWebhookResponse, GetWebhookByIdData, GetWebhookByIdResponse, DeleteWebhookByIdData, DeleteWebhookByIdResponse, PutWebhookByIdData, PutWebhookByIdResponse, GetWebhookEventsData, GetWebhookEventsResponse, GetWebhookLogsData, GetWebhookLogsResponse } from './types.gen'; +import type { GetCultureData, GetCultureResponse, PostDataTypeData, PostDataTypeResponse, GetDataTypeByIdData, GetDataTypeByIdResponse, DeleteDataTypeByIdData, DeleteDataTypeByIdResponse, PutDataTypeByIdData, PutDataTypeByIdResponse, PostDataTypeByIdCopyData, PostDataTypeByIdCopyResponse, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedResponse, PutDataTypeByIdMoveData, PutDataTypeByIdMoveResponse, GetDataTypeByIdReferencesData, GetDataTypeByIdReferencesResponse, GetDataTypeConfigurationResponse, PostDataTypeFolderData, PostDataTypeFolderResponse, GetDataTypeFolderByIdData, GetDataTypeFolderByIdResponse, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdResponse, PutDataTypeFolderByIdData, PutDataTypeFolderByIdResponse, GetFilterDataTypeData, GetFilterDataTypeResponse, GetItemDataTypeData, GetItemDataTypeResponse, GetItemDataTypeSearchData, GetItemDataTypeSearchResponse, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsResponse, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenResponse, GetTreeDataTypeRootData, GetTreeDataTypeRootResponse, GetDictionaryData, GetDictionaryResponse, PostDictionaryData, PostDictionaryResponse, GetDictionaryByIdData, GetDictionaryByIdResponse, DeleteDictionaryByIdData, DeleteDictionaryByIdResponse, PutDictionaryByIdData, PutDictionaryByIdResponse, GetDictionaryByIdExportData, GetDictionaryByIdExportResponse, PutDictionaryByIdMoveData, PutDictionaryByIdMoveResponse, PostDictionaryImportData, PostDictionaryImportResponse, GetItemDictionaryData, GetItemDictionaryResponse, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsResponse, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenResponse, GetTreeDictionaryRootData, GetTreeDictionaryRootResponse, GetCollectionDocumentByIdData, GetCollectionDocumentByIdResponse, PostDocumentData, PostDocumentResponse, GetDocumentByIdData, GetDocumentByIdResponse, DeleteDocumentByIdData, DeleteDocumentByIdResponse, PutDocumentByIdData, PutDocumentByIdResponse, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogResponse, PostDocumentByIdCopyData, PostDocumentByIdCopyResponse, GetDocumentByIdDomainsData, GetDocumentByIdDomainsResponse, PutDocumentByIdDomainsData, PutDocumentByIdDomainsResponse, PutDocumentByIdMoveData, PutDocumentByIdMoveResponse, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinResponse, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsResponse, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsResponse, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessResponse, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessResponse, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessResponse, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessResponse, PutDocumentByIdPublishData, PutDocumentByIdPublishResponse, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsResponse, GetDocumentByIdPublishedData, GetDocumentByIdPublishedResponse, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByResponse, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsResponse, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishResponse, PutDocumentByIdValidateData, PutDocumentByIdValidateResponse, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Response, GetDocumentAreReferencedData, GetDocumentAreReferencedResponse, GetDocumentConfigurationResponse, PutDocumentSortData, PutDocumentSortResponse, GetDocumentUrlsData, GetDocumentUrlsResponse, PostDocumentValidateData, PostDocumentValidateResponse, GetItemDocumentData, GetItemDocumentResponse, GetItemDocumentSearchData, GetItemDocumentSearchResponse, DeleteRecycleBinDocumentResponse, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdResponse, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentResponse, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreResponse, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenResponse, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootResponse, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsResponse, GetTreeDocumentChildrenData, GetTreeDocumentChildrenResponse, GetTreeDocumentRootData, GetTreeDocumentRootResponse, PostDocumentBlueprintData, PostDocumentBlueprintResponse, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdResponse, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveResponse, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderResponse, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdResponse, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdResponse, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdResponse, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentResponse, GetItemDocumentBlueprintData, GetItemDocumentBlueprintResponse, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsResponse, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenResponse, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootResponse, PostDocumentTypeData, PostDocumentTypeResponse, GetDocumentTypeByIdData, GetDocumentTypeByIdResponse, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdResponse, PutDocumentTypeByIdData, PutDocumentTypeByIdResponse, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenResponse, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintResponse, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesResponse, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyResponse, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportResponse, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportResponse, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveResponse, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootResponse, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsResponse, GetDocumentTypeConfigurationResponse, PostDocumentTypeFolderData, PostDocumentTypeFolderResponse, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdResponse, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdResponse, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdResponse, PostDocumentTypeImportData, PostDocumentTypeImportResponse, GetItemDocumentTypeData, GetItemDocumentTypeResponse, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchResponse, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsResponse, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenResponse, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootResponse, GetDocumentVersionData, GetDocumentVersionResponse, GetDocumentVersionByIdData, GetDocumentVersionByIdResponse, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupResponse, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackResponse, PostDynamicRootQueryData, PostDynamicRootQueryResponse, GetDynamicRootStepsResponse, GetHealthCheckGroupData, GetHealthCheckGroupResponse, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameResponse, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckResponse, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionResponse, GetHelpData, GetHelpResponse, GetImagingResizeUrlsData, GetImagingResizeUrlsResponse, GetImportAnalyzeData, GetImportAnalyzeResponse, GetIndexerData, GetIndexerResponse, GetIndexerByIndexNameData, GetIndexerByIndexNameResponse, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildResponse, GetInstallSettingsResponse, PostInstallSetupData, PostInstallSetupResponse, PostInstallValidateDatabaseData, PostInstallValidateDatabaseResponse, GetItemLanguageData, GetItemLanguageResponse, GetItemLanguageDefaultResponse, GetLanguageData, GetLanguageResponse, PostLanguageData, PostLanguageResponse, GetLanguageByIsoCodeData, GetLanguageByIsoCodeResponse, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeResponse, PutLanguageByIsoCodeData, PutLanguageByIsoCodeResponse, GetLogViewerLevelData, GetLogViewerLevelResponse, GetLogViewerLevelCountData, GetLogViewerLevelCountResponse, GetLogViewerLogData, GetLogViewerLogResponse, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateResponse, GetLogViewerSavedSearchData, GetLogViewerSavedSearchResponse, PostLogViewerSavedSearchData, PostLogViewerSavedSearchResponse, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameResponse, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameResponse, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeResponse, GetManifestManifestResponse, GetManifestManifestPrivateResponse, GetManifestManifestPublicResponse, GetCollectionMediaData, GetCollectionMediaResponse, GetItemMediaData, GetItemMediaResponse, GetItemMediaSearchData, GetItemMediaSearchResponse, PostMediaData, PostMediaResponse, GetMediaByIdData, GetMediaByIdResponse, DeleteMediaByIdData, DeleteMediaByIdResponse, PutMediaByIdData, PutMediaByIdResponse, GetMediaByIdAuditLogData, GetMediaByIdAuditLogResponse, PutMediaByIdMoveData, PutMediaByIdMoveResponse, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinResponse, GetMediaByIdReferencedByData, GetMediaByIdReferencedByResponse, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsResponse, PutMediaByIdValidateData, PutMediaByIdValidateResponse, GetMediaAreReferencedData, GetMediaAreReferencedResponse, GetMediaConfigurationResponse, PutMediaSortData, PutMediaSortResponse, GetMediaUrlsData, GetMediaUrlsResponse, PostMediaValidateData, PostMediaValidateResponse, DeleteRecycleBinMediaResponse, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdResponse, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentResponse, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreResponse, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenResponse, GetRecycleBinMediaRootData, GetRecycleBinMediaRootResponse, GetTreeMediaAncestorsData, GetTreeMediaAncestorsResponse, GetTreeMediaChildrenData, GetTreeMediaChildrenResponse, GetTreeMediaRootData, GetTreeMediaRootResponse, GetItemMediaTypeData, GetItemMediaTypeResponse, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedResponse, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersResponse, GetItemMediaTypeSearchData, GetItemMediaTypeSearchResponse, PostMediaTypeData, PostMediaTypeResponse, GetMediaTypeByIdData, GetMediaTypeByIdResponse, DeleteMediaTypeByIdData, DeleteMediaTypeByIdResponse, PutMediaTypeByIdData, PutMediaTypeByIdResponse, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenResponse, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesResponse, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyResponse, GetMediaTypeByIdExportData, GetMediaTypeByIdExportResponse, PutMediaTypeByIdImportData, PutMediaTypeByIdImportResponse, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveResponse, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootResponse, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsResponse, GetMediaTypeConfigurationResponse, PostMediaTypeFolderData, PostMediaTypeFolderResponse, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdResponse, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdResponse, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdResponse, PostMediaTypeImportData, PostMediaTypeImportResponse, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsResponse, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenResponse, GetTreeMediaTypeRootData, GetTreeMediaTypeRootResponse, GetFilterMemberData, GetFilterMemberResponse, GetItemMemberData, GetItemMemberResponse, GetItemMemberSearchData, GetItemMemberSearchResponse, PostMemberData, PostMemberResponse, GetMemberByIdData, GetMemberByIdResponse, DeleteMemberByIdData, DeleteMemberByIdResponse, PutMemberByIdData, PutMemberByIdResponse, PutMemberByIdValidateData, PutMemberByIdValidateResponse, GetMemberConfigurationResponse, PostMemberValidateData, PostMemberValidateResponse, GetItemMemberGroupData, GetItemMemberGroupResponse, GetMemberGroupData, GetMemberGroupResponse, PostMemberGroupData, PostMemberGroupResponse, GetMemberGroupByIdData, GetMemberGroupByIdResponse, DeleteMemberGroupByIdData, DeleteMemberGroupByIdResponse, PutMemberGroupByIdData, PutMemberGroupByIdResponse, GetTreeMemberGroupRootData, GetTreeMemberGroupRootResponse, GetItemMemberTypeData, GetItemMemberTypeResponse, GetItemMemberTypeSearchData, GetItemMemberTypeSearchResponse, PostMemberTypeData, PostMemberTypeResponse, GetMemberTypeByIdData, GetMemberTypeByIdResponse, DeleteMemberTypeByIdData, DeleteMemberTypeByIdResponse, PutMemberTypeByIdData, PutMemberTypeByIdResponse, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesResponse, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyResponse, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsResponse, GetMemberTypeConfigurationResponse, GetTreeMemberTypeRootData, GetTreeMemberTypeRootResponse, PostModelsBuilderBuildResponse, GetModelsBuilderDashboardResponse, GetModelsBuilderStatusResponse, GetObjectTypesData, GetObjectTypesResponse, GetOembedQueryData, GetOembedQueryResponse, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationResponse, GetPackageConfigurationResponse, GetPackageCreatedData, GetPackageCreatedResponse, PostPackageCreatedData, PostPackageCreatedResponse, GetPackageCreatedByIdData, GetPackageCreatedByIdResponse, DeletePackageCreatedByIdData, DeletePackageCreatedByIdResponse, PutPackageCreatedByIdData, PutPackageCreatedByIdResponse, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadResponse, GetPackageMigrationStatusData, GetPackageMigrationStatusResponse, GetItemPartialViewData, GetItemPartialViewResponse, PostPartialViewData, PostPartialViewResponse, GetPartialViewByPathData, GetPartialViewByPathResponse, DeletePartialViewByPathData, DeletePartialViewByPathResponse, PutPartialViewByPathData, PutPartialViewByPathResponse, PutPartialViewByPathRenameData, PutPartialViewByPathRenameResponse, PostPartialViewFolderData, PostPartialViewFolderResponse, GetPartialViewFolderByPathData, GetPartialViewFolderByPathResponse, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathResponse, GetPartialViewSnippetData, GetPartialViewSnippetResponse, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdResponse, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsResponse, GetTreePartialViewChildrenData, GetTreePartialViewChildrenResponse, GetTreePartialViewRootData, GetTreePartialViewRootResponse, DeletePreviewResponse, PostPreviewResponse, GetProfilingStatusResponse, PutProfilingStatusData, PutProfilingStatusResponse, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedResponse, PostPublishedCacheRebuildResponse, PostPublishedCacheReloadResponse, GetRedirectManagementData, GetRedirectManagementResponse, GetRedirectManagementByIdData, GetRedirectManagementByIdResponse, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdResponse, GetRedirectManagementStatusResponse, PostRedirectManagementStatusData, PostRedirectManagementStatusResponse, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdResponse, GetItemRelationTypeData, GetItemRelationTypeResponse, GetRelationTypeData, GetRelationTypeResponse, GetRelationTypeByIdData, GetRelationTypeByIdResponse, GetItemScriptData, GetItemScriptResponse, PostScriptData, PostScriptResponse, GetScriptByPathData, GetScriptByPathResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, PutScriptByPathData, PutScriptByPathResponse, PutScriptByPathRenameData, PutScriptByPathRenameResponse, PostScriptFolderData, PostScriptFolderResponse, GetScriptFolderByPathData, GetScriptFolderByPathResponse, DeleteScriptFolderByPathData, DeleteScriptFolderByPathResponse, GetTreeScriptAncestorsData, GetTreeScriptAncestorsResponse, GetTreeScriptChildrenData, GetTreeScriptChildrenResponse, GetTreeScriptRootData, GetTreeScriptRootResponse, GetSearcherData, GetSearcherResponse, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryResponse, GetSecurityConfigurationResponse, PostSecurityForgotPasswordData, PostSecurityForgotPasswordResponse, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetResponse, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyResponse, GetSegmentData, GetSegmentResponse, GetServerConfigurationResponse, GetServerInformationResponse, GetServerStatusResponse, GetServerTroubleshootingResponse, GetServerUpgradeCheckResponse, GetItemStaticFileData, GetItemStaticFileResponse, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsResponse, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenResponse, GetTreeStaticFileRootData, GetTreeStaticFileRootResponse, GetItemStylesheetData, GetItemStylesheetResponse, PostStylesheetData, PostStylesheetResponse, GetStylesheetByPathData, GetStylesheetByPathResponse, DeleteStylesheetByPathData, DeleteStylesheetByPathResponse, PutStylesheetByPathData, PutStylesheetByPathResponse, PutStylesheetByPathRenameData, PutStylesheetByPathRenameResponse, PostStylesheetFolderData, PostStylesheetFolderResponse, GetStylesheetFolderByPathData, GetStylesheetFolderByPathResponse, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathResponse, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsResponse, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenResponse, GetTreeStylesheetRootData, GetTreeStylesheetRootResponse, GetTagData, GetTagResponse, GetTelemetryData, GetTelemetryResponse, GetTelemetryLevelResponse, PostTelemetryLevelData, PostTelemetryLevelResponse, GetItemTemplateData, GetItemTemplateResponse, GetItemTemplateSearchData, GetItemTemplateSearchResponse, PostTemplateData, PostTemplateResponse, GetTemplateByIdData, GetTemplateByIdResponse, DeleteTemplateByIdData, DeleteTemplateByIdResponse, PutTemplateByIdData, PutTemplateByIdResponse, GetTemplateConfigurationResponse, PostTemplateQueryExecuteData, PostTemplateQueryExecuteResponse, GetTemplateQuerySettingsResponse, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsResponse, GetTreeTemplateChildrenData, GetTreeTemplateChildrenResponse, GetTreeTemplateRootData, GetTreeTemplateRootResponse, PostTemporaryFileData, PostTemporaryFileResponse, GetTemporaryFileByIdData, GetTemporaryFileByIdResponse, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdResponse, GetTemporaryFileConfigurationResponse, PostUpgradeAuthorizeResponse, GetUpgradeSettingsResponse, GetFilterUserData, GetFilterUserResponse, GetItemUserData, GetItemUserResponse, PostUserData, PostUserResponse, DeleteUserData, DeleteUserResponse, GetUserData, GetUserResponse, GetUserByIdData, GetUserByIdResponse, DeleteUserByIdData, DeleteUserByIdResponse, PutUserByIdData, PutUserByIdResponse, GetUserById2FaData, GetUserById2FaResponse, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameResponse, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesResponse, PostUserByIdChangePasswordData, PostUserByIdChangePasswordResponse, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsResponse, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsResponse, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdResponse, PostUserByIdResetPasswordData, PostUserByIdResetPasswordResponse, DeleteUserAvatarByIdData, DeleteUserAvatarByIdResponse, PostUserAvatarByIdData, PostUserAvatarByIdResponse, GetUserConfigurationResponse, GetUserCurrentResponse, GetUserCurrent2FaResponse, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameResponse, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameResponse, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameResponse, PostUserCurrentAvatarData, PostUserCurrentAvatarResponse, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordResponse, GetUserCurrentConfigurationResponse, GetUserCurrentLoginProvidersResponse, GetUserCurrentPermissionsData, GetUserCurrentPermissionsResponse, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentResponse, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaResponse, PostUserDisableData, PostUserDisableResponse, PostUserEnableData, PostUserEnableResponse, PostUserInviteData, PostUserInviteResponse, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordResponse, PostUserInviteResendData, PostUserInviteResendResponse, PostUserInviteVerifyData, PostUserInviteVerifyResponse, PostUserSetUserGroupsData, PostUserSetUserGroupsResponse, PostUserUnlockData, PostUserUnlockResponse, PostUserDataData, PostUserDataResponse, GetUserDataData, GetUserDataResponse, PutUserDataData, PutUserDataResponse, GetUserDataByIdData, GetUserDataByIdResponse, GetFilterUserGroupData, GetFilterUserGroupResponse, GetItemUserGroupData, GetItemUserGroupResponse, DeleteUserGroupData, DeleteUserGroupResponse, PostUserGroupData, PostUserGroupResponse, GetUserGroupData, GetUserGroupResponse, GetUserGroupByIdData, GetUserGroupByIdResponse, DeleteUserGroupByIdData, DeleteUserGroupByIdResponse, PutUserGroupByIdData, PutUserGroupByIdResponse, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersResponse, PostUserGroupByIdUsersData, PostUserGroupByIdUsersResponse, GetItemWebhookData, GetItemWebhookResponse, GetWebhookData, GetWebhookResponse, PostWebhookData, PostWebhookResponse, GetWebhookByIdData, GetWebhookByIdResponse, DeleteWebhookByIdData, DeleteWebhookByIdResponse, PutWebhookByIdData, PutWebhookByIdResponse, GetWebhookByIdLogsData, GetWebhookByIdLogsResponse, GetWebhookEventsData, GetWebhookEventsResponse, GetWebhookLogsData, GetWebhookLogsResponse } from './types.gen'; export class CultureService { /** @@ -8863,6 +8863,31 @@ export class WebhookService { }); } + /** + * @param data The data for the request. + * @param data.id + * @param data.skip + * @param data.take + * @returns unknown OK + * @throws ApiError + */ + public static getWebhookByIdLogs(data: GetWebhookByIdLogsData): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/webhook/{id}/logs', + path: { + id: data.id + }, + query: { + skip: data.skip, + take: data.take + }, + errors: { + 401: 'The resource is protected and requires an authentication token' + } + }); + } + /** * @param data The data for the request. * @param data.skip @@ -8901,8 +8926,7 @@ export class WebhookService { take: data.take }, errors: { - 401: 'The resource is protected and requires an authentication token', - 404: 'Not Found' + 401: 'The resource is protected and requires an authentication token' } }); } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts index 055fd92749..433feb3f95 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts @@ -1942,6 +1942,11 @@ export type PagedWebhookEventModel = { items: Array<(WebhookEventModel)>; }; +export type PagedWebhookLogResponseModel = { + total: number; + items: Array<(WebhookLogResponseModel)>; +}; + export type PagedWebhookResponseModel = { total: number; items: Array<(WebhookResponseModel)>; @@ -2881,6 +2886,22 @@ export type WebhookItemResponseModel = { types: string; }; +export type WebhookLogResponseModel = { + key: string; + webhookKey: string; + statusCode: string; + isSuccessStatusCode: boolean; + date: string; + eventAlias: string; + url: string; + retryCount: number; + requestHeaders: string; + requestBody: string; + responseHeaders: string; + responseBody: string; + exceptionOccured: boolean; +}; + export type WebhookResponseModel = { enabled: boolean; url: string; @@ -5356,6 +5377,14 @@ export type PutWebhookByIdData = { export type PutWebhookByIdResponse = (string); +export type GetWebhookByIdLogsData = { + id: string; + skip?: number; + take?: number; +}; + +export type GetWebhookByIdLogsResponse = ((PagedWebhookLogResponseModel)); + export type GetWebhookEventsData = { skip?: number; take?: number; @@ -5368,4 +5397,4 @@ export type GetWebhookLogsData = { take?: number; }; -export type GetWebhookLogsResponse = ((WebhookResponseModel)); \ No newline at end of file +export type GetWebhookLogsResponse = ((PagedWebhookLogResponseModel)); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts index 52f3837354..357e2eb0ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts @@ -1,12 +1,16 @@ import type { UmbCollectionConfiguration } from './types.js'; import type { ManifestCollection } from './extensions/types.js'; +import type { UmbCollectionFilterModel } from './collection-filter-model.interface.js'; import { customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbExtensionElementAndApiSlotElementBase } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; const elementName = 'umb-collection'; @customElement(elementName) -export class UmbCollectionElement extends UmbExtensionElementAndApiSlotElementBase { +export class UmbCollectionElement< + ConfigType extends UmbCollectionConfiguration = UmbCollectionConfiguration, + FilterType extends UmbCollectionFilterModel = UmbCollectionFilterModel, +> extends UmbExtensionElementAndApiSlotElementBase { getExtensionType() { return 'collection'; } @@ -16,18 +20,29 @@ export class UmbCollectionElement extends UmbExtensionElementAndApiSlotElementBa } @property({ type: Object, attribute: false }) - set config(newVal: UmbCollectionConfiguration | undefined) { + set config(newVal: ConfigType | undefined) { this.#config = newVal; this.#setConfig(); } get config() { return this.#config; } - #config?: UmbCollectionConfiguration; + #config?: ConfigType; + + @property({ type: Object, attribute: false }) + set filter(newVal: FilterType | undefined) { + this.#filter = newVal; + this.#setFilter(); + } + get filter() { + return this.#filter; + } + #filter?: FilterType; protected override apiChanged(api: UmbApi | undefined): void { super.apiChanged(api); this.#setConfig(); + this.#setFilter(); } #setConfig() { @@ -36,6 +51,13 @@ export class UmbCollectionElement extends UmbExtensionElementAndApiSlotElementBa // @ts-ignore this._api.setConfig(this.#config); } + + #setFilter() { + if (!this.#filter || !this._api) return; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._api.setFilter(this.#filter); + } } declare global { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/date-table-column-view/date-table-column-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/date-table-column-view/date-table-column-view.element.ts new file mode 100644 index 0000000000..e3c1aa9a42 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/date-table-column-view/date-table-column-view.element.ts @@ -0,0 +1,20 @@ +import { html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +@customElement('umb-date-table-column-view') +export class UmbDateTableColumnViewElement extends UmbLitElement { + @property({ attribute: false }) + value?: string; + + override render() { + if (!this.value) return nothing; + const date = new Date(this.value); + return html`${date.toLocaleString()}`; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-date-table-column-view': UmbDateTableColumnViewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/index.ts index a440030db1..7f76846b35 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/index.ts @@ -1,4 +1,5 @@ import './boolean-table-column-view/boolean-table-column-view.element.js'; +import './date-table-column-view/date-table-column-view.element.js'; import './collection-action-bundle.element.js'; import './collection-filter-field.element.js'; import './collection-selection-actions.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/index.ts index 334cc99458..7ffdd86cf6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/index.ts @@ -7,6 +7,7 @@ export * from './collection.element.js'; export * from './components/index.js'; export * from './conditions/index.js'; export * from './collection-item-picker-modal/index.js'; +export * from './workspace-view/index.js'; export * from './default/collection-default.context.js'; export * from './default/collection-default.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/workspace-view/collection-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/workspace-view/collection-workspace-view.element.ts index ae709482ac..679dbb836e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/workspace-view/collection-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/workspace-view/collection-workspace-view.element.ts @@ -1,17 +1,26 @@ +import type { UmbCollectionConfiguration } from '../types.js'; import type { ManifestWorkspaceViewCollectionKind } from './types.js'; -import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -const elementName = 'umb-collection-workspace-view'; -@customElement(elementName) +@customElement('umb-collection-workspace-view') export class UmbCollectionWorkspaceViewElement extends UmbLitElement { @property({ type: Object, attribute: false }) - manifest?: ManifestWorkspaceViewCollectionKind; + public manifest?: ManifestWorkspaceViewCollectionKind; + + @state() + protected _config?: UmbCollectionConfiguration; + + @state() + protected _filter?: unknown; override render() { if (!this.manifest) return html`
No Manifest
`; if (!this.manifest.meta.collectionAlias) return html`
No Collection Alias in Manifest
`; - return html``; + return html``; } } @@ -19,6 +28,6 @@ export { UmbCollectionWorkspaceViewElement as element }; declare global { interface HTMLElementTagNameMap { - [elementName]: UmbCollectionWorkspaceViewElement; + 'umb-collection-workspace-view': UmbCollectionWorkspaceViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/constants.ts deleted file mode 100644 index c0c34b5d93..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export { UMB_WEBHOOK_EVENTS_MODAL } from './webhook-events-modal/webhook-events-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/constants.ts index 10af37b6c7..ecc64ff8c6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/constants.ts @@ -1,4 +1,4 @@ -export * from './collection/constants.js'; -export * from './components/constants.js'; -export * from './repository/constants.js'; -export * from './workspace/constants.js'; +export * from './webhook-event/constants.js'; +export * from './webhook-delivery/constants.js'; +export * from './webhook-root/constants.js'; +export * from './webhook/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/entity.ts index e0c220e06d..51932a19c6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/entity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/entity.ts @@ -6,5 +6,8 @@ export const UMB_WEBHOOK_WORKSPACE = 'Umb.Workspace.Webhook'; export const UMB_WEBHOOK_ENTITY_TYPE = 'webhook'; export const UMB_WEBHOOK_ROOT_ENTITY_TYPE = 'webhook-root'; +export const UMB_WEBHOOK_DELIVERY_ENTITY_TYPE = 'webhook-delivery'; export type UmbWebhookEntityType = typeof UMB_WEBHOOK_ENTITY_TYPE; + +export type UmbWebhookDeliveryEntityType = typeof UMB_WEBHOOK_DELIVERY_ENTITY_TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts index e7a395db88..3936c26017 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts @@ -1,5 +1,6 @@ -export * from './collection/index.js'; export * from './constants.js'; export * from './entity.js'; -export * from './repository/index.js'; +export * from './webhook-event/index.js'; +export * from './webhook/index.js'; + export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts index 51de6fd4c9..a034f49856 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts @@ -1,18 +1,11 @@ -import { manifests as treeManifests } from './menu-item/manifests.js'; -import { manifests as workspaceManifests } from './workspace/manifests.js'; -import { manifests as collectionManifests } from './collection/manifests.js'; -import { manifests as repositoryManifests } from './repository/manifests.js'; -import { manifests as entityActions } from './entity-actions/manifests.js'; +import { manifests as webhookDeliveryManifests } from './webhook-delivery/manifests.js'; +import { manifests as webhookEventManifests } from './webhook-event/manifests.js'; +import { manifests as webhookManifests } from './webhook/manifests.js'; +import { manifests as webhookRootManifests } from './webhook-root/manifests.js'; + export const manifests: Array = [ - ...treeManifests, - ...workspaceManifests, - ...collectionManifests, - ...repositoryManifests, - ...entityActions, - { - type: 'modal', - alias: 'Umb.Modal.Webhook.Events', - name: 'Webhook Events Modal', - js: () => import('./components/webhook-events-modal/webhook-events-modal.element.js'), - }, + ...webhookDeliveryManifests, + ...webhookEventManifests, + ...webhookManifests, + ...webhookRootManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/index.ts deleted file mode 100644 index c236ecde57..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './detail/index.js'; -export * from './event/index.js'; -export * from './item/manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/types.ts index 8c3c816539..8ca708f68e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/types.ts @@ -1,17 +1,3 @@ -import type { UmbWebhookEntityType } from './entity.js'; - -export interface UmbWebhookDetailModel { - entityType: UmbWebhookEntityType; - headers: Record; - unique: string; - enabled: boolean; - url: string; - events: Array; - contentTypes: Array; -} - -export interface UmbWebhookEventModel { - eventName: string; - eventType: string; - alias: string; -} +export type * from './webhook/types.js'; +export type * from './webhook-delivery/types.js'; +export type * from './webhook-event/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/constants.ts new file mode 100644 index 0000000000..f81716723c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/constants.ts @@ -0,0 +1,3 @@ +export * from './repository/constants.js'; + +export const UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS = 'Umb.Collection.Webhook.Delivery'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/index.ts new file mode 100644 index 0000000000..c5243b17bf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/index.ts @@ -0,0 +1,2 @@ +export { UmbWebhookDeliveryCollectionRepository } from './repository/index.js'; +export { UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/manifests.ts new file mode 100644 index 0000000000..c9790b0b3c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/manifests.ts @@ -0,0 +1,20 @@ +import { + UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS, + UMB_WEBHOOK_DELIVERY_COLLECTION_REPOSITORY_ALIAS, +} from './constants.js'; +import { manifests as collectionRepositoryManifests } from './repository/manifests.js'; +import { manifests as collectionViewManifests } from './views/manifests.js'; + +export const manifests: Array = [ + { + type: 'collection', + kind: 'default', + alias: UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS, + name: 'Webhook Delivery Collection', + meta: { + repositoryAlias: UMB_WEBHOOK_DELIVERY_COLLECTION_REPOSITORY_ALIAS, + }, + }, + ...collectionRepositoryManifests, + ...collectionViewManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/constants.ts new file mode 100644 index 0000000000..02e4e939d2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_WEBHOOK_DELIVERY_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.WebhookDelivery.Collection'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/index.ts new file mode 100644 index 0000000000..cc58ece354 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/index.ts @@ -0,0 +1 @@ +export { UmbWebhookDeliveryCollectionRepository } from './webhook-delivery-collection.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/manifests.ts new file mode 100644 index 0000000000..d433456b00 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_WEBHOOK_DELIVERY_COLLECTION_REPOSITORY_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_WEBHOOK_DELIVERY_COLLECTION_REPOSITORY_ALIAS, + name: 'Webhook Delivery Collection Repository', + api: () => import('./webhook-delivery-collection.repository.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/types.ts new file mode 100644 index 0000000000..9d12af4af4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/types.ts @@ -0,0 +1,8 @@ +import type { UmbWebhookDeliveryDetailModel } from '../../types.js'; +import type { UmbWebhookDeliveryCollectionFilterModel } from '../types.js'; +import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; + +export type UmbWebhookDeliveryCollectionDataSource = UmbCollectionDataSource< + UmbWebhookDeliveryDetailModel, + UmbWebhookDeliveryCollectionFilterModel +>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.repository.ts new file mode 100644 index 0000000000..7ccff419a5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.repository.ts @@ -0,0 +1,25 @@ +import type { UmbWebhookDeliveryCollectionFilterModel } from '../types.js'; +import type { UmbWebhookDeliveryDetailModel } from '../../types.js'; +import { UmbWebhookDeliveryCollectionServerDataSource } from './webhook-delivery-collection.server.data-source.js'; +import type { UmbWebhookDeliveryCollectionDataSource } from './types.js'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbCollectionRepository } from '@umbraco-cms/backoffice/collection'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbWebhookDeliveryCollectionRepository + extends UmbRepositoryBase + implements UmbCollectionRepository +{ + #collectionSource: UmbWebhookDeliveryCollectionDataSource; + + constructor(host: UmbControllerHost) { + super(host); + this.#collectionSource = new UmbWebhookDeliveryCollectionServerDataSource(host); + } + + async requestCollection(filter: UmbWebhookDeliveryCollectionFilterModel) { + return this.#collectionSource.getCollection(filter); + } +} + +export default UmbWebhookDeliveryCollectionRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.server.data-source.ts new file mode 100644 index 0000000000..448f8c30e2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.server.data-source.ts @@ -0,0 +1,62 @@ +import type { UmbWebhookDeliveryCollectionFilterModel } from '../types.js'; +import { UMB_WEBHOOK_DELIVERY_ENTITY_TYPE } from '../../../entity.js'; +import type { UmbWebhookDeliveryDetailModel } from '../../types.js'; +import { WebhookService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source that fetches the webhook delivery collection data from the server. + * @class UmbWebhookDeliveryCollectionServerDataSource + * @implements {UmbCollectionDataSource} + */ +export class UmbWebhookDeliveryCollectionServerDataSource implements UmbWebhookDeliveryCollectionServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbWebhookDeliveryCollectionServerDataSource. + * @param {UmbControllerHost} host - The controller host for this controller to be appended to + * @memberof UmbWebhookDeliveryCollectionServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Gets the Webhook delivery collection filtered by the given filter. + * @param {UmbWebhookDeliveryCollectionFilterModel} filter + * @param filter + * @returns {*} + * @memberof UmbWebhookDeliveryCollectionServerDataSource + */ + async getCollection(filter: UmbWebhookDeliveryCollectionFilterModel) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + WebhookService.getWebhookByIdLogs({ + id: filter.webhook.unique, + skip: filter.skip, + take: filter.take, + }), + ); + + if (error || !data) { + return { error }; + } + + const items = data.items.map((item) => { + const model: UmbWebhookDeliveryDetailModel = { + entityType: UMB_WEBHOOK_DELIVERY_ENTITY_TYPE, + unique: item.key, + date: item.date, + url: item.url, + eventAlias: item.eventAlias, + retryCount: item.retryCount, + statusCode: item.statusCode, + }; + + return model; + }); + + return { data: { items, total: data.total } }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/types.ts new file mode 100644 index 0000000000..1d17ac9a97 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/types.ts @@ -0,0 +1,5 @@ +export interface UmbWebhookDeliveryCollectionFilterModel { + webhook: { unique: string }; + skip?: number; + take?: number; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/manifests.ts new file mode 100644 index 0000000000..e68f5c6a1b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/manifests.ts @@ -0,0 +1,21 @@ +import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; + +export const manifests: Array = [ + { + type: 'collectionView', + alias: 'Umb.CollectionView.WebhookDeliveries.Table', + name: 'Webhook Deliveries Table Collection View', + js: () => import('./table/webhook-delivery-table-collection-view.element.js'), + meta: { + label: 'Table', + icon: 'icon-list', + pathName: 'table', + }, + conditions: [ + { + alias: UMB_COLLECTION_ALIAS_CONDITION, + match: 'Umb.Collection.Webhook.Delivery', + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/column-layouts/status-code/webhook-delivery-table-status-code-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/column-layouts/status-code/webhook-delivery-table-status-code-column-layout.element.ts new file mode 100644 index 0000000000..55094cf2fd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/column-layouts/status-code/webhook-delivery-table-status-code-column-layout.element.ts @@ -0,0 +1,42 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, LitElement, nothing, customElement, property, css } from '@umbraco-cms/backoffice/external/lit'; + +@customElement('umb-webhook-delivery-table-status-code-column-layout') +export class UmbWebhookDeliveryTableStatusCodeColumnLayoutElement extends LitElement { + @property({ attribute: false }) + value: string = ''; + + #getTagColor() { + if (this.value.includes('(2')) { + return 'positive'; + } + if (this.value.includes('(4')) { + return 'warning'; + } + if (this.value.includes('(5')) { + return 'danger'; + } + + return 'default'; + } + + override render() { + if (this.value.length === 0) return nothing; + return html`${this.value}`; + } + + static override styles = [ + UmbTextStyles, + css` + :host { + white-space: nowrap; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-webhook-delivery-table-status-code-column-layout': UmbWebhookDeliveryTableStatusCodeColumnLayoutElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/webhook-delivery-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/webhook-delivery-table-collection-view.element.ts new file mode 100644 index 0000000000..404ed17c38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/collection/views/table/webhook-delivery-table-collection-view.element.ts @@ -0,0 +1,114 @@ +import type { UmbWebhookDeliveryDetailModel } from '../../../types.js'; +import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; + +import './column-layouts/status-code/webhook-delivery-table-status-code-column-layout.element.js'; + +@customElement('umb-webhook-delivery-table-collection-view') +export class UmbWebhookDeliveryTableCollectionViewElement extends UmbLitElement { + @state() + private _tableConfig: UmbTableConfig = { + allowSelection: false, + }; + + @state() + private _tableColumns: Array = [ + { + name: this.localize.term('general_date'), + alias: 'date', + }, + { + name: this.localize.term('webhooks_url'), + alias: 'eventUrl', + }, + { + name: this.localize.term('webhooks_event'), + alias: 'eventAlias', + }, + { + name: this.localize.term('webhooks_statusCode'), + alias: 'statusCode', + elementName: 'umb-webhook-delivery-table-status-code-column-layout', + }, + { + name: this.localize.term('webhooks_retryCount'), + alias: 'retryCount', + }, + ]; + + @state() + private _tableItems: Array = []; + + #collectionContext?: UmbDefaultCollectionContext; + + constructor() { + super(); + + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { + this.#collectionContext = instance; + this.#observeCollectionItems(); + }); + } + + #observeCollectionItems() { + if (!this.#collectionContext) return; + this.observe(this.#collectionContext.items, (items) => this.#createTableItems(items), 'umbCollectionItemsObserver'); + } + + #createTableItems(deliveries: Array) { + this._tableItems = deliveries.map((delivery) => { + return { + id: delivery.unique, + icon: 'icon-box-alt', + data: [ + { + columnAlias: 'date', + value: html``, + }, + { + columnAlias: 'eventUrl', + value: delivery.url, + }, + { + columnAlias: 'eventAlias', + value: delivery.eventAlias, + }, + { + columnAlias: 'statusCode', + value: delivery.statusCode, + }, + { + columnAlias: 'retryCount', + value: delivery.retryCount, + }, + ], + }; + }); + } + + override render() { + return html` + + `; + } + + static override styles = [ + css` + :host { + display: flex; + flex-direction: column; + } + `, + ]; +} + +export default UmbWebhookDeliveryTableCollectionViewElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-webhook-delivery-table-collection-view': UmbWebhookDeliveryTableCollectionViewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/constants.ts new file mode 100644 index 0000000000..d7b529d49c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/constants.ts @@ -0,0 +1 @@ +export * from './collection/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/manifests.ts new file mode 100644 index 0000000000..4527764350 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as collectionManifests } from './collection/manifests.js'; +import { manifests as workspaceViewManifests } from './workspace-view/manifests.js'; + +export const manifests: Array = [...collectionManifests, ...workspaceViewManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/types.ts new file mode 100644 index 0000000000..bc029bb4b7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/types.ts @@ -0,0 +1,11 @@ +import type { UmbWebhookDeliveryEntityType } from '../entity.js'; + +export interface UmbWebhookDeliveryDetailModel { + entityType: UmbWebhookDeliveryEntityType; + unique: string; + date: string; + url: string; + eventAlias: string; + retryCount: number; + statusCode: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/manifests.ts new file mode 100644 index 0000000000..7775403569 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/manifests.ts @@ -0,0 +1,25 @@ +import { UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS } from '../collection/constants.js'; +import { UMB_WEBHOOK_WORKSPACE_ALIAS } from '../../entity.js'; +import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; + +export const manifests: Array = [ + { + type: 'workspaceView', + kind: 'collection', + alias: 'Umb.WorkspaceView.WebhookDelivery.Collection', + name: 'Webhook Delivery Workspace View', + element: () => import('./webhook-delivery-collection-workspace-view.element.js'), + meta: { + label: 'Deliveries', + pathname: 'deliveries', + icon: 'icon-box-alt', + collectionAlias: UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS, + }, + conditions: [ + { + alias: UMB_WORKSPACE_CONDITION_ALIAS, + match: UMB_WEBHOOK_WORKSPACE_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/webhook-delivery-collection-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/webhook-delivery-collection-workspace-view.element.ts new file mode 100644 index 0000000000..ee877bbde8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-delivery/workspace-view/webhook-delivery-collection-workspace-view.element.ts @@ -0,0 +1,28 @@ +import { UMB_WEBHOOK_WORKSPACE_CONTEXT } from '../../webhook/constants.js'; +import { UmbCollectionWorkspaceViewElement } from '@umbraco-cms/backoffice/collection'; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; + +@customElement('umb-webhook-delivery-collection-workspace-view') +export class UmbWebhookDeliveryCollectionWorkspaceViewElement extends UmbCollectionWorkspaceViewElement { + constructor() { + super(); + + this.consumeContext(UMB_WEBHOOK_WORKSPACE_CONTEXT, (instance) => { + this.observe(instance.unique, (unique) => this.#setWebhookFilter(unique)); + }); + } + + #setWebhookFilter(unique: string | null) { + this._filter = { + webhook: unique ? { unique } : null, + }; + } +} + +export { UmbWebhookDeliveryCollectionWorkspaceViewElement as element }; + +declare global { + interface HTMLElementTagNameMap { + 'umb-webhook-delivery-collection-workspace-view': UmbWebhookDeliveryCollectionWorkspaceViewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/constants.ts new file mode 100644 index 0000000000..9c35ab3ee7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/constants.ts @@ -0,0 +1,2 @@ +export * from './modal/constants.js'; +export * from './repository/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/index.ts new file mode 100644 index 0000000000..3d76f338dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/index.ts @@ -0,0 +1 @@ +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-events.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/input-webhook-events.element.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-events.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/input-webhook-events.element.ts index f17bea9008..ceb1df8947 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-events.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/input-webhook-events.element.ts @@ -1,5 +1,5 @@ -import type { UmbWebhookEventModel } from '../types.js'; -import { UMB_WEBHOOK_EVENTS_MODAL } from './webhook-events-modal/webhook-events-modal.token.js'; +import { UMB_WEBHOOK_EVENTS_MODAL } from './modal/webhook-events-modal.token.js'; +import type { UmbWebhookEventModel } from './types.js'; import { css, html, customElement, property, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/manifests.ts new file mode 100644 index 0000000000..6b7cf27f51 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as modalManifests } from './modal/manifests.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; + +export const manifests: Array = [...modalManifests, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/constants.ts new file mode 100644 index 0000000000..dc255bb35b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/constants.ts @@ -0,0 +1 @@ +export * from './webhook-events-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/manifests.ts new file mode 100644 index 0000000000..b873107860 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/manifests.ts @@ -0,0 +1,8 @@ +export const manifests: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.Webhook.Events', + name: 'Webhook Events Modal', + js: () => import('./webhook-events-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/webhook-events-modal.element.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/webhook-events-modal.element.ts index 7df91e91c6..ff77e8d511 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/webhook-events-modal.element.ts @@ -1,5 +1,5 @@ -import { UmbWebhookEventRepository } from '../../repository/event/webhook-event.repository.js'; -import type { UmbWebhookEventModel } from '../../types.js'; +import { UmbWebhookEventRepository } from '../repository/webhook-event.repository.js'; +import type { UmbWebhookEventModel } from '../types.js'; import type { UmbWebhookPickerModalData, UmbWebhookPickerModalValue } from './webhook-events-modal.token.js'; import { customElement, html, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/webhook-events-modal.token.ts similarity index 86% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/webhook-events-modal.token.ts index a433351d06..83e1b1e0c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/modal/webhook-events-modal.token.ts @@ -1,4 +1,4 @@ -import type { UmbWebhookEventModel } from '../../types.js'; +import type { UmbWebhookEventModel } from '../types.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbWebhookPickerModalData { diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.server.data-source.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.store.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.store.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.store.ts index 39e03e2ce9..27678f1085 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/event/webhook-event.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/repository/webhook-event.store.ts @@ -1,4 +1,4 @@ -import type { UmbWebhookEventModel } from '../../types.js'; +import type { UmbWebhookEventModel } from '../types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/types.ts new file mode 100644 index 0000000000..4c411f602f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-event/types.ts @@ -0,0 +1,5 @@ +export interface UmbWebhookEventModel { + eventName: string; + eventType: string; + alias: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/constants.ts new file mode 100644 index 0000000000..2840e34df8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/constants.ts @@ -0,0 +1 @@ +export * from './workspace/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/manifests.ts new file mode 100644 index 0000000000..f1dce3155e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as menuItemManifests } from './menu-item/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; + +export const manifests: Array = [...menuItemManifests, ...workspaceManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/menu-item/manifests.ts similarity index 89% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/menu-item/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/menu-item/manifests.ts index e04e92a59c..1a109a6078 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/menu-item/manifests.ts @@ -2,7 +2,7 @@ export const manifests: Array = [ { type: 'menuItem', alias: 'Umb.MenuItem.Webhook', - name: 'Webhook Menu Item', + name: 'Webhook Root Menu Item', weight: 100, meta: { label: '#treeHeaders_webhooks', diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook-root/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/workspace/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook-root/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/workspace/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/workspace/manifests.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook-root/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/workspace/manifests.ts index b63162d1c3..2dcb55453a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook-root/workspace/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_WEBHOOK_COLLECTION_ALIAS } from '../../constants.js'; +import { UMB_WEBHOOK_COLLECTION_ALIAS } from '../../webhook/constants.js'; import { UMB_WEBHOOK_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_WEBHOOK_ROOT_WORKSPACE_ALIAS } from './constants.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/action/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/action/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/action/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/types.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/types.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/webhook-collection.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/webhook-collection.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/webhook-collection.server.data-source.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/webhook-collection.server.data-source.ts index ac19447bbe..59583f7778 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/repository/webhook-collection.server.data-source.ts @@ -1,6 +1,6 @@ import type { UmbWebhookCollectionFilterModel } from '../types.js'; +import { UMB_WEBHOOK_ENTITY_TYPE } from '../../../entity.js'; import type { UmbWebhookDetailModel } from '../../types.js'; -import { UMB_WEBHOOK_ENTITY_TYPE } from '../../entity.js'; import { WebhookService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -50,6 +50,6 @@ export class UmbWebhookCollectionServerDataSource implements UmbWebhookCollectio return model; }); - return { data: { items, total: data.items.length } }; + return { data: { items, total: data.total } }; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/types.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/types.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/types.ts index fc7ef64ca7..4482deba59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/types.ts @@ -1,4 +1,4 @@ export interface UmbWebhookCollectionFilterModel { skip?: number; take?: number; -} +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/column-layouts/content-type/webhook-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/column-layouts/content-type/webhook-table-name-column-layout.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/column-layouts/content-type/webhook-table-name-column-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/column-layouts/content-type/webhook-table-name-column-layout.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/column-layouts/name/webhook-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/column-layouts/name/webhook-table-name-column-layout.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/column-layouts/name/webhook-table-name-column-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/column-layouts/name/webhook-table-name-column-layout.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/webhook-table-collection-view.element.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/webhook-table-collection-view.element.ts index b731b164cb..318acd492e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/collection/views/table/webhook-table-collection-view.element.ts @@ -17,15 +17,6 @@ export class UmbWebhookTableCollectionViewElement extends UmbLitElement { @state() private _tableColumns: Array = [ - { - name: this.localize.term('general_name'), - alias: 'name', - elementName: 'umb-webhook-table-name-column-layout', - }, - { - name: this.localize.term('webhooks_enabled'), - alias: 'enabled', - }, { name: this.localize.term('webhooks_url'), alias: 'url', @@ -36,9 +27,13 @@ export class UmbWebhookTableCollectionViewElement extends UmbLitElement { }, { name: this.localize.term('webhooks_types'), - alias: 'types', + alias: 'contentTypes', elementName: 'umb-webhook-table-content-type-column-layout', }, + { + name: this.localize.term('general_status'), + alias: 'status', + }, { name: '', alias: 'entityActions', @@ -50,10 +45,15 @@ export class UmbWebhookTableCollectionViewElement extends UmbLitElement { private _tableItems: Array = []; #collectionContext?: UmbDefaultCollectionContext; + #enabledLabel: string; + #disabledLabel: string; constructor() { super(); + this.#enabledLabel = this.localize.term('webhooks_enabled'); + this.#disabledLabel = this.localize.term('webhooks_disabled'); + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); @@ -66,32 +66,29 @@ export class UmbWebhookTableCollectionViewElement extends UmbLitElement { } #createTableItems(webhooks: Array) { - this._tableItems = webhooks.map((webhook, index) => { + this._tableItems = webhooks.map((webhook) => { return { id: webhook.unique, icon: 'icon-webhook', data: [ - { - columnAlias: 'name', - value: { name: `Webhook ${index + 1}`, unique: webhook.unique }, - }, { columnAlias: 'url', - value: webhook.url, - path: webhook.url, - }, - { - columnAlias: 'enabled', - value: html``, + value: html`${webhook.url}`, }, { columnAlias: 'events', value: webhook.events.map((event) => event.eventName).join(', ') || 'None', }, { - columnAlias: 'types', + columnAlias: 'contentTypes', value: { contentTypeName: webhook.events[0].eventType, contentTypes: webhook.contentTypes }, }, + { + columnAlias: 'status', + value: html`${webhook.enabled ? this.#enabledLabel : this.#disabledLabel}`, + }, { columnAlias: 'entityActions', value: html` = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/index.ts new file mode 100644 index 0000000000..6cb335f36a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/index.ts @@ -0,0 +1,2 @@ +export * from './collection/index.js'; +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/manifests.ts new file mode 100644 index 0000000000..fab7d47a83 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/manifests.ts @@ -0,0 +1,11 @@ +import { manifests as collectionManifests } from './collection/manifests.js'; +import { manifests as entityActionManifests } from './entity-actions/manifests.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; + +export const manifests: Array = [ + ...collectionManifests, + ...entityActionManifests, + ...repositoryManifests, + ...workspaceManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/constants.ts similarity index 66% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/constants.ts index bffbeaf542..4cae00f6dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/constants.ts @@ -1,3 +1,2 @@ export * from './item/constants.js'; -export * from './event/constants.js'; export * from './detail/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.repository.ts similarity index 64% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.repository.ts index f1495a286b..eb11fed0dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.repository.ts @@ -1,6 +1,7 @@ -import type { UmbWebhookDetailModel } from '../../types.js'; +import type { UmbWebhookDetailModel } from '../../../types.js'; import { UmbWebhookDetailServerDataSource } from './webhook-detail.server.data-source.js'; import { UMB_WEBHOOK_DETAIL_STORE_CONTEXT } from './webhook-detail.store.js'; +import { UmbDeprecation } from '@umbraco-cms/backoffice/utils'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository'; @@ -13,8 +14,17 @@ export class UmbWebhookDetailRepository extends UmbDetailRepositoryBase} - Hardcoded events + */ async requestEvents(): Promise<{ data: { items: string[]; total: number }; error: any }> { - //TODO Use service when available + new UmbDeprecation({ + deprecated: 'The requestEvents method on the UmbWebhookDetailRepository is deprecated.', + removeInVersion: '17', + solution: 'Use the requestEvents method on UmbWebhookEventRepository instead.', + }).warn(); const items = ['Content Deleted', 'Content Published', 'Content Unpublished', 'Media Deleted', 'Media Saved']; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.server.data-source.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.server.data-source.ts index 212cb9c2b7..d1dc7b4538 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.server.data-source.ts @@ -1,5 +1,5 @@ -import type { UmbWebhookDetailModel } from '../../types.js'; -import { UMB_WEBHOOK_ENTITY_TYPE } from '../../entity.js'; +import type { UmbWebhookDetailModel } from '../../../types.js'; +import { UMB_WEBHOOK_ENTITY_TYPE } from '../../../entity.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.store.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.store.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.store.ts index b80fc36b2e..eddbd835e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/detail/webhook-detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/detail/webhook-detail.store.ts @@ -1,4 +1,4 @@ -import type { UmbWebhookDetailModel } from '../../types.js'; +import type { UmbWebhookDetailModel } from '../../../types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbDetailStoreBase } from '@umbraco-cms/backoffice/store'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/index.ts new file mode 100644 index 0000000000..e94276bc0a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/index.ts @@ -0,0 +1,2 @@ +export * from './detail/index.js'; +export * from './item/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/types.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/types.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/webhook-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/webhook-item.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/webhook-item.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/webhook-item.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/webhook-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/webhook-item.server.data-source.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/webhook-item.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/webhook-item.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/webhook-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/webhook-item.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/item/webhook-item.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/item/webhook-item.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/manifests.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/repository/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/manifests.ts index da38afdfcd..4dfb0c911f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/repository/manifests.ts @@ -1,5 +1,4 @@ import { manifests as detailManifests } from './detail/manifests.js'; -import { manifests as eventManifests } from './event/manifests.js'; import { manifests as itemManifests } from './item/manifests.js'; -export const manifests: Array = [...detailManifests, ...eventManifests, ...itemManifests]; +export const manifests: Array = [...detailManifests, ...itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/types.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/types.ts new file mode 100644 index 0000000000..e0ca6fec9f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/types.ts @@ -0,0 +1,14 @@ +import type { UmbWebhookEntityType } from '../entity.js'; +import type { UmbWebhookEventModel } from '../webhook-event/types.js'; + +export type * from './collection/types.js'; + +export interface UmbWebhookDetailModel { + entityType: UmbWebhookEntityType; + headers: Record; + unique: string; + enabled: boolean; + url: string; + events: Array; + contentTypes: Array; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/manifests.ts similarity index 96% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/manifests.ts index da58546d92..43f583c939 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/manifests.ts @@ -19,8 +19,8 @@ export const manifests: Array = [ js: () => import('./views/webhook-details-workspace-view.element.js'), weight: 300, meta: { - label: 'Overview', - pathname: 'overview', + label: 'Details', + pathname: 'details', icon: 'icon-webhook', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/views/webhook-details-workspace-view.element.ts similarity index 90% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/views/webhook-details-workspace-view.element.ts index c727415667..88f302cca3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/views/webhook-details-workspace-view.element.ts @@ -1,6 +1,6 @@ import { UMB_WEBHOOK_WORKSPACE_CONTEXT } from '../webhook-workspace.context-token.js'; import type { UmbInputWebhookHeadersElement } from '../../../components/input-webhook-headers.element.js'; -import type { UmbInputWebhookEventsElement } from '../../../components/input-webhook-events.element.js'; +import type { UmbInputWebhookEventsElement } from '../../../webhook-event/input-webhook-events.element.js'; import { css, customElement, html, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -12,18 +12,18 @@ import type { UUIBooleanInputEvent, UUIInputEvent } from '@umbraco-cms/backoffic import '@umbraco-cms/backoffice/culture'; import '../../../components/input-webhook-headers.element.js'; -import '../../../components/input-webhook-events.element.js'; +import '../../../webhook-event/input-webhook-events.element.js'; @customElement('umb-webhook-details-workspace-view') export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement implements UmbWorkspaceViewElement { @state() - _webhook?: UmbWebhookDetailModel; + private _webhook?: UmbWebhookDetailModel; @state() - _isNew?: boolean; + private _isNew?: boolean; @state() - contentType?: string; + private _contentType?: string; #webhookWorkspaceContext?: typeof UMB_WEBHOOK_WORKSPACE_CONTEXT.TYPE; @@ -34,7 +34,7 @@ export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement impleme this.#webhookWorkspaceContext = instance; this.observe(this.#webhookWorkspaceContext.data, (webhook) => { this._webhook = webhook; - this.contentType = this._webhook?.events[0]?.eventType ?? undefined; + this._contentType = this._webhook?.events[0]?.eventType ?? undefined; }); this.observe(this.#webhookWorkspaceContext.isNew, (isNew) => { this._isNew = isNew; @@ -44,7 +44,7 @@ export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement impleme #onEventsChange(event: UmbChangeEvent & { target: UmbInputWebhookEventsElement }) { const events = event.target.events ?? []; - if (events.length && events[0].eventType !== this.contentType) { + if (events.length && events[0].eventType !== this._contentType) { this.#webhookWorkspaceContext?.setTypes([]); } this.#webhookWorkspaceContext?.setEvents(events); @@ -71,7 +71,7 @@ export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement impleme this.#webhookWorkspaceContext?.setEnabled(event.target.checked); } #renderContentTypePicker() { - if (this.contentType !== 'Content' && this.contentType !== 'Media') return nothing; + if (this._contentType !== 'Content' && this._contentType !== 'Media') return nothing; return html` { + this.#workspaceContext = context; + this.observe(this.#workspaceContext.isNew, (isNew) => (this._isNew = isNew)); + this.observe(this.#workspaceContext.url, (url) => (this._url = url)); + }); + } + + override render() { + return html` + + ${this._isNew ? html`

Add Webhook

` : html`

${this._url}

`} +
+ `; + } + + static override styles = [UmbTextStyles]; +} + +export default UmbWebhookWorkspaceEditorElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-webhook-workspace-editor': UmbWebhookWorkspaceEditorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context-token.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace.context.ts new file mode 100644 index 0000000000..fbd96f253d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/webhook/workspace/webhook-workspace.context.ts @@ -0,0 +1,150 @@ +import type { UmbWebhookDetailRepository } from '../repository/index.js'; +import { UMB_WEBHOOK_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_WEBHOOK_ENTITY_TYPE, UMB_WEBHOOK_ROOT_ENTITY_TYPE, UMB_WEBHOOK_WORKSPACE_ALIAS } from '../../entity.js'; +import type { UmbWebhookDetailModel } from '../types.js'; +import type { UmbWebhookEventModel } from '../../webhook-event/types.js'; +import { UmbWebhookWorkspaceEditorElement } from './webhook-workspace-editor.element.js'; +import { + type UmbSubmittableWorkspaceContext, + UmbWorkspaceIsNewRedirectController, + type UmbRoutableWorkspaceContext, + UmbEntityDetailWorkspaceContextBase, + UmbWorkspaceIsNewRedirectControllerAlias, +} from '@umbraco-cms/backoffice/workspace'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbWebhookWorkspaceContext + extends UmbEntityDetailWorkspaceContextBase + implements UmbSubmittableWorkspaceContext, UmbRoutableWorkspaceContext +{ + // Observable states + readonly headers = this._data.createObservablePartOfCurrent((data) => data?.headers); + readonly enabled = this._data.createObservablePartOfCurrent((data) => data?.enabled); + readonly url = this._data.createObservablePartOfCurrent((data) => data?.url); + readonly events = this._data.createObservablePartOfCurrent((data) => data?.events); + readonly contentTypes = this._data.createObservablePartOfCurrent((data) => data?.contentTypes); + + constructor(host: UmbControllerHost) { + super(host, { + workspaceAlias: UMB_WEBHOOK_WORKSPACE_ALIAS, + entityType: UMB_WEBHOOK_ENTITY_TYPE, + detailRepositoryAlias: UMB_WEBHOOK_DETAIL_REPOSITORY_ALIAS, + }); + + this.routes.setRoutes([ + { + path: 'create', + component: UmbWebhookWorkspaceEditorElement, + setup: async () => { + await this.createScaffold({ parent: { entityType: UMB_WEBHOOK_ROOT_ENTITY_TYPE, unique: null } }); + + new UmbWorkspaceIsNewRedirectController( + this, + this, + this.getHostElement().shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, + { + path: 'edit/:unique', + component: UmbWebhookWorkspaceEditorElement, + setup: (_component, info) => { + this.removeUmbControllerByAlias(UmbWorkspaceIsNewRedirectControllerAlias); + this.load(info.match.params.unique); + }, + }, + ]); + } + + /** + * Sets the events + * @param {Array} events - The events + * @memberof UmbWebhookWorkspaceContext + */ + setEvents(events: Array) { + this._data.updateCurrent({ events }); + } + + /** + * Gets the events + * @returns {Array} + * @memberof UmbWebhookWorkspaceContext + */ + getEvents(): Array | undefined { + return this._data.getCurrent()?.events; + } + + /** + * Sets the headers + * @param {{ [key: string]: string }} headers - The headers + * @memberof UmbWebhookWorkspaceContext + */ + setHeaders(headers: { [key: string]: string }) { + this._data.updateCurrent({ headers }); + } + + /** + * Gets the headers + * @returns {UmbWebhookDetailModel['headers']} - The headers + * @memberof UmbWebhookWorkspaceContext + */ + getHeaders(): UmbWebhookDetailModel['headers'] | undefined { + return this._data.getCurrent()?.headers; + } + + /** + * Sets the content types + * @param {string[]} types - The content types + * @memberof UmbWebhookWorkspaceContext + */ + setTypes(types: string[]) { + this._data.updateCurrent({ contentTypes: types }); + } + + /** + * Gets the content types + * @returns {string[]} - The content types + * @memberof UmbWebhookWorkspaceContext + */ + getTypes(): string[] | undefined { + return this._data.getCurrent()?.contentTypes; + } + + /** + * Sets the URL + * @param {string} url - The URL + * @memberof UmbWebhookWorkspaceContext + */ + setUrl(url: string) { + this._data.updateCurrent({ url }); + } + + /** + * Gets the URL + * @returns {string} - The URL + * @memberof UmbWebhookWorkspaceContext + */ + getUrl(): string | undefined { + return this._data.getCurrent()?.url; + } + + /** + * Sets the enabled state + * @param {boolean} enabled - The enabled state + * @memberof UmbWebhookWorkspaceContext + */ + setEnabled(enabled: boolean) { + this._data.updateCurrent({ enabled }); + } + + /** + * Gets the enabled state + * @returns {boolean} - The enabled state + * @memberof UmbWebhookWorkspaceContext + */ + getEnabled(): boolean | undefined { + return this._data.getCurrent()?.enabled; + } +} + +export { UmbWebhookWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/constants.ts deleted file mode 100644 index f6b0d77c62..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './webhook/constants.js'; -export * from './webhook-root/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/manifests.ts deleted file mode 100644 index 144c13d7ed..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/manifests.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { manifests as webhookManifests } from './webhook/manifests.js'; -import { manifests as webhookRootManifests } from './webhook-root/manifests.js'; - -export const manifests: Array = [...webhookManifests, ...webhookRootManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace-editor.element.ts deleted file mode 100644 index 6532bb03aa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace-editor.element.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -@customElement('umb-webhook-workspace-editor') -export class UmbWebhookWorkspaceEditorElement extends UmbLitElement { - override render() { - return html` - - `; - } - - static override styles = [UmbTextStyles]; -} - -export default UmbWebhookWorkspaceEditorElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-webhook-workspace-editor': UmbWebhookWorkspaceEditorElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts deleted file mode 100644 index 67da34f9a9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { UmbWebhookDetailModel, UmbWebhookEventModel } from '../../types.js'; -import type { UmbWebhookDetailRepository } from '../../repository/index.js'; -import { UMB_WEBHOOK_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_WEBHOOK_ENTITY_TYPE, UMB_WEBHOOK_ROOT_ENTITY_TYPE, UMB_WEBHOOK_WORKSPACE_ALIAS } from '../../entity.js'; -import { UmbWebhookWorkspaceEditorElement } from './webhook-workspace-editor.element.js'; -import { - type UmbSubmittableWorkspaceContext, - UmbWorkspaceIsNewRedirectController, - type UmbRoutableWorkspaceContext, - UmbEntityDetailWorkspaceContextBase, - UmbWorkspaceIsNewRedirectControllerAlias, -} from '@umbraco-cms/backoffice/workspace'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -export class UmbWebhookWorkspaceContext - extends UmbEntityDetailWorkspaceContextBase - implements UmbSubmittableWorkspaceContext, UmbRoutableWorkspaceContext -{ - constructor(host: UmbControllerHost) { - super(host, { - workspaceAlias: UMB_WEBHOOK_WORKSPACE_ALIAS, - entityType: UMB_WEBHOOK_ENTITY_TYPE, - detailRepositoryAlias: UMB_WEBHOOK_DETAIL_REPOSITORY_ALIAS, - }); - - this.routes.setRoutes([ - { - path: 'create', - component: UmbWebhookWorkspaceEditorElement, - setup: async () => { - await this.createScaffold({ parent: { entityType: UMB_WEBHOOK_ROOT_ENTITY_TYPE, unique: null } }); - - new UmbWorkspaceIsNewRedirectController( - this, - this, - this.getHostElement().shadowRoot!.querySelector('umb-router-slot')!, - ); - }, - }, - { - path: 'edit/:unique', - component: UmbWebhookWorkspaceEditorElement, - setup: (_component, info) => { - this.removeUmbControllerByAlias(UmbWorkspaceIsNewRedirectControllerAlias); - this.load(info.match.params.unique); - }, - }, - ]); - } - - setEvents(events: Array) { - this._data.updateCurrent({ events }); - } - - setHeaders(headers: { [key: string]: string }) { - this._data.updateCurrent({ headers }); - } - - setTypes(types: string[]) { - this._data.updateCurrent({ contentTypes: types }); - } - - setUrl(url: string) { - this._data.updateCurrent({ url }); - } - - setEnabled(enabled: boolean) { - this._data.updateCurrent({ enabled }); - } -} - -export { UmbWebhookWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts index 81387d9cc9..66fb3000df 100644 --- a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts +++ b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts @@ -420,7 +420,7 @@ export const foundConsts = [{ }, { path: '@umbraco-cms/backoffice/webhook', - consts: ["UMB_WEBHOOK_COLLECTION_ALIAS","UMB_WEBHOOK_COLLECTION_REPOSITORY_ALIAS","UMB_WEBHOOK_TABLE_COLLECTION_VIEW_ALIAS","UMB_WEBHOOK_EVENTS_MODAL","UMB_WEBHOOK_WORKSPACE_ALIAS","UMB_WEBHOOK_WORKSPACE","UMB_WEBHOOK_ENTITY_TYPE","UMB_WEBHOOK_ROOT_ENTITY_TYPE","UMB_WEBHOOK_DETAIL_REPOSITORY_ALIAS","UMB_WEBHOOK_DETAIL_STORE_ALIAS","UMB_WEBHOOK_DETAIL_STORE_CONTEXT","UMB_WEBHOOK_EVENT_REPOSITORY_ALIAS","UMB_WEBHOOK_EVENT_STORE_ALIAS","UMB_WEBHOOK_EVENT_STORE_CONTEXT","UMB_WEBHOOK_ITEM_REPOSITORY_ALIAS","UMB_WEBHOOK_STORE_ALIAS","UMB_WEBHOOK_ITEM_STORE_CONTEXT","UMB_WEBHOOK_WORKSPACE_CONTEXT","UMB_WEBHOOK_ROOT_WORKSPACE_ALIAS"] + consts: ["UMB_WEBHOOK_WORKSPACE_ALIAS","UMB_WEBHOOK_WORKSPACE","UMB_WEBHOOK_ENTITY_TYPE","UMB_WEBHOOK_ROOT_ENTITY_TYPE","UMB_WEBHOOK_DELIVERY_ENTITY_TYPE","UMB_WEBHOOK_COLLECTION_ALIAS","UMB_WEBHOOK_COLLECTION_REPOSITORY_ALIAS","UMB_WEBHOOK_TABLE_COLLECTION_VIEW_ALIAS","UMB_WEBHOOK_DETAIL_REPOSITORY_ALIAS","UMB_WEBHOOK_DETAIL_STORE_ALIAS","UMB_WEBHOOK_DETAIL_STORE_CONTEXT","UMB_WEBHOOK_ITEM_REPOSITORY_ALIAS","UMB_WEBHOOK_STORE_ALIAS","UMB_WEBHOOK_ITEM_STORE_CONTEXT","UMB_WEBHOOK_WORKSPACE_CONTEXT","UMB_WEBHOOK_DELIVERY_COLLECTION_ALIAS","UMB_WEBHOOK_DELIVERY_COLLECTION_REPOSITORY_ALIAS","UMB_WEBHOOK_EVENTS_MODAL","UMB_WEBHOOK_EVENT_REPOSITORY_ALIAS","UMB_WEBHOOK_EVENT_STORE_ALIAS","UMB_WEBHOOK_EVENT_STORE_CONTEXT","UMB_WEBHOOK_ROOT_WORKSPACE_ALIAS"] }, { path: '@umbraco-cms/backoffice/workspace', diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/WebhookLogServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/WebhookLogServiceTests.cs index 626e1f8b59..12d0a234ca 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/WebhookLogServiceTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/WebhookLogServiceTests.cs @@ -1,4 +1,4 @@ -using System.Globalization; +using System.Globalization; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; @@ -18,6 +18,7 @@ public class WebhookLogServiceTests : UmbracoIntegrationTest [Test] public async Task Can_Create_And_Get() { + var webHookKey = Guid.NewGuid(); var createdWebhookLog = await WebhookLogService.CreateAsync(new WebhookLog { Date = DateTime.UtcNow, @@ -27,24 +28,32 @@ public class WebhookLogServiceTests : UmbracoIntegrationTest StatusCode = "200", RetryCount = 0, Key = Guid.NewGuid(), + WebhookKey = webHookKey }); - var webhookLogsPaged = await WebhookLogService.Get(); + var allWebhookLogsPaged = await WebhookLogService.Get(); + var specificWebhookLogsPaged = await WebhookLogService.Get(webHookKey); Assert.Multiple(() => { - Assert.IsNotNull(webhookLogsPaged); - Assert.IsNotEmpty(webhookLogsPaged.Items); - Assert.AreEqual(1, webhookLogsPaged.Items.Count()); - var webhookLog = webhookLogsPaged.Items.First(); - Assert.AreEqual(createdWebhookLog.Date.ToString(CultureInfo.InvariantCulture), webhookLog.Date.ToString(CultureInfo.InvariantCulture)); - Assert.AreEqual(createdWebhookLog.EventAlias, webhookLog.EventAlias); - Assert.AreEqual(createdWebhookLog.RequestBody, webhookLog.RequestBody); - Assert.AreEqual(createdWebhookLog.ResponseBody, webhookLog.ResponseBody); - Assert.AreEqual(createdWebhookLog.StatusCode, webhookLog.StatusCode); - Assert.AreEqual(createdWebhookLog.RetryCount, webhookLog.RetryCount); - Assert.AreEqual(createdWebhookLog.Key, webhookLog.Key); + AssertGetResult(createdWebhookLog, allWebhookLogsPaged); + AssertGetResult(createdWebhookLog, specificWebhookLogsPaged); + + static void AssertGetResult(WebhookLog createdWebhookLog, PagedModel allWebhookLogsPaged) + { + Assert.IsNotNull(allWebhookLogsPaged); + Assert.IsNotEmpty(allWebhookLogsPaged.Items); + Assert.AreEqual(1, allWebhookLogsPaged.Items.Count()); + var webhookLog = allWebhookLogsPaged.Items.First(); + Assert.AreEqual(createdWebhookLog.Date.ToString(CultureInfo.InvariantCulture), webhookLog.Date.ToString(CultureInfo.InvariantCulture)); + Assert.AreEqual(createdWebhookLog.EventAlias, webhookLog.EventAlias); + Assert.AreEqual(createdWebhookLog.RequestBody, webhookLog.RequestBody); + Assert.AreEqual(createdWebhookLog.ResponseBody, webhookLog.ResponseBody); + Assert.AreEqual(createdWebhookLog.StatusCode, webhookLog.StatusCode); + Assert.AreEqual(createdWebhookLog.RetryCount, webhookLog.RetryCount); + Assert.AreEqual(createdWebhookLog.Key, webhookLog.Key); + } }); } }