using Marten; using Netina.Repository.Abstracts; namespace Netina.Infrastructure.Marten; public class MartenRepository(IDocumentStore documentStore, ICurrentUserService currentUserService) : IMartenRepository where TMartenEntity : IMartenEntity { private readonly ICurrentUserService _currentUserService = currentUserService; 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(int page, int count, CancellationToken cancellation) { await using var session = documentStore.QuerySession(); var schema = session.DocumentStore.Options.Schema; var entities = session .Query($"select data from {schema.For()} ORDER BY \"mt_last_modified\" DESC " ) .Skip(page * count) .Take(count) .ToList(); return entities.ToList(); } public async Task> GetEntitiesAsync(Expression> expression, int page, int count, CancellationToken cancellation) { await using var session = documentStore.QuerySession(); var entities = await session.Query().Where(expression) .Skip(page * count) .Take(count) .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 entity, CancellationToken cancellation) { if (entity == null) throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest); await using var session = documentStore.LightweightSession(); session.Store(entity); await session.SaveChangesAsync(cancellation); } public async Task UpdateEntityAsync(TMartenEntity entity, CancellationToken cancellation = default) { if (entity == null) throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest); await using var session = documentStore.LightweightSession(); session.Update(entity); await session.SaveChangesAsync(cancellation); } public async Task RemoveEntityAsync(TMartenEntity entity, CancellationToken cancellation) { if (entity == null) throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest); await using var session = documentStore.LightweightSession(); session.Delete(entity); await session.SaveChangesAsync(cancellation); } }