Browse Source

Fixes

pull/65/head
Sebastian Stehle 9 years ago
parent
commit
ed0d938d66
  1. 13
      src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventStore.cs
  2. 4
      src/Squidex/Controllers/Api/EventConsumers/Models/EventConsumerDto.cs
  3. 8
      src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.html
  4. 4
      src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.scss
  5. 6
      src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.ts
  6. 8
      src/Squidex/app/shared/services/event-consumers.service.spec.ts
  7. 8
      src/Squidex/app/shared/services/event-consumers.service.ts

13
src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventStore.cs

@ -110,20 +110,25 @@ namespace Squidex.Infrastructure.MongoDb.EventStore
await Collection.Find(filter).SortBy(x => x.Timestamp).ForEachAsync(async commit => await Collection.Find(filter).SortBy(x => x.Timestamp).ForEachAsync(async commit =>
{ {
var isGreaterTimestamp = commit.Timestamp > tokenTimestamp;
var eventStreamNumber = (int)commit.EventStreamOffset; var eventStreamNumber = (int)commit.EventStreamOffset;
foreach (var e in commit.Events) foreach (var e in commit.Events)
{ {
eventStreamNumber++; eventStreamNumber++;
if (eventStreamNumber > tokenEventStreamNumber) if (isGreaterTimestamp || eventStreamNumber > tokenEventStreamNumber)
{ {
var eventData = new EventData { EventId = e.EventId, Metadata = e.Metadata, Payload = e.Payload, Type = e.Type }; var eventData = new EventData { EventId = e.EventId, Metadata = e.Metadata, Payload = e.Payload, Type = e.Type };
var eventToken = CreateToken(commit.Timestamp, eventStreamNumber); var eventToken = CreateToken(commit.Timestamp, eventStreamNumber);
await callback(new StoredEvent(eventToken, eventStreamNumber, eventData)); await callback(new StoredEvent(eventToken, eventStreamNumber, eventData));
} }
else
{
break;
}
} }
}, cancellationToken); }, cancellationToken);
} }
@ -200,12 +205,12 @@ namespace Squidex.Infrastructure.MongoDb.EventStore
{ {
var parts = new object[] { timestamp.Timestamp, timestamp.Increment, eventStreamNumber }; var parts = new object[] { timestamp.Timestamp, timestamp.Increment, eventStreamNumber };
return string.Join("$", parts); return string.Join("-", parts);
} }
private static (BsonTimestamp Timestamp, int EventStreamNumber) ParsePosition(string position) private static (BsonTimestamp Timestamp, int EventStreamNumber) ParsePosition(string position)
{ {
var parts = position.Split('$'); var parts = position.Split('-');
return (new BsonTimestamp(int.Parse(parts[0]), int.Parse(parts[1])), int.Parse(parts[2])); return (new BsonTimestamp(int.Parse(parts[0]), int.Parse(parts[1])), int.Parse(parts[2]));
} }

4
src/Squidex/Controllers/Api/EventConsumers/Models/EventConsumerDto.cs

@ -10,8 +10,6 @@ namespace Squidex.Controllers.Api.EventConsumers.Models
{ {
public sealed class EventConsumerDto public sealed class EventConsumerDto
{ {
public long LastHandledEventNumber { get; set; }
public bool IsStopped { get; set; } public bool IsStopped { get; set; }
public bool IsResetting { get; set; } public bool IsResetting { get; set; }
@ -19,5 +17,7 @@ namespace Squidex.Controllers.Api.EventConsumers.Models
public string Name { get; set; } public string Name { get; set; }
public string Error { get; set; } public string Error { get; set; }
public string Position { get; set; }
} }
} }

8
src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.html

@ -15,8 +15,8 @@
<div class="panel-content panel-content-scroll"> <div class="panel-content panel-content-scroll">
<table class="table table-items table-fixed"> <table class="table table-items table-fixed">
<colgroup> <colgroup>
<col style="width: 100%" /> <col style="width: 50%" />
<col style="width: 160px" /> <col style="width: 50%" />
<col style="width: 160px" /> <col style="width: 160px" />
</colgroup> </colgroup>
@ -26,7 +26,7 @@
Name Name
</th> </th>
<th class="text-right"> <th class="text-right">
Event Number Position
</th> </th>
<th class="text-right"> <th class="text-right">
Actions Actions
@ -45,7 +45,7 @@
</span> </span>
</td> </td>
<td class="text-right"> <td class="text-right">
<span>{{eventConsumer.lastHandledEventNumber}}</span> <span>{{eventConsumer.position}}</span>
</td> </td>
<td class="text-right"> <td class="text-right">
<button class="btn btn-link" (click)="reset(eventConsumer.name)" *ngIf="!eventConsumer.isResetting" title="Reset Event Consumer"> <button class="btn btn-link" (click)="reset(eventConsumer.name)" *ngIf="!eventConsumer.isResetting" title="Reset Event Consumer">

