using SmartStack.Domain.Common;
using SmartStack.Domain.Support.Events;
namespace {{ProjectName}}.Domain.Common;
///
/// Extension base entity that adds soft-delete and domain events support
/// on top of SmartStack's (which provides Id,
/// CreatedAt, UpdatedAt and the ExtensionData JSON bag).
///
/// Every scaffolded client entity inherits this class — the package's
/// BaseEntity deliberately ships WITHOUT DeletedAt /
/// AddDomainEvent, so the extension owns its own lifecycle surface.
///
public abstract class ExtensionBaseEntity : BaseEntity
{
private readonly List _domainEvents = new();
///
/// The package's BaseEntity leaves Id and CreatedAt
/// unset at construction (EF assigns them at SaveChanges). Extension
/// entities assign both up-front so a factory-created aggregate carries a
/// REAL identity before any persistence — its creation domain event can
/// reference Id, and domain unit tests can assert identity without
/// a DbContext. CoreDbContext.StampAuditFields only fills
/// CreatedAt when it is still default, so this stays
/// compatible with the persistence pipeline.
///
protected ExtensionBaseEntity()
{
Id = Guid.NewGuid();
CreatedAt = DateTime.UtcNow;
}
/// Soft-delete marker — scaffolded EF configs filter on DeletedAt == null.
public DateTime? DeletedAt { get; protected set; }
public IReadOnlyCollection DomainEvents => _domainEvents.AsReadOnly();
protected void AddDomainEvent(IDomainEvent domainEvent)
{
_domainEvents.Add(domainEvent);
}
public void ClearDomainEvents()
{
_domainEvents.Clear();
}
}