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);
}
}
}