diff --git a/src/Squidex.Domain.Apps.Read/Schemas/WebhookSender.cs b/src/Squidex.Domain.Apps.Read/Schemas/WebhookSender.cs index d60e340c5..1d94831a9 100644 --- a/src/Squidex.Domain.Apps.Read/Schemas/WebhookSender.cs +++ b/src/Squidex.Domain.Apps.Read/Schemas/WebhookSender.cs @@ -81,6 +81,7 @@ namespace Squidex.Domain.Apps.Read.Schemas }; request.Headers.Add("X-Signature", job.RequestSignature); + request.Headers.Add("User-Agent", "Squidex Webhook"); return request; } diff --git a/src/Squidex/Config/Domain/StoreMongoDbModule.cs b/src/Squidex/Config/Domain/StoreMongoDbModule.cs index e870e82ee..9cbced6ca 100644 --- a/src/Squidex/Config/Domain/StoreMongoDbModule.cs +++ b/src/Squidex/Config/Domain/StoreMongoDbModule.cs @@ -143,7 +143,13 @@ namespace Squidex.Config.Domain builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() - .As() + .As() + .AsSelf() + .SingleInstance(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) + .As() .As() .AsSelf() .SingleInstance(); @@ -172,13 +178,6 @@ namespace Squidex.Config.Domain .AsSelf() .SingleInstance(); - builder.RegisterType() - .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) - .As() - .As() - .As() - .AsSelf() - .SingleInstance(); builder.Register(c => new CompoundEventConsumer( diff --git a/src/Squidex/Controllers/Api/Webhooks/WebhooksController.cs b/src/Squidex/Controllers/Api/Webhooks/WebhooksController.cs index 1bc3d106f..21269b64c 100644 --- a/src/Squidex/Controllers/Api/Webhooks/WebhooksController.cs +++ b/src/Squidex/Controllers/Api/Webhooks/WebhooksController.cs @@ -99,9 +99,9 @@ namespace Squidex.Controllers.Api.Webhooks await CommandBus.PublishAsync(command); - var response = SimpleMapper.Map(command, new WebhookCreatedDto { SchemaId = command.SchemaId.Id.ToString() }; + var response = SimpleMapper.Map(command, new WebhookCreatedDto { SchemaId = command.SchemaId.Id.ToString() }); - return CreatedAtAction(nameof(GetWebhooks), new { app }, response)); + return CreatedAtAction(nameof(GetWebhooks), new { app }, response); } /// diff --git a/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.html b/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.html index 743015a63..c14a14686 100644 --- a/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.html +++ b/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.html @@ -1,6 +1,6 @@ - +
@@ -70,6 +70,8 @@ +

Last Request

+
{{event.result}} diff --git a/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.scss b/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.scss index 86e96ec20..57c1eb533 100644 --- a/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.scss +++ b/src/Squidex/app/features/webhooks/pages/webhook-events-page.component.scss @@ -1,6 +1,10 @@ @import '_vars'; @import '_mixins'; +h3 { + margin-bottom: 1rem; +} + .badge { & { @include border-radius(12px); diff --git a/src/Squidex/app/shared/services/webhooks.service.spec.ts b/src/Squidex/app/shared/services/webhooks.service.spec.ts index f5c89ba88..ec0c2587d 100644 --- a/src/Squidex/app/shared/services/webhooks.service.spec.ts +++ b/src/Squidex/app/shared/services/webhooks.service.spec.ts @@ -11,8 +11,11 @@ import { inject, TestBed } from '@angular/core/testing'; import { ApiUrlConfig, CreateWebhookDto, + DateTime, Version, WebhookDto, + WebhookEventDto, + WebhookEventsDto, WebhooksService } from './../'; @@ -99,16 +102,67 @@ describe('WebhooksService', () => { expect(webhook).toEqual(new WebhookDto('id1', 'schema1', 'token1', dto.url, 0, 0, 0, 0)); })); - it('should make delete request to delete webhook', + it('should make get request to get app webhook events', inject([WebhooksService, HttpTestingController], (webhooksService: WebhooksService, httpMock: HttpTestingController) => { - webhooksService.deleteWebhook('my-app', 'my-schema', '123', version).subscribe(); + let webhooks: WebhookEventsDto | null = null; - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/webhooks/123'); + webhooksService.getEvents('my-app', 10, 20).subscribe(result => { + webhooks = result; + }); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/webhooks/events?take=10&skip=20'); + + expect(req.request.method).toEqual('GET'); + + req.flush({ + total: 20, + items: [ + { + id: 'id1', + created: '2017-12-12T10:10', + eventName: 'event1', + nextAttempt: '2017-12-12T12:10', + jobResult: 'Failed', + lastDump: 'dump1', + numCalls: 1, + requestUrl: 'url1', + result: 'Failed' + }, + { + id: 'id2', + created: '2017-12-13T10:10', + eventName: 'event2', + nextAttempt: '2017-12-13T12:10', + jobResult: 'Failed', + lastDump: 'dump2', + numCalls: 2, + requestUrl: 'url2', + result: 'Failed' + } + ] + }); + + expect(webhooks).toEqual( + new WebhookEventsDto(20, [ + new WebhookEventDto('id1', + DateTime.parseISO_UTC('2017-12-12T10:10'), + DateTime.parseISO_UTC('2017-12-12T12:10'), + 'event1', 'url1', 'dump1', 'Failed', 'Failed', 1), + new WebhookEventDto('id2', + DateTime.parseISO_UTC('2017-12-13T10:10'), + DateTime.parseISO_UTC('2017-12-13T12:10'), + 'event2', 'url2', 'dump2', 'Failed', 'Failed', 2) + ])); + })); + + it('should make delete request to enqueue webhook event', + inject([WebhooksService, HttpTestingController], (webhooksService: WebhooksService, httpMock: HttpTestingController) => { + + webhooksService.enqueueEvent('my-app', '123').subscribe(); + + const req = httpMock.expectOne('http://service/p/api/apps/my-app/webhooks/events/123'); - req.flush({ id: 'id1', sharedSecret: 'token1' }); + expect(req.request.method).toEqual('PUT'); })); }); \ No newline at end of file