Headless CMS and Content Managment Hub
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.
 
 
 
 
 

89 lines
2.9 KiB

// ==========================================================================
// EntityMapper2.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using NodaTime;
using Squidex.Domain.Apps.Events;
using Squidex.Infrastructure.EventSourcing;
namespace Squidex.Domain.Apps.Entities
{
public static class EntityMapper
{
public static T Update<T>(this T entity, SquidexEvent @event, EnvelopeHeaders headers, Action<T> updater = null) where T : IEntity
{
SetId(entity, headers);
SetAppId(entity, @event);
SetCreated(entity, headers);
SetCreatedBy(entity, @event);
SetLastModified(entity, headers);
SetLastModifiedBy(entity, @event);
SetVersion(entity, headers);
updater?.Invoke(entity);
return entity;
}
private static void SetId(IEntity entity, EnvelopeHeaders headers)
{
if (entity is IUpdateableEntity updateable && updateable.Id == Guid.Empty)
{
updateable.Id = headers.AggregateId();
}
}
private static void SetVersion(IEntity entity, EnvelopeHeaders headers)
{
if (entity is IUpdateableEntityWithVersion updateable)
{
updateable.Version = headers.EventStreamNumber();
}
}
private static void SetCreated(IEntity entity, EnvelopeHeaders headers)
{
if (entity is IUpdateableEntity updateable && updateable.Created == default(Instant))
{
updateable.Created = headers.Timestamp();
}
}
private static void SetCreatedBy(IEntity entity, SquidexEvent @event)
{
if (entity is IUpdateableEntityWithCreatedBy withCreatedBy && withCreatedBy.CreatedBy == null)
{
withCreatedBy.CreatedBy = @event.Actor;
}
}
private static void SetLastModified(IEntity entity, EnvelopeHeaders headers)
{
if (entity is IUpdateableEntity updateable)
{
updateable.LastModified = headers.Timestamp();
}
}
private static void SetLastModifiedBy(IEntity entity, SquidexEvent @event)
{
if (entity is IUpdateableEntityWithLastModifiedBy withModifiedBy)
{
withModifiedBy.LastModifiedBy = @event.Actor;
}
}
private static void SetAppId(IEntity entity, SquidexEvent @event)
{
if (entity is IUpdateableEntityWithAppRef appEntity && @event is AppEvent appEvent)
{
appEntity.AppId = appEvent.AppId.Id;
}
}
}
}