using Marten; namespace NetinaShop.Infrastructure.Marten; public class MartenRepository : IMartenRepository where TMartenEntity : IMartenEntity { private readonly IDocumentStore _documentStore; public MartenRepository(IDocumentStore documentStore) { _documentStore = documentStore; } public async Task> GetEntitiesAsync(CancellationToken cancellation) { await using var session = _documentStore.QuerySession(); var entities = await session.Query().ToListAsync(cancellation); return entities.ToList(); } public async Task> GetEntitiesAsync(Expression> expression, CancellationToken cancellation) { await using var session = _documentStore.QuerySession(); var entities = await session.Query().Where(expression).ToListAsync(cancellation); return entities.ToList(); } public async Task GetEntityAsync(Guid id, CancellationToken cancellation) { await using var session = _documentStore.QuerySession(); var setting = await session.LoadAsync(id, cancellation); if (setting == null) throw new AppException($"{nameof(setting)} not found", ApiResultStatusCode.NotFound); return setting; } public async Task GetEntityAsync(Expression> expression, CancellationToken cancellation) { await using var session = _documentStore.QuerySession(); var entity = await session.Query().FirstOrDefaultAsync(expression, cancellation); return entity; } public async Task AddOrUpdateEntityAsync(TMartenEntity setting, CancellationToken cancellation) { if (setting == null) throw new AppException($"{nameof(setting)} is null", ApiResultStatusCode.BadRequest); await using var session = _documentStore.LightweightSession(); session.Store(setting); await session.SaveChangesAsync(cancellation); } public Task RemoveEntityAsync(CancellationToken cancellation) { throw new NotImplementedException(); } }