Files: moved from feature/editor-version-history

This commit is contained in:
pavelbannov 2021-12-08 15:25:39 +03:00
parent 475dd92c30
commit feb48c01a0
7 changed files with 353 additions and 222 deletions

View File

@ -97,7 +97,7 @@ namespace ASC.Files.Core.Data
services.TryAdd<ILinkDao, LinkDao>();
// AddSharpBoxDaoSelectorService
services.TryAdd<EditHistory>();
}
}
}

View File

@ -1202,14 +1202,12 @@ namespace ASC.Files.Core.Data
.Select(r =>
{
var item = ServiceProvider.GetService<EditHistory>();
var editHistoryAuthor = ServiceProvider.GetService<EditHistoryAuthor>();
editHistoryAuthor.Id = r.ModifiedBy;
item.ID = r.Id;
item.Version = r.Version;
item.VersionGroup = r.VersionGroup;
item.ModifiedOn = TenantUtil.DateTimeFromUtc(r.ModifiedOn);
item.ModifiedBy = editHistoryAuthor;
item.ModifiedBy = r.ModifiedBy;
item.ChangesString = r.Changes;
item.Key = documentServiceHelper.GetDocKey(item.ID, item.Version, TenantUtil.DateTimeFromUtc(r.CreateOn));

View File

@ -28,8 +28,9 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.Json.Serialization;
using System.Text.Json;
using ASC.Common;
using ASC.Common.Logging;
using ASC.Core;
using ASC.Core.Tenants;
@ -39,13 +40,17 @@ using ASC.Web.Core.Users;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq;
namespace ASC.Files.Core
{
[Transient]
[DebuggerDisplay("{ID} v{Version}")]
public class EditHistory
{
private ILog Logger { get; }
private TenantUtil TenantUtil { get; }
private UserManager UserManager { get; }
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
public EditHistory(
IOptionsMonitor<ILog> options,
TenantUtil tenantUtil,
@ -63,12 +68,12 @@ namespace ASC.Files.Core
public int Version { get; set; }
public int VersionGroup { get; set; }
[JsonPropertyName("user")]
public EditHistoryAuthor ModifiedBy { get; set; }
[JsonPropertyName("changeshistory")]
public DateTime ModifiedOn { get; set; }
public Guid ModifiedBy { get; set; }
public string ChangesString { get; set; }
public string ServerVersion { get; set; }
public List<EditHistoryChanges> Changes
{
get
@ -78,29 +83,40 @@ namespace ASC.Files.Core
try
{
var jObject = JObject.Parse(ChangesString);
ServerVersion = jObject.Value<string>("serverVersion");
var options = new JsonSerializerOptions
{
AllowTrailingCommas = true,
PropertyNameCaseInsensitive = true
};
var jObject = JsonSerializer.Deserialize<ChangesDataList>(ChangesString, options);
ServerVersion = jObject.ServerVersion;
if (string.IsNullOrEmpty(ServerVersion))
return changes;
var jChanges = jObject.Value<JArray>("changes");
changes = jChanges.Children()
.Select(jChange =>
changes = jObject.Changes.Select(r =>
{
var jUser = jChange.Value<JObject>("user");
return new EditHistoryChanges(TenantUtil)
var result = new EditHistoryChanges()
{
Date = jChange.Value<string>("created"),
Author = new EditHistoryAuthor(UserManager, DisplayUserSettingsHelper)
{
Id = new Guid(jUser.Value<string>("id") ?? Guid.Empty.ToString()),
Name = jUser.Value<string>("name"),
},
Id = new Guid(r.User.Id ?? Guid.Empty.ToString()),
Name = r.User.Name,
}
};
if (DateTime.TryParse(r.Created, out var _date))
{
_date = TenantUtil.DateTimeFromUtc(_date);
}
result.Date = _date;
return result;
})
.ToList();
return changes;
}
catch (Exception ex)
@ -112,24 +128,27 @@ namespace ASC.Files.Core
}
set { throw new NotImplementedException(); }
}
}
public DateTime ModifiedOn;
[JsonPropertyName("created")]
public string ModifiedOnString
class ChangesDataList
{
get { return ModifiedOn.Equals(default) ? null : ModifiedOn.ToString("g"); }
set { throw new NotImplementedException(); }
public string ServerVersion { get; set; }
public ChangesData[] Changes { get; set; }
}
public ILog Logger { get; }
private TenantUtil TenantUtil { get; }
private UserManager UserManager { get; }
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
public string ServerVersion;
class ChangesData
{
public string Created { get; set; }
public ChangesUserData User { get; set; }
}
class ChangesUserData
{
public string Id { get; set; }
public string Name { get; set; }
}
[Transient]
[DebuggerDisplay("{Id} {Name}")]
public class EditHistoryAuthor
{
@ -169,30 +188,11 @@ namespace ASC.Files.Core
[DebuggerDisplay("{Author.Name}")]
public class EditHistoryChanges
{
public EditHistoryChanges(TenantUtil tenantUtil)
{
TenantUtil = tenantUtil;
}
[JsonPropertyName("user")]
public EditHistoryAuthor Author { get; set; }
private DateTime _date;
public DateTime Date { get; set; }
[JsonPropertyName("created")]
public string Date
{
get { return _date.Equals(default) ? null : _date.ToString("g"); }
set
{
if (DateTime.TryParse(value, out _date))
{
_date = TenantUtil.DateTimeFromUtc(_date);
}
}
}
private TenantUtil TenantUtil { get; }
}
[DebuggerDisplay("{Version}")]
@ -209,6 +209,8 @@ namespace ASC.Files.Core
public string Url { get; set; }
public int Version { get; set; }
public string FileType { get; set; }
}
[DebuggerDisplay("{Key} - {Url}")]
@ -217,5 +219,7 @@ namespace ASC.Files.Core
public string Key { get; set; }
public string Url { get; set; }
public string FileType { get; set; }
}
}

View File

@ -1071,12 +1071,15 @@ namespace ASC.Web.Files.Services.WCFService
Key = DocumentServiceHelper.GetDocKey(file),
Url = DocumentServiceConnector.ReplaceCommunityAdress(PathProvider.GetFileStreamUrl(file, doc)),
Version = version,
FileType = GetFileExtensionWithoutDot(FileUtility.GetFileExtension(file.Title))
};
if (fileDao.ContainChanges(file.ID, file.Version))
{
string previouseKey;
string sourceFileUrl;
string previousFileExt;
if (file.Version > 1)
{
var previousFileStable = fileDao.GetFileStable(file.ID, file.Version - 1);
@ -1085,6 +1088,7 @@ namespace ASC.Web.Files.Services.WCFService
sourceFileUrl = PathProvider.GetFileStreamUrl(previousFileStable, doc);
previouseKey = DocumentServiceHelper.GetDocKey(previousFileStable);
previousFileExt = FileUtility.GetFileExtension(previousFileStable.Title);
}
else
{
@ -1105,12 +1109,14 @@ namespace ASC.Web.Files.Services.WCFService
sourceFileUrl = BaseCommonLinkUtility.GetFullAbsolutePath(sourceFileUrl);
previouseKey = DocumentServiceConnector.GenerateRevisionId(Guid.NewGuid().ToString());
previousFileExt = fileExt;
}
result.Previous = new EditHistoryUrl
{
Key = previouseKey,
Url = DocumentServiceConnector.ReplaceCommunityAdress(sourceFileUrl),
FileType = GetFileExtensionWithoutDot(previousFileExt)
};
result.ChangesUrl = PathProvider.GetFileChangesUrl(file, doc);
}
@ -1118,6 +1124,11 @@ namespace ASC.Web.Files.Services.WCFService
result.Token = DocumentServiceHelper.GetSignature(result);
return result;
string GetFileExtensionWithoutDot(string ext)
{
return ext.Substring(ext.IndexOf('.') + 1);
}
}
public List<EditHistory> RestoreVersion(T fileId, int version, string url = null, string doc = null)

