using System.Linq.Expressions; using MiGu.DB.Abstractions.Entities; namespace MiGu.DB.Abstractions.Persistence; public interface IRepository where TEntity : class, IEntity { IQueryable Query(bool asNoTracking = true); Task FindAsync(TKey id, CancellationToken ct = default); Task AddAsync(TEntity entity, CancellationToken ct = default); void Update(TEntity entity); } public interface IEditableRepository : IRepository where TEntity : class, IEntity, ISoftDeletable, IVersioned, ILockable { Task GetEditableAsync(Guid id, long? expectedVersion, CancellationToken ct = default); Task SoftDeleteAsync(Guid id, long? expectedVersion, CancellationToken ct = default); Task EnsureUniqueAsync(Expression> predicate, string errorMessage, CancellationToken ct = default); } public interface IHistoryRepository : IRepository where TEntity : class, IEntity, IHistoryEntry { Task AppendAsync(TEntity entry, CancellationToken ct = default); } public interface IUnitOfWork { Task SaveChangesAsync(CancellationToken ct = default); Task ExecuteInTransactionAsync(Func action, CancellationToken ct = default); }