using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Entities; namespace zero.Core.Extensions { public static class RavenDocumentSessionExtensions { /// /// Get revision list (without content JSON) for an entity /// public static async Task> GetRevisions(this IAsyncDocumentSession session, string id, int pageNumber = 1, int pageSize = 30) where T : IZeroEntity { List items = await session.Advanced.Revisions.GetForAsync(id, pageNumber - 1, pageSize); List revisions = new List(); string[] userIds = items.Select(x => x.LastModifiedById).Distinct().ToArray(); Dictionary users = await session.LoadAsync(userIds); foreach (T item in items) { DateTime? date = session.Advanced.GetLastModifiedFor(item); Revision revision = new Revision() { ChangeVector = session.Advanced.GetChangeVectorFor(item), Date = date.HasValue ? new DateTimeOffset(date.Value) : item.CreatedDate }; if (!item.LastModifiedById.IsNullOrEmpty() && users.TryGetValue(item.LastModifiedById, out User user)) { revision.User = new RevisionUser() { AvatarId = user.AvatarId, Id = user.Id, Name = user.Name }; } revisions.Add(revision); } return new ListResult(revisions, revisions.Count, pageNumber, pageSize); } } }