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