View File

@ -0,0 +1,49 @@

using System.Collections.Generic;
using System.Linq;
using ASC.Api.Core;
using ASC.Core;
using ASC.Web.Core.Users;
namespace ASC.Files.Core.Model
{
public class EditHistoryWrapper
{
public int ID { get; set; }
public string Key { get; set; }
public int Version { get; set; }
public int VersionGroup { get; set; }
public EditHistoryAuthor User { get; set; }
public ApiDateTime Created { get; set; }
public string ChangesHistory { get; set; }
public List<EditHistoryChangesWrapper> Changes { get; set; }
public string ServerVersion { get; set; }
public EditHistoryWrapper(EditHistory editHistory, ApiDateTimeHelper apiDateTimeHelper, UserManager userManager, DisplayUserSettingsHelper displayUserSettingsHelper)
{
ID = editHistory.ID;
Key = editHistory.Key;
Version = editHistory.Version;
VersionGroup = editHistory.VersionGroup;
Changes = editHistory.Changes.Select(r => new EditHistoryChangesWrapper(r, apiDateTimeHelper)).ToList();
ChangesHistory = editHistory.ChangesString;
Created = apiDateTimeHelper.Get(editHistory.ModifiedOn);
User = new EditHistoryAuthor(userManager, displayUserSettingsHelper) { Id = editHistory.ModifiedBy };
ServerVersion = editHistory.ServerVersion;
}
}
public class EditHistoryChangesWrapper
{
public EditHistoryAuthor User { get; set; }
public ApiDateTime Created { get; set; }
public EditHistoryChangesWrapper(EditHistoryChanges historyChanges, ApiDateTimeHelper apiDateTimeHelper)
{
User = historyChanges.Author;
Created = apiDateTimeHelper.Get(historyChanges.Date);
}
}
}

