using Raven.Client.Documents.Session; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Entities; using zero.Core.Extensions; namespace zero.Core.Api { public class RevisionsApi : IRevisionsApi { protected IAsyncDocumentSession Session { get; set; } public RevisionsApi(IAsyncDocumentSession session) { Session = session; } /// /// Get revision list for an entity /// public async Task>> GetPagedWithModel(string id, int pageNumber = 1, int pageSize = 10) where T : ZeroEntity { // 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 BackofficeUser user) && user != null) { revision.User = new RevisionUser() { AvatarId = user.AvatarId, Id = user.Id, Name = user.Name }; } revisions.Add(revision); } return new ListResult>(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 { ListResult> 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 IRevisionsApi { /// /// 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; } }