namespace zero.Persistence; public class RevisionService : IRevisionService { protected IZeroStore Store { get; set; } public RevisionService(IZeroStore store) { Store = store; } /// /// Get revision list for an entity /// public async Task>> GetPagedWithModel(string id, int pageNumber = 1, int pageSize = 10) where T : ZeroEntity { IZeroDocumentSession session = Store.Session(); // get paged revisions List items = await session.Advanced.Revisions.GetForAsync(id, (pageNumber - 1) * pageSize, pageSize); long totalResults = await session.Advanced.Revisions.GetCountForAsync(id); // add creation for last page //if (!items.Any() && pageNumber >= (int)Math.Ceiling((decimal)totalResults / pageSize)) //{ // T currentRevision = await Session.LoadAsync(id); // if (currentRevision != null) // { // items.Add(currentRevision); // } //} List> revisions = new(); // load affected users as the revisions could have been edited by other users too string[] userIds = items.Select(x => x.LastModifiedById).Distinct().ToArray(); Dictionary users = await session.LoadAsync(userIds); // create revision objects foreach (T item in items) { Revision revision = new() { Model = item, ModelId = item.Id, ChangeVector = session.Advanced.GetChangeVectorFor(item), Date = item.LastModifiedDate }; if (!item.LastModifiedById.IsNullOrEmpty() && users.TryGetValue(item.LastModifiedById, out ZeroUser user) && user != null) { revision.User = new RevisionUser() { AvatarId = user.AvatarId, Id = user.Id, Name = user.Name }; } revisions.Add(revision); } return new Paged>(revisions, totalResults, pageNumber, pageSize); } /// /// Get revision list for an entity /// public async Task> GetPaged(string id, int pageNumber = 1, int pageSize = 10) where T : ZeroEntity { Paged> items = await GetPagedWithModel(id, pageNumber, pageSize); return items.MapTo(model => new Revision() { ChangeVector = model.ChangeVector, Date = model.Date, ModelId = model.ModelId, User = model.User }); } } public interface IRevisionService { /// /// Get revision list including models for an entity /// Task>> GetPagedWithModel(string id, int pageNumber = 1, int pageSize = 10) where T : ZeroEntity; /// /// Get revision list for an entity /// Task> GetPaged(string id, int pageNumber = 1, int pageSize = 10) where T : ZeroEntity; }