View File

@ -1517,6 +1517,48 @@ namespace ASC.Api.Documents
return FilesControllerHelperInt.LockFile(fileId, model.LockFile);
}
[AllowAnonymous]
[Read("file/{fileId}/edit/history")]
public List<EditHistoryWrapper> GetEditHistory(string fileId, string doc = null)
{
return FilesControllerHelperString.GetEditHistory(fileId, doc);
}
[AllowAnonymous]
[Read("file/{fileId:int}/edit/history")]
public List<EditHistoryWrapper> GetEditHistory(int fileId, string doc = null)
{
return FilesControllerHelperInt.GetEditHistory(fileId, doc);
}
[AllowAnonymous]
[Read("file/{fileId}/edit/diff")]
public EditHistoryData GetEditDiffUrl(string fileId, int version = 0, string doc = null)
{
return FilesControllerHelperString.GetEditDiffUrl(fileId, version, doc);
}
[AllowAnonymous]
[Read("file/{fileId:int}/edit/diff")]
public EditHistoryData GetEditDiffUrl(int fileId, int version = 0, string doc = null)
{
return FilesControllerHelperInt.GetEditDiffUrl(fileId, version, doc);
}
[AllowAnonymous]
[Read("file/{fileId}/restoreversion")]
public List<EditHistoryWrapper> RestoreVersion(string fileId, int version = 0, string url = null, string doc = null)
{
return FilesControllerHelperString.RestoreVersion(fileId, version, url, doc);
}
[AllowAnonymous]
[Read("file/{fileId:int}/restoreversion")]
public List<EditHistoryWrapper> RestoreVersion(int fileId, int version = 0, string url = null, string doc = null)
{
return FilesControllerHelperInt.RestoreVersion(fileId, version, url, doc);
}
[Update("file/{fileId}/comment")]
public object UpdateCommentFromBody(string fileId, [FromBody] UpdateCommentModel model)
{

View File

@ -21,6 +21,7 @@ using ASC.Files.Core;
using ASC.Files.Core.Model;
using ASC.Files.Model;
using ASC.Web.Core.Files;
using ASC.Web.Core.Users;
using ASC.Web.Files.Classes;
using ASC.Web.Files.Core.Entries;
using ASC.Web.Files.Services.DocumentService;
@ -66,6 +67,9 @@ namespace ASC.Files.Helpers
private EncryptionKeyPairHelper EncryptionKeyPairHelper { get; }
private IHttpContextAccessor HttpContextAccessor { get; }
private FileConverter FileConverter { get; }
private ApiDateTimeHelper ApiDateTimeHelper { get; }
private UserManager UserManager { get; }
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
private ILog Logger { get; set; }
/// <summary>
@ -94,7 +98,10 @@ namespace ASC.Files.Helpers
SettingsManager settingsManager,
EncryptionKeyPairHelper encryptionKeyPairHelper,
IHttpContextAccessor httpContextAccessor,
FileConverter fileConverter)
FileConverter fileConverter,
ApiDateTimeHelper apiDateTimeHelper,
UserManager userManager,
DisplayUserSettingsHelper displayUserSettingsHelper)
{
ApiContext = context;
FileStorageService = fileStorageService;
@ -115,6 +122,9 @@ namespace ASC.Files.Helpers
DocumentServiceTracker = documentServiceTracker;
SettingsManager = settingsManager;
EncryptionKeyPairHelper = encryptionKeyPairHelper;
ApiDateTimeHelper = apiDateTimeHelper;
UserManager = userManager;
DisplayUserSettingsHelper = displayUserSettingsHelper;
HttpContextAccessor = httpContextAccessor;
FileConverter = fileConverter;
Logger = optionMonitor.Get("ASC.Files");
@ -571,6 +581,23 @@ namespace ASC.Files.Helpers
return FileStorageService.GetPresignedUri(fileId);
}
public List<EditHistoryWrapper> GetEditHistory(T fileId, string doc = null)
{
var result = FileStorageService.GetEditHistory(fileId, doc);
return result.Select(r => new EditHistoryWrapper(r, ApiDateTimeHelper, UserManager, DisplayUserSettingsHelper)).ToList();
}
public EditHistoryData GetEditDiffUrl(T fileId, int version = 0, string doc = null)
{
return FileStorageService.GetEditDiffUrl(fileId, version, doc);
}
public List<EditHistoryWrapper> RestoreVersion(T fileId, int version = 0, string url = null, string doc = null)
{
var result = FileStorageService.RestoreVersion(fileId, version, url, doc);
return result.Select(r => new EditHistoryWrapper(r, ApiDateTimeHelper, UserManager, DisplayUserSettingsHelper)).ToList();
}
public string UpdateComment(T fileId, int version, string comment)
{
return FileStorageService.UpdateComment(fileId, version, comment);