Skip to content

Commit 1c68e3d

Browse files
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 <[email protected]>
1 parent deca4c8 commit 1c68e3d

File tree

111 files changed

+1104
-251
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+1104
-251
lines changed

src/Umbraco.Cms.Api.Management/Controllers/Webhook/AllWebhookController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public async Task<ActionResult<PagedViewModel<WebhookResponseModel>>> All(
3434
var viewModel = new PagedViewModel<WebhookResponseModel>
3535
{
3636
Total = result.Total,
37-
Items = webhooks.Select(x => _webhookPresentationFactory.CreateResponseModel(x)),
37+
Items = webhooks.Select(_webhookPresentationFactory.CreateResponseModel),
3838
};
3939

4040
return Ok(viewModel);

src/Umbraco.Cms.Api.Management/Controllers/Webhook/Logs/AllWebhookLogController.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
using Asp.Versioning;
1+
using Asp.Versioning;
22
using Microsoft.AspNetCore.Http;
33
using Microsoft.AspNetCore.Mvc;
4+
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
45
using Umbraco.Cms.Api.Management.Factories;
5-
using Umbraco.Cms.Api.Management.ViewModels.Webhook;
66
using Umbraco.Cms.Api.Management.ViewModels.Webhook.Logs;
77
using Umbraco.Cms.Core.Models;
88
using Umbraco.Cms.Core.Services;
@@ -23,12 +23,11 @@ public AllWebhookLogController(IWebhookLogService webhookLogService, IWebhookPre
2323

2424
[HttpGet("logs")]
2525
[MapToApiVersion("1.0")]
26-
[ProducesResponseType(typeof(WebhookResponseModel), StatusCodes.Status200OK)]
27-
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
26+
[ProducesResponseType(typeof(PagedViewModel<WebhookLogResponseModel>), StatusCodes.Status200OK)]
2827
public async Task<IActionResult> Logs(CancellationToken cancellationToken, int skip = 0, int take = 100)
2928
{
3029
PagedModel<WebhookLog> logs = await _webhookLogService.Get(skip, take);
31-
IEnumerable<WebhookLogResponseModel> logResponseModels = logs.Items.Select(x => _webhookPresentationFactory.CreateResponseModel(x));
32-
return Ok(logResponseModels);
30+
PagedViewModel<WebhookLogResponseModel> viewModel = CreatePagedWebhookLogResponseModel(logs, _webhookPresentationFactory);
31+
return Ok(viewModel);
3332
}
3433
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
5+
using Umbraco.Cms.Api.Management.Factories;
6+
using Umbraco.Cms.Api.Management.ViewModels.Webhook.Logs;
7+
using Umbraco.Cms.Core.Models;
8+
using Umbraco.Cms.Core.Services;
9+
10+
namespace Umbraco.Cms.Api.Management.Controllers.Webhook.Logs;
11+
12+
[ApiVersion("1.0")]
13+
public class WebhookLogController : WebhookLogControllerBase
14+
{
15+
private readonly IWebhookLogService _webhookLogService;
16+
private readonly IWebhookPresentationFactory _webhookPresentationFactory;
17+
18+
public WebhookLogController(IWebhookLogService webhookLogService, IWebhookPresentationFactory webhookPresentationFactory)
19+
{
20+
_webhookLogService = webhookLogService;
21+
_webhookPresentationFactory = webhookPresentationFactory;
22+
}
23+
24+
[HttpGet("{id:guid}/logs")]
25+
[MapToApiVersion("1.0")]
26+
[ProducesResponseType(typeof(PagedViewModel<WebhookLogResponseModel>), StatusCodes.Status200OK)]
27+
public async Task<IActionResult> Logs(CancellationToken cancellationToken, Guid id, int skip = 0, int take = 100)
28+
{
29+
PagedModel<WebhookLog> logs = await _webhookLogService.Get(id, skip, take);
30+
PagedViewModel<WebhookLogResponseModel> viewModel = CreatePagedWebhookLogResponseModel(logs, _webhookPresentationFactory);
31+
return Ok(viewModel);
32+
}
33+
}
Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
1-
using Microsoft.AspNetCore.Mvc;
1+
using Microsoft.AspNetCore.Mvc;
2+
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
3+
using Umbraco.Cms.Api.Management.Factories;
24
using Umbraco.Cms.Api.Management.Routing;
5+
using Umbraco.Cms.Api.Management.ViewModels.Webhook.Logs;
36
using Umbraco.Cms.Core;
7+
using Umbraco.Cms.Core.Models;
48

59
namespace Umbraco.Cms.Api.Management.Controllers.Webhook.Logs;
610

711
[VersionedApiBackOfficeRoute($"{Constants.UdiEntityType.Webhook}")]
812
[ApiExplorerSettings(GroupName = "Webhook")]
9-
public class WebhookLogControllerBase : ManagementApiControllerBase;
13+
public class WebhookLogControllerBase : ManagementApiControllerBase
14+
{
15+
protected PagedViewModel<WebhookLogResponseModel> CreatePagedWebhookLogResponseModel(PagedModel<WebhookLog> logs, IWebhookPresentationFactory webhookPresentationFactory)
16+
{
17+
WebhookLogResponseModel[] logResponseModels = logs.Items.Select(webhookPresentationFactory.CreateResponseModel).ToArray();
18+
19+
return new PagedViewModel<WebhookLogResponseModel>
20+
{
21+
Total = logs.Total,
22+
Items = logResponseModels,
23+
};
24+
}
25+
26+
}

src/Umbraco.Cms.Api.Management/OpenApi.json

Lines changed: 147 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33846,13 +33846,22 @@
3384633846
]
3384733847
}
3384833848
},
33849-
"/umbraco/management/api/v1/webhook/events": {
33849+
"/umbraco/management/api/v1/webhook/{id}/logs": {
3385033850
"get": {
3385133851
"tags": [
3385233852
"Webhook"
3385333853
],
33854-
"operationId": "GetWebhookEvents",
33854+
"operationId": "GetWebhookByIdLogs",
3385533855
"parameters": [
33856+
{
33857+
"name": "id",
33858+
"in": "path",
33859+
"required": true,
33860+
"schema": {
33861+
"type": "string",
33862+
"format": "uuid"
33863+
}
33864+
},
3385633865
{
3385733866
"name": "skip",
3385833867
"in": "query",
@@ -33880,7 +33889,7 @@
3388033889
"schema": {
3388133890
"oneOf": [
3388233891
{
33883-
"$ref": "#/components/schemas/PagedWebhookEventModel"
33892+
"$ref": "#/components/schemas/PagedWebhookLogResponseModel"
3388433893
}
3388533894
]
3388633895
}
@@ -33889,9 +33898,6 @@
3388933898
},
3389033899
"401": {
3389133900
"description": "The resource is protected and requires an authentication token"
33892-
},
33893-
"403": {
33894-
"description": "The authenticated user do not have access to this resource"
3389533901
}
3389633902
},
3389733903
"security": [
@@ -33901,12 +33907,12 @@
3390133907
]
3390233908
}
3390333909
},
33904-
"/umbraco/management/api/v1/webhook/logs": {
33910+
"/umbraco/management/api/v1/webhook/events": {
3390533911
"get": {
3390633912
"tags": [
3390733913
"Webhook"
3390833914
],
33909-
"operationId": "GetWebhookLogs",
33915+
"operationId": "GetWebhookEvents",
3391033916
"parameters": [
3391133917
{
3391233918
"name": "skip",
@@ -33935,21 +33941,62 @@
3393533941
"schema": {
3393633942
"oneOf": [
3393733943
{
33938-
"$ref": "#/components/schemas/WebhookResponseModel"
33944+
"$ref": "#/components/schemas/PagedWebhookEventModel"
3393933945
}
3394033946
]
3394133947
}
3394233948
}
3394333949
}
3394433950
},
33945-
"404": {
33946-
"description": "Not Found",
33951+
"401": {
33952+
"description": "The resource is protected and requires an authentication token"
33953+
},
33954+
"403": {
33955+
"description": "The authenticated user do not have access to this resource"
33956+
}
33957+
},
33958+
"security": [
33959+
{
33960+
"Backoffice User": [ ]
33961+
}
33962+
]
33963+
}
33964+
},
33965+
"/umbraco/management/api/v1/webhook/logs": {
33966+
"get": {
33967+
"tags": [
33968+
"Webhook"
33969+
],
33970+
"operationId": "GetWebhookLogs",
33971+
"parameters": [
33972+
{
33973+
"name": "skip",
33974+
"in": "query",
33975+
"schema": {
33976+
"type": "integer",
33977+
"format": "int32",
33978+
"default": 0
33979+
}
33980+
},
33981+
{
33982+
"name": "take",
33983+
"in": "query",
33984+
"schema": {
33985+
"type": "integer",
33986+
"format": "int32",
33987+
"default": 100
33988+
}
33989+
}
33990+
],
33991+
"responses": {
33992+
"200": {
33993+
"description": "OK",
3394733994
"content": {
3394833995
"application/json": {
3394933996
"schema": {
3395033997
"oneOf": [
3395133998
{
33952-
"$ref": "#/components/schemas/ProblemDetails"
33999+
"$ref": "#/components/schemas/PagedWebhookLogResponseModel"
3395334000
}
3395434001
]
3395534002
}
@@ -42320,6 +42367,30 @@
4232042367
},
4232142368
"additionalProperties": false
4232242369
},
42370+
"PagedWebhookLogResponseModel": {
42371+
"required": [
42372+
"items",
42373+
"total"
42374+
],
42375+
"type": "object",
42376+
"properties": {
42377+
"total": {
42378+
"type": "integer",
42379+
"format": "int64"
42380+
},
42381+
"items": {
42382+
"type": "array",
42383+
"items": {
42384+
"oneOf": [
42385+
{
42386+
"$ref": "#/components/schemas/WebhookLogResponseModel"
42387+
}
42388+
]
42389+
}
42390+
}
42391+
},
42392+
"additionalProperties": false
42393+
},
4232342394
"PagedWebhookResponseModel": {
4232442395
"required": [
4232542396
"items",
@@ -46190,6 +46261,70 @@
4619046261
},
4619146262
"additionalProperties": false
4619246263
},
46264+
"WebhookLogResponseModel": {
46265+
"required": [
46266+
"date",
46267+
"eventAlias",
46268+
"exceptionOccured",
46269+
"isSuccessStatusCode",
46270+
"key",
46271+
"requestBody",
46272+
"requestHeaders",
46273+
"responseBody",
46274+
"responseHeaders",
46275+
"retryCount",
46276+
"statusCode",
46277+
"url",
46278+
"webhookKey"
46279+
],
46280+
"type": "object",
46281+
"properties": {
46282+
"key": {
46283+
"type": "string",
46284+
"format": "uuid"
46285+
},
46286+
"webhookKey": {
46287+
"type": "string",
46288+
"format": "uuid"
46289+
},
46290+
"statusCode": {
46291+
"type": "string"
46292+
},
46293+
"isSuccessStatusCode": {
46294+
"type": "boolean"
46295+
},
46296+
"date": {
46297+
"type": "string",
46298+
"format": "date-time"
46299+
},
46300+
"eventAlias": {
46301+
"type": "string"
46302+
},
46303+
"url": {
46304+
"type": "string"
46305+
},
46306+
"retryCount": {
46307+
"type": "integer",
46308+
"format": "int32"
46309+
},
46310+
"requestHeaders": {
46311+
"type": "string"
46312+
},
46313+
"requestBody": {
46314+
"type": "string"
46315+
},
46316+
"responseHeaders": {
46317+
"type": "string"
46318+
},
46319+
"responseBody": {
46320+
"type": "string"
46321+
},
46322+
"exceptionOccured": {
46323+
"type": "boolean"
46324+
}
46325+
},
46326+
"additionalProperties": false
46327+
},
4619346328
"WebhookResponseModel": {
4619446329
"required": [
4619546330
"contentTypeKeys",

src/Umbraco.Core/Persistence/Repositories/IWebhookLogRepository.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Umbraco.Cms.Core.Models;
1+
using Umbraco.Cms.Core.Models;
22

33
namespace Umbraco.Cms.Core.Persistence.Repositories;
44

@@ -8,6 +8,17 @@ public interface IWebhookLogRepository
88

99
Task<PagedModel<WebhookLog>> GetPagedAsync(int skip, int take);
1010

11+
// TODO (V16): Remove the default implementation on this method.
12+
async Task<PagedModel<WebhookLog>> GetPagedAsync(Guid webhookKey, int skip, int take)
13+
{
14+
// This is very inefficient as the filter/skip/take is in-memory, but it will return the correct data.
15+
// As it's only here to avoid a breaking change on the interface that is unlikely to have a custom
16+
// implementation, this seems reasonable.
17+
PagedModel<WebhookLog> allLogs = await GetPagedAsync(0, int.MaxValue);
18+
var logsForId = allLogs.Items.Where(x => x.WebhookKey == webhookKey).ToList();
19+
return new PagedModel<WebhookLog>(logsForId.Count, logsForId.Skip(skip).Take(take));
20+
}
21+
1122
Task<IEnumerable<WebhookLog>> GetOlderThanDate(DateTime date);
1223

1324
Task DeleteByIds(int[] ids);
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Umbraco.Cms.Core.Models;
2-
using Umbraco.Cms.Core.Webhooks;
1+
using Umbraco.Cms.Core.Models;
32

43
namespace Umbraco.Cms.Core.Services;
54

@@ -8,4 +7,15 @@ public interface IWebhookLogService
87
Task<WebhookLog> CreateAsync(WebhookLog webhookLog);
98

109
Task<PagedModel<WebhookLog>> Get(int skip = 0, int take = int.MaxValue);
10+
11+
// TODO (V16): Remove the default implementation on this method.
12+
async Task<PagedModel<WebhookLog>> Get(Guid webhookKey, int skip = 0, int take = int.MaxValue)
13+
{
14+
// This is very inefficient as the filter/skip/take is in-memory, but it will return the correct data.
15+
// As it's only here to avoid a breaking change on the interface that is unlikely to have a custom
16+
// implementation, this seems reasonable.
17+
PagedModel<WebhookLog> allLogs = await Get(0, int.MaxValue);
18+
var logsForId = allLogs.Items.Where(x => x.WebhookKey == webhookKey).ToList();
19+
return new PagedModel<WebhookLog>(logsForId.Count, logsForId.Skip(skip).Take(take));
20+
}
1121
}

src/Umbraco.Core/Services/WebhookLogService.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
using Umbraco.Cms.Core.Models;
1+
using Umbraco.Cms.Core.Models;
22
using Umbraco.Cms.Core.Persistence.Repositories;
33
using Umbraco.Cms.Core.Scoping;
4-
using Umbraco.Cms.Core.Webhooks;
54

65
namespace Umbraco.Cms.Core.Services;
76

@@ -30,4 +29,10 @@ public async Task<PagedModel<WebhookLog>> Get(int skip = 0, int take = int.MaxVa
3029
using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true);
3130
return await _webhookLogRepository.GetPagedAsync(skip, take);
3231
}
32+
33+
public async Task<PagedModel<WebhookLog>> Get(Guid webhookKey, int skip = 0, int take = int.MaxValue)
34+
{
35+
using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true);
36+
return await _webhookLogRepository.GetPagedAsync(webhookKey, skip, take);
37+
}
3338
}

0 commit comments

Comments
 (0)