mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
// ==========================================================================
|
|
// EventStoreFormatter.cs
|
|
// Squidex Headless CMS
|
|
// ==========================================================================
|
|
// Copyright (c) Squidex Group
|
|
// All rights reserved.
|
|
// ==========================================================================
|
|
|
|
using System;
|
|
using System.Text;
|
|
using EventStore.ClientAPI;
|
|
using Newtonsoft.Json;
|
|
using NodaTime;
|
|
using Squidex.Infrastructure.CQRS.Events;
|
|
|
|
// ReSharper disable InconsistentNaming
|
|
|
|
namespace Squidex.Infrastructure.CQRS.EventStore
|
|
{
|
|
public class EventStoreFormatter
|
|
{
|
|
private readonly JsonSerializerSettings serializerSettings;
|
|
|
|
public EventStoreFormatter(JsonSerializerSettings serializerSettings = null)
|
|
{
|
|
this.serializerSettings = serializerSettings ?? new JsonSerializerSettings();
|
|
}
|
|
|
|
public Envelope<IEvent> Parse(ResolvedEvent @event)
|
|
{
|
|
var headers = ReadJson<PropertiesBag>(@event.Event.Metadata);
|
|
|
|
var eventType = TypeNameRegistry.GetType(@event.Event.EventType);
|
|
var eventData = ReadJson<IEvent>(@event.Event.Data, eventType);
|
|
|
|
var envelope = new Envelope<IEvent>(eventData, headers);
|
|
|
|
envelope.Headers.Set(CommonHeaders.Timestamp, Instant.FromDateTimeUtc(DateTime.SpecifyKind(@event.Event.Created, DateTimeKind.Utc)));
|
|
envelope.Headers.Set(CommonHeaders.EventNumber, @event.OriginalEventNumber);
|
|
|
|
return envelope;
|
|
}
|
|
|
|
public EventData ToEventData(Envelope<IEvent> envelope, Guid commitId)
|
|
{
|
|
var eventType = TypeNameRegistry.GetName(envelope.Payload.GetType());
|
|
|
|
envelope.Headers.Set(CommonHeaders.CommitId, commitId);
|
|
|
|
var headers = WriteJson(envelope.Headers);
|
|
var content = WriteJson(envelope.Payload);
|
|
|
|
return new EventData(envelope.Headers.EventId(), eventType, true, content, headers);
|
|
}
|
|
|
|
private T ReadJson<T>(byte[] data, Type type = null)
|
|
{
|
|
return (T)JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), type ?? typeof(T), serializerSettings);
|
|
}
|
|
|
|
private byte[] WriteJson(object value)
|
|
{
|
|
return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value, serializerSettings));
|
|
}
|
|
}
|
|
}
|
|
|