4
src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.scss

@ -1,6 +1,10 @@
@import '_vars'; @import '_vars';
@import '_mixins'; @import '_mixins';
.truncate {
@include truncate;
}
.faulted { .faulted {
& { & {
color: $color-theme-error; color: $color-theme-error;

6
src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.ts

@ -58,7 +58,7 @@ export class EventConsumersPageComponent extends ComponentBase implements OnInit
this.eventConsumers = this.eventConsumers =
this.eventConsumers.replaceAll( this.eventConsumers.replaceAll(
e => e.name === name, e => e.name === name,
e => new EventConsumerDto(name, e.lastHandledEventNumber, false, e.isResetting, e.error)); e => new EventConsumerDto(name, false, e.isResetting, e.error, e.position));
}, error => { }, error => {
this.notifyError(error); this.notifyError(error);
}); });
@ -70,7 +70,7 @@ export class EventConsumersPageComponent extends ComponentBase implements OnInit
this.eventConsumers = this.eventConsumers =
this.eventConsumers.replaceAll( this.eventConsumers.replaceAll(
e => e.name === name, e => e.name === name,
e => new EventConsumerDto(name, e.lastHandledEventNumber, true, e.isResetting, e.error)); e => new EventConsumerDto(name, true, e.isResetting, e.error, e.position));
}, error => { }, error => {
this.notifyError(error); this.notifyError(error);
}); });
@ -82,7 +82,7 @@ export class EventConsumersPageComponent extends ComponentBase implements OnInit
this.eventConsumers = this.eventConsumers =
this.eventConsumers.replaceAll( this.eventConsumers.replaceAll(
e => e.name === name, e => e.name === name,
e => new EventConsumerDto(name, e.lastHandledEventNumber, e.isStopped, true, e.error)); e => new EventConsumerDto(name, e.isStopped, true, e.error, e.position));
}, error => { }, error => {
this.notifyError(error); this.notifyError(error);
}); });

8
src/Squidex/app/shared/services/event-consumers.service.spec.ts

@ -33,14 +33,14 @@ describe('EventConsumersService', () => {
body: [ body: [
{ {
name: 'event-consumer1', name: 'event-consumer1',
lastHandledEventNumber: 13, position: '13',
isStopped: true, isStopped: true,
isResetting: true, isResetting: true,
error: 'an error 1' error: 'an error 1'
}, },
{ {
name: 'event-consumer2', name: 'event-consumer2',
lastHandledEventNumber: 29, position: '29',
isStopped: true, isStopped: true,
isResetting: true, isResetting: true,
error: 'an error 2' error: 'an error 2'
@ -58,8 +58,8 @@ describe('EventConsumersService', () => {
}).unsubscribe(); }).unsubscribe();
expect(eventConsumers).toEqual([ expect(eventConsumers).toEqual([
new EventConsumerDto('event-consumer1', 13, true, true, 'an error 1'), new EventConsumerDto('event-consumer1', true, true, 'an error 1', '13'),
new EventConsumerDto('event-consumer2', 29, true, true, 'an error 2') new EventConsumerDto('event-consumer2', true, true, 'an error 2', '29')
]); ]);
authService.verifyAll(); authService.verifyAll();

8
src/Squidex/app/shared/services/event-consumers.service.ts

@ -16,10 +16,10 @@ import { AuthService } from './auth.service';
export class EventConsumerDto { export class EventConsumerDto {
constructor( constructor(
public readonly name: string, public readonly name: string,
public readonly lastHandledEventNumber: number,
public readonly isStopped: boolean, public readonly isStopped: boolean,
public readonly isResetting: boolean, public readonly isResetting: boolean,
public readonly error: string public readonly error: string,
public readonly position: string
) { ) {
} }
} }
@ -43,10 +43,10 @@ export class EventConsumersService {
return items.map(item => { return items.map(item => {
return new EventConsumerDto( return new EventConsumerDto(
item.name, item.name,
item.lastHandledEventNumber,
item.isStopped, item.isStopped,
item.isResetting, item.isResetting,
item.error); item.error,
item.position);
}); });
}) })
.catchError('Failed to load event consumers. Please reload.'); .catchError('Failed to load event consumers. Please reload.');

Loading…
Cancel
Save