diff --git a/zero.Core/Api/BackofficeApi.cs b/zero.Core/Api/BackofficeApi.cs index 3d360068..d61e0868 100644 --- a/zero.Core/Api/BackofficeApi.cs +++ b/zero.Core/Api/BackofficeApi.cs @@ -211,6 +211,7 @@ namespace zero.Core.Api { zeroEntity.Alias = Safenames.Alias(zeroEntity.Name); zeroEntity.LastModifiedById = userId; + zeroEntity.LastModifiedDate = DateTimeOffset.Now; zeroEntity.CreatedById ??= userId; } diff --git a/zero.Core/Api/RevisionsApi.cs b/zero.Core/Api/RevisionsApi.cs index fe4a4b0b..fb379166 100644 --- a/zero.Core/Api/RevisionsApi.cs +++ b/zero.Core/Api/RevisionsApi.cs @@ -66,12 +66,10 @@ namespace zero.Core.Api // create revision objects 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, + Date = item.LastModifiedDate, Json = includeContent ? JsonConvert.SerializeObject(item) : null }; diff --git a/zero.Core/Database/Indexes/Pages_AsHistory.cs b/zero.Core/Database/Indexes/Pages_AsHistory.cs index fc8819c9..ad21a3d5 100644 --- a/zero.Core/Database/Indexes/Pages_AsHistory.cs +++ b/zero.Core/Database/Indexes/Pages_AsHistory.cs @@ -14,7 +14,7 @@ namespace zero.Core.Database.Indexes public string AppId { get; set; } - public DateTime LastModified { get; set; } + public DateTimeOffset LastModified { get; set; } } @@ -25,7 +25,7 @@ namespace zero.Core.Database.Indexes { Id = x.Id, AppId = x.AppId, - LastModified = MetadataFor(x).Value("@last-modified") + LastModified = x.LastModifiedDate }); StoreAllFields(FieldStorage.Yes); diff --git a/zero.Core/Entities/Media/Media.cs b/zero.Core/Entities/Media/Media.cs index 2f6aaaf2..08cc077c 100644 --- a/zero.Core/Entities/Media/Media.cs +++ b/zero.Core/Entities/Media/Media.cs @@ -36,9 +36,6 @@ namespace zero.Core.Entities /// public MediaImageMeta ImageMeta { get; set; } - /// - public DateTimeOffset LastModifiedDate { get; set; } - /// public MediaFocalPoint FocalPoint { get; set; } diff --git a/zero.Core/Entities/ZeroEntity.cs b/zero.Core/Entities/ZeroEntity.cs index cf89c157..28e83ee3 100644 --- a/zero.Core/Entities/ZeroEntity.cs +++ b/zero.Core/Entities/ZeroEntity.cs @@ -24,6 +24,9 @@ namespace zero.Core.Entities /// public string LastModifiedById { get; set; } + /// + public DateTimeOffset LastModifiedDate { get; set; } + /// public string CreatedById { get; set; } @@ -63,6 +66,11 @@ namespace zero.Core.Entities /// public string LastModifiedById { get; set; } + /// + /// Date of last modification + /// + DateTimeOffset LastModifiedDate { get; set; } + /// /// Backoffice user who created this content /// @@ -72,7 +80,6 @@ namespace zero.Core.Entities /// /// Date of creation /// - [Overwrite] DateTimeOffset CreatedDate { get; set; } /// diff --git a/zero.Core/Extensions/RavenDocumentSessionExtensions.cs b/zero.Core/Extensions/RavenDocumentSessionExtensions.cs index 04b08ada..019b56ca 100644 --- a/zero.Core/Extensions/RavenDocumentSessionExtensions.cs +++ b/zero.Core/Extensions/RavenDocumentSessionExtensions.cs @@ -9,41 +9,6 @@ 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); - } + } } diff --git a/zero.Debug/Controllers/MigrationController.cs b/zero.Debug/Controllers/MigrationController.cs index 25b560b0..883cc1d4 100644 --- a/zero.Debug/Controllers/MigrationController.cs +++ b/zero.Debug/Controllers/MigrationController.cs @@ -1,16 +1,10 @@ -using FluentValidation; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Infrastructure; -using Microsoft.Extensions.DependencyInjection; -using Newtonsoft.Json; +using Microsoft.AspNetCore.Mvc; using Raven.Client.Documents; using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Linq; -using System.Security.Claims; using System.Threading.Tasks; -using zero.Commerce.Api; using zero.Commerce.Entities; using zero.Core; using zero.Core.Api; @@ -18,7 +12,6 @@ using zero.Core.Attributes; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Utils; -using zero.Web.Filters; namespace zero.Debug.Controllers { @@ -78,21 +71,23 @@ namespace zero.Debug.Controllers using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { items = await session.Query().ToListAsync(); - } - foreach (T item in items) - { - if (await Save(item)) + foreach (T item in items) { - changedIds.Add(item.Id); + if (Update(item, session.Advanced.GetLastModifiedFor(item))) + { + changedIds.Add(item.Id); + } } + + await session.SaveChangesAsync(); } return changedIds; } - async Task Save(T model) where T : IZeroIdEntity + bool Update(T model, DateTime? modifiedDate) where T : IZeroIdEntity { IAppAwareEntity appAwareEntity = model as IAppAwareEntity; IZeroEntity zeroEntity = model as IZeroEntity; @@ -119,40 +114,37 @@ namespace zero.Debug.Controllers string userId = HttpContext.User.Claims.FirstOrDefault(x => x.Type == Constants.Auth.Claims.UserId)?.Value; - // set default properties - if (zeroEntity != null && zeroEntity.CreatedById == null) + if (zeroEntity != null) { - hasChange = true; - zeroEntity.CreatedDate = zeroEntity.CreatedDate == default ? DateTimeOffset.Now : zeroEntity.CreatedDate; - zeroEntity.CreatedById = userId; + if (zeroEntity.CreatedById == null) + { + hasChange = true; + zeroEntity.CreatedDate = zeroEntity.CreatedDate == default ? DateTimeOffset.Now : zeroEntity.CreatedDate; + zeroEntity.CreatedById = userId; + } + if (model is ITranslation && zeroEntity.Name.IsNullOrEmpty()) + { + hasChange = true; + zeroEntity.Name = ((ITranslation)model).Key; + } + if (zeroEntity.Alias.IsNullOrEmpty()) + { + hasChange = true; + zeroEntity.Alias = Safenames.Alias(zeroEntity.Name); + } + if (zeroEntity.LastModifiedById == default) + { + hasChange = true; + zeroEntity.LastModifiedById = userId; + } + if (zeroEntity.LastModifiedDate == default) + { + hasChange = true; + zeroEntity.LastModifiedDate = modifiedDate.HasValue ? new DateTimeOffset(modifiedDate.Value) : zeroEntity.CreatedDate; + } } - if (zeroEntity != null && model is ITranslation) - { - zeroEntity.Name = ((ITranslation)model).Key; - } - - // update name alias and last modified - if (zeroEntity != null && zeroEntity.Alias.IsNullOrEmpty()) - { - hasChange = true; - zeroEntity.Alias = Safenames.Alias(zeroEntity.Name); - } - if (zeroEntity != null && zeroEntity.LastModifiedById == default) - { - hasChange = true; - zeroEntity.LastModifiedById = userId; - } - - if (!hasChange) - { - return false; - } - - using IAsyncDocumentSession session = Raven.OpenAsyncSession(); - await session.StoreAsync(model); - await session.SaveChangesAsync(); - return true; + return hasChange; } } } \ No newline at end of file diff --git a/zero.Web.UI/App/editor/editor.vue b/zero.Web.UI/App/editor/editor.vue index 9cd3bb49..850e9f8a 100644 --- a/zero.Web.UI/App/editor/editor.vue +++ b/zero.Web.UI/App/editor/editor.vue @@ -27,6 +27,9 @@ {{value.id}} + + +