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.
89 lines
2.9 KiB
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|