Files: ef, di
This commit is contained in:
parent
56d5d3f111
commit
7a8baecb2a
@ -107,7 +107,9 @@ namespace ASC.Common.DependencyInjection
|
|||||||
AssemblyLoadContext.Default.Resolving += (c, n) =>
|
AssemblyLoadContext.Default.Resolving += (c, n) =>
|
||||||
{
|
{
|
||||||
var path = GetFullPath(n.Name);
|
var path = GetFullPath(n.Name);
|
||||||
return c.LoadFromAssemblyPath(Path.Combine(Path.GetDirectoryName(path), $"{n.Name}.dll"));
|
return path != null ?
|
||||||
|
c.LoadFromAssemblyPath(Path.Combine(Path.GetDirectoryName(path), $"{n.Name}.dll")) :
|
||||||
|
null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using ASC.Data.Storage.Configuration;
|
using ASC.Data.Storage.Configuration;
|
||||||
|
|
||||||
namespace ASC.Data.Storage
|
namespace ASC.Data.Storage
|
||||||
@ -34,9 +35,16 @@ namespace ASC.Data.Storage
|
|||||||
public DataList(Module config)
|
public DataList(Module config)
|
||||||
{
|
{
|
||||||
Add(string.Empty, config.Data);
|
Add(string.Empty, config.Data);
|
||||||
foreach (var domain in config.Domain)
|
if (config.Domain != null)
|
||||||
{
|
{
|
||||||
Add(domain.Name, domain.Data);
|
foreach (var domain in config.Domain)
|
||||||
|
{
|
||||||
|
Add(domain.Name, domain.Data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
config.Domain = new List<Module>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,20 +232,20 @@ namespace ASC.Data.Storage
|
|||||||
//Make tennant path
|
//Make tennant path
|
||||||
tenant = TenantPath.CreatePath(tenant);
|
tenant = TenantPath.CreatePath(tenant);
|
||||||
|
|
||||||
var store = DataStoreCache.Get(tenant, module);
|
//remove cache
|
||||||
if (store == null)
|
//var store = DataStoreCache.Get(tenant, module);
|
||||||
|
//if (store == null)
|
||||||
|
//{
|
||||||
|
var section = StorageFactoryConfig.Section;
|
||||||
|
if (section == null)
|
||||||
{
|
{
|
||||||
var section = StorageFactoryConfig.Section;
|
throw new InvalidOperationException("config section not found");
|
||||||
if (section == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("config section not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
var settings = SettingsManager.LoadForTenant<StorageSettings>(tenantId);
|
|
||||||
|
|
||||||
store = GetStoreAndCache(tenant, module, StorageSettingsHelper.DataStoreConsumer(settings), controller);
|
|
||||||
}
|
}
|
||||||
return store;
|
|
||||||
|
var settings = SettingsManager.LoadForTenant<StorageSettings>(tenantId);
|
||||||
|
|
||||||
|
//}
|
||||||
|
return GetDataStore(tenant, module, StorageSettingsHelper.DataStoreConsumer(settings), controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDataStore GetStorageFromConsumer(string configpath, string tenant, string module, DataStoreConsumer consumer)
|
public IDataStore GetStorageFromConsumer(string configpath, string tenant, string module, DataStoreConsumer consumer)
|
||||||
|
@ -500,7 +500,7 @@ namespace ASC.ElasticSearch
|
|||||||
|
|
||||||
private IIndexRequest<T> GetMeta(IndexDescriptor<T> request, T data, bool immediately = true)
|
private IIndexRequest<T> GetMeta(IndexDescriptor<T> request, T data, bool immediately = true)
|
||||||
{
|
{
|
||||||
var result = request.Index(IndexName).Id(data.Id);
|
var result = request.Index(data.IndexName).Id(data.Id);
|
||||||
|
|
||||||
if (immediately)
|
if (immediately)
|
||||||
{
|
{
|
||||||
|
@ -43,7 +43,8 @@ namespace ASC.ElasticSearch
|
|||||||
{
|
{
|
||||||
public class Client
|
public class Client
|
||||||
{
|
{
|
||||||
private static volatile ElasticClient client;
|
private static volatile ElasticClient client;
|
||||||
|
private bool IsInit;
|
||||||
private static readonly object Locker = new object();
|
private static readonly object Locker = new object();
|
||||||
|
|
||||||
public ILog Log { get; }
|
public ILog Log { get; }
|
||||||
@ -92,8 +93,35 @@ namespace ASC.ElasticSearch
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return client = new ElasticClient(settings);
|
|
||||||
|
client = new ElasticClient(settings);
|
||||||
|
|
||||||
|
if (!IsInit)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = client.Ping(new PingRequest());
|
||||||
|
|
||||||
|
var isValid = result.IsValid;
|
||||||
|
|
||||||
|
if (result.IsValid)
|
||||||
|
{
|
||||||
|
client.PutPipeline("attachments", p => p
|
||||||
|
.Processors(pp => pp
|
||||||
|
.Attachment<Attachment>(a => a.Field("document.data").TargetField("document.attachment"))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
IsInit = true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return client;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -440,7 +440,10 @@ namespace ASC.ElasticSearch
|
|||||||
Client client,
|
Client client,
|
||||||
IOptionsMonitor<ILog> options,
|
IOptionsMonitor<ILog> options,
|
||||||
CoreBaseSettings coreBaseSettings)
|
CoreBaseSettings coreBaseSettings)
|
||||||
{
|
{
|
||||||
|
Client = client;
|
||||||
|
CoreBaseSettings = coreBaseSettings;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Log = options.Get("ASC.Indexer");
|
Log = options.Get("ASC.Indexer");
|
||||||
@ -450,26 +453,11 @@ namespace ASC.ElasticSearch
|
|||||||
Builder = container;
|
Builder = container;
|
||||||
Init = true;
|
Init = true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CheckState())
|
|
||||||
{
|
|
||||||
client.Instance.PutPipeline("attachments", p => p
|
|
||||||
.Processors(pp => pp
|
|
||||||
.Attachment<Attachment>(a => a.Field("document.data").TargetField("document.attachment"))
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Log.Fatal("FactoryIndexer", e);
|
Log.Fatal("FactoryIndexer", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Client = client;
|
|
||||||
CoreBaseSettings = coreBaseSettings;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CheckState(bool cacheState = true)
|
public bool CheckState(bool cacheState = true)
|
||||||
|
@ -73,7 +73,7 @@
|
|||||||
"visible": false,
|
"visible": false,
|
||||||
"data": "00000000-0000-0000-0000-000000000000",
|
"data": "00000000-0000-0000-0000-000000000000",
|
||||||
"type": "disc",
|
"type": "disc",
|
||||||
"path": "Products\\Files\\DocStore",
|
"path": "DocStore",
|
||||||
"virtualpath": "~/products/files/docstore",
|
"virtualpath": "~/products/files/docstore",
|
||||||
"appendTenantId": false,
|
"appendTenantId": false,
|
||||||
"public": true,
|
"public": true,
|
||||||
|
@ -522,15 +522,15 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
return new ItemList<File>(result);
|
return new ItemList<File>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Read("folders-files-createfile")]
|
[Create("folders-files-createfile")]
|
||||||
public File CreateNewFile(string parentId, string title)
|
public File CreateNewFile(FileWrapper fileWrapper)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(title) || string.IsNullOrEmpty(parentId)) throw new ArgumentException();
|
if (string.IsNullOrEmpty(fileWrapper.Title) || string.IsNullOrEmpty(fileWrapper.ParentId)) throw new ArgumentException();
|
||||||
|
|
||||||
var fileDao = GetFileDao();
|
var fileDao = GetFileDao();
|
||||||
var folderDao = GetFolderDao();
|
var folderDao = GetFolderDao();
|
||||||
|
|
||||||
var folder = folderDao.GetFolder(parentId);
|
var folder = folderDao.GetFolder(fileWrapper.ParentId);
|
||||||
ErrorIf(folder == null, FilesCommonResource.ErrorMassage_FolderNotFound);
|
ErrorIf(folder == null, FilesCommonResource.ErrorMassage_FolderNotFound);
|
||||||
ErrorIf(folder.RootFolderType == FolderType.TRASH, FilesCommonResource.ErrorMassage_CreateNewFolderInTrash);
|
ErrorIf(folder.RootFolderType == FolderType.TRASH, FilesCommonResource.ErrorMassage_CreateNewFolderInTrash);
|
||||||
ErrorIf(!FileSecurity.CanCreate(folder), FilesCommonResource.ErrorMassage_SecurityException_Create);
|
ErrorIf(!FileSecurity.CanCreate(folder), FilesCommonResource.ErrorMassage_SecurityException_Create);
|
||||||
@ -539,15 +539,15 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
file.FolderID = folder.ID;
|
file.FolderID = folder.ID;
|
||||||
file.Comment = FilesCommonResource.CommentCreate;
|
file.Comment = FilesCommonResource.CommentCreate;
|
||||||
|
|
||||||
var fileExt = FileUtility.GetInternalExtension(title);
|
var fileExt = FileUtility.GetInternalExtension(fileWrapper.Title);
|
||||||
if (!FileUtility.InternalExtension.Values.Contains(fileExt))
|
if (!FileUtility.InternalExtension.Values.Contains(fileExt))
|
||||||
{
|
{
|
||||||
fileExt = FileUtility.InternalExtension[FileType.Document];
|
fileExt = FileUtility.InternalExtension[FileType.Document];
|
||||||
file.Title = title + fileExt;
|
file.Title = fileWrapper.Title + fileExt;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
file.Title = FileUtility.ReplaceFileExtension(title, fileExt);
|
file.Title = FileUtility.ReplaceFileExtension(fileWrapper.Title, fileExt);
|
||||||
}
|
}
|
||||||
|
|
||||||
var culture = UserManager.GetUsers(AuthContext.CurrentAccount.ID).GetCulture();
|
var culture = UserManager.GetUsers(AuthContext.CurrentAccount.ID).GetCulture();
|
||||||
@ -619,7 +619,7 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
var result = new ItemDictionary<string, string>();
|
var result = new ItemDictionary<string, string>();
|
||||||
|
|
||||||
var fileDao = GetFileDao();
|
var fileDao = GetFileDao();
|
||||||
var ids = filesId.Where(FileTracker.IsEditing).Select(id => (object)id).ToArray();
|
var ids = filesId.Where(FileTracker.IsEditing).Select(id => id).ToArray();
|
||||||
|
|
||||||
foreach (var file in fileDao.GetFiles(ids))
|
foreach (var file in fileDao.GetFiles(ids))
|
||||||
{
|
{
|
||||||
@ -2123,4 +2123,10 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class FileWrapper
|
||||||
|
{
|
||||||
|
public string ParentId { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
@ -98,7 +98,7 @@ namespace ASC.Files.Core.Data
|
|||||||
protected IQueryable<T> Query<T>(Expression<Func<FilesDbContext, DbSet<T>>> func) where T : class, IDbFile
|
protected IQueryable<T> Query<T>(Expression<Func<FilesDbContext, DbSet<T>>> func) where T : class, IDbFile
|
||||||
{
|
{
|
||||||
var compile = func.Compile();
|
var compile = func.Compile();
|
||||||
return compile(FilesDbContext).Where(r => r.TenantId == 1);
|
return compile(FilesDbContext).Where(r => r.TenantId == TenantID);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IQueryable<DbFile> GetFileQuery(Expression<Func<DbFile, bool>> where)
|
protected IQueryable<DbFile> GetFileQuery(Expression<Func<DbFile, bool>> where)
|
||||||
@ -111,7 +111,8 @@ namespace ASC.Files.Core.Data
|
|||||||
{
|
{
|
||||||
var folders = FilesDbContext.Folders
|
var folders = FilesDbContext.Folders
|
||||||
.Where(r => r.TenantId == TenantID)
|
.Where(r => r.TenantId == TenantID)
|
||||||
.Where(r => FilesDbContext.Tree.Where(r => (object)r.FolderId == folderId).Select(r => r.ParentId).Any(a => a == r.Id));
|
.Where(r => FilesDbContext.Tree.Where(r => r.FolderId.ToString() == folderId.ToString()).Select(r => r.ParentId).Any(a => a == r.Id))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
foreach (var f in folders)
|
foreach (var f in folders)
|
||||||
{
|
{
|
||||||
|
@ -217,9 +217,10 @@ namespace ASC.Files.Core.Data
|
|||||||
var query = GetFileQuery(r => r.FolderId.ToString() == parentId.ToString() && r.CurrentVersion).Select(r => r.Id);
|
var query = GetFileQuery(r => r.FolderId.ToString() == parentId.ToString() && r.CurrentVersion).Select(r => r.Id);
|
||||||
|
|
||||||
return Query(r => r.Files)
|
return Query(r => r.Files)
|
||||||
.Where(r => (object)r.FolderId == parentId && r.CurrentVersion)
|
.Where(r => r.FolderId.ToString() == parentId.ToString() && r.CurrentVersion)
|
||||||
.Select(r => (object)r.Id)
|
.Select(r => r.Id)
|
||||||
.ToList();
|
.ToList()
|
||||||
|
.ConvertAll(r => (object)r);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<File> GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false)
|
public List<File> GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false)
|
||||||
@ -359,7 +360,7 @@ namespace ASC.Files.Core.Data
|
|||||||
}
|
}
|
||||||
|
|
||||||
var isNew = false;
|
var isNew = false;
|
||||||
List<object> parentFoldersIds;
|
List<int> parentFoldersIds;
|
||||||
lock (syncRoot)
|
lock (syncRoot)
|
||||||
{
|
{
|
||||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||||
@ -382,12 +383,14 @@ namespace ASC.Files.Core.Data
|
|||||||
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
||||||
|
|
||||||
var toUpdate = FilesDbContext.Files
|
var toUpdate = FilesDbContext.Files
|
||||||
.Where(r => (object)r.Id == file.ID && r.CurrentVersion && r.TenantId == TenantID)
|
.Where(r => r.Id.ToString() == file.ID.ToString() && r.CurrentVersion && r.TenantId == TenantID)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|
||||||
toUpdate.CurrentVersion = false;
|
if (toUpdate != null)
|
||||||
FilesDbContext.SaveChanges();
|
{
|
||||||
|
toUpdate.CurrentVersion = false;
|
||||||
|
FilesDbContext.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
var toInsert = new DbFile
|
var toInsert = new DbFile
|
||||||
{
|
{
|
||||||
@ -421,13 +424,13 @@ namespace ASC.Files.Core.Data
|
|||||||
FilesDbContext.Tree
|
FilesDbContext.Tree
|
||||||
.Where(r => r.FolderId == (int)file.FolderID)
|
.Where(r => r.FolderId == (int)file.FolderID)
|
||||||
.OrderByDescending(r => r.Level)
|
.OrderByDescending(r => r.Level)
|
||||||
.Select(r => (object)r.ParentId)
|
.Select(r => r.ParentId)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
if (parentFoldersIds.Count > 0)
|
if (parentFoldersIds.Count > 0)
|
||||||
{
|
{
|
||||||
var folderToUpdate = FilesDbContext.Folders
|
var folderToUpdate = FilesDbContext.Folders
|
||||||
.Where(r => parentFoldersIds.Any(a => a == (object)r.Id));
|
.Where(r => parentFoldersIds.Any(a => a == r.Id));
|
||||||
|
|
||||||
foreach (var f in folderToUpdate)
|
foreach (var f in folderToUpdate)
|
||||||
{
|
{
|
||||||
@ -491,7 +494,7 @@ namespace ASC.Files.Core.Data
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<object> parentFoldersIds;
|
List<int> parentFoldersIds;
|
||||||
lock (syncRoot)
|
lock (syncRoot)
|
||||||
{
|
{
|
||||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||||
@ -506,7 +509,7 @@ namespace ASC.Files.Core.Data
|
|||||||
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
||||||
|
|
||||||
var toUpdate = FilesDbContext.Files
|
var toUpdate = FilesDbContext.Files
|
||||||
.Where(r => (object)r.Id == file.ID && r.Version == file.Version)
|
.Where(r => r.Id.ToString() == file.ID.ToString() && r.Version == file.Version)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|
||||||
toUpdate.Version = file.Version;
|
toUpdate.Version = file.Version;
|
||||||
@ -533,13 +536,13 @@ namespace ASC.Files.Core.Data
|
|||||||
parentFoldersIds = FilesDbContext.Tree
|
parentFoldersIds = FilesDbContext.Tree
|
||||||
.Where(r => r.FolderId == (int)file.FolderID)
|
.Where(r => r.FolderId == (int)file.FolderID)
|
||||||
.OrderByDescending(r => r.Level)
|
.OrderByDescending(r => r.Level)
|
||||||
.Select(r => (object)r.ParentId)
|
.Select(r => r.ParentId)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
if (parentFoldersIds.Count > 0)
|
if (parentFoldersIds.Count > 0)
|
||||||
{
|
{
|
||||||
var folderToUpdate = FilesDbContext.Folders
|
var folderToUpdate = FilesDbContext.Folders
|
||||||
.Where(r => parentFoldersIds.Any(a => a == (object)r.Id));
|
.Where(r => parentFoldersIds.Any(a => a == r.Id));
|
||||||
|
|
||||||
foreach (var f in folderToUpdate)
|
foreach (var f in folderToUpdate)
|
||||||
{
|
{
|
||||||
@ -923,7 +926,7 @@ namespace ASC.Files.Core.Data
|
|||||||
{
|
{
|
||||||
var toUpdate = Query(r => r.Files)
|
var toUpdate = Query(r => r.Files)
|
||||||
.Where(r => r.CurrentVersion)
|
.Where(r => r.CurrentVersion)
|
||||||
.Where(r => fileIds.Any(a => a == (object)r.Id));
|
.Where(r => fileIds.Any(a => a.ToString() == r.Id.ToString()));
|
||||||
|
|
||||||
foreach (var f in toUpdate)
|
foreach (var f in toUpdate)
|
||||||
{
|
{
|
||||||
@ -939,7 +942,7 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
var q = GetFileQuery(r => r.CurrentVersion)
|
var q = GetFileQuery(r => r.CurrentVersion)
|
||||||
.Join(FilesDbContext.Tree, a => a.FolderId, t => t.FolderId, (file, tree) => new { file, tree })
|
.Join(FilesDbContext.Tree, a => a.FolderId, t => t.FolderId, (file, tree) => new { file, tree })
|
||||||
.Where(r => parentIds.Any(a => a == (object)r.tree.ParentId))
|
.Where(r => parentIds.Any(a => a.ToString() == r.tree.ParentId.ToString()))
|
||||||
.Select(r => r.file);
|
.Select(r => r.file);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(searchText))
|
if (!string.IsNullOrEmpty(searchText))
|
||||||
@ -1099,13 +1102,6 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private static ForcesaveType ParseForcesaveType(object v)
|
|
||||||
{
|
|
||||||
return v != null
|
|
||||||
? (ForcesaveType)Enum.Parse(typeof(ForcesaveType), v.ToString().Substring(0, 1))
|
|
||||||
: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Func<Selector<FilesWrapper>, Selector<FilesWrapper>> GetFuncForSearch(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false)
|
private Func<Selector<FilesWrapper>, Selector<FilesWrapper>> GetFuncForSearch(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false)
|
||||||
{
|
{
|
||||||
return s =>
|
return s =>
|
||||||
@ -1180,7 +1176,7 @@ namespace ASC.Files.Core.Data
|
|||||||
protected List<File> FromQueryWithShared(IQueryable<DbFile> dbFiles)
|
protected List<File> FromQueryWithShared(IQueryable<DbFile> dbFiles)
|
||||||
{
|
{
|
||||||
return dbFiles
|
return dbFiles
|
||||||
.Select(r => new
|
.Select(r => new DbFileQuery
|
||||||
{
|
{
|
||||||
file = r,
|
file = r,
|
||||||
root =
|
root =
|
||||||
@ -1198,36 +1194,14 @@ namespace ASC.Files.Core.Data
|
|||||||
.Any()
|
.Any()
|
||||||
})
|
})
|
||||||
.ToList()
|
.ToList()
|
||||||
.Select(r =>
|
.Select(ToFile)
|
||||||
{
|
.ToList();
|
||||||
var file = ServiceProvider.GetService<File>();
|
|
||||||
file.ID = r.file.Id;
|
|
||||||
file.Title = r.file.Title;
|
|
||||||
file.FolderID = r.file.FolderId;
|
|
||||||
file.CreateOn = TenantUtil.DateTimeFromUtc(r.file.CreateOn);
|
|
||||||
file.CreateBy = r.file.CreateBy;
|
|
||||||
file.Version = r.file.Version;
|
|
||||||
file.VersionGroup = r.file.VersionGroup;
|
|
||||||
file.ContentLength = r.file.ContentLength;
|
|
||||||
file.ModifiedOn = TenantUtil.DateTimeFromUtc(r.file.ModifiedOn);
|
|
||||||
file.ModifiedBy = r.file.ModifiedBy;
|
|
||||||
file.RootFolderType = r.root.FolderType;
|
|
||||||
file.RootFolderCreator = r.root.CreateBy;
|
|
||||||
file.RootFolderId = r.root.Id;
|
|
||||||
file.Shared = r.shared;
|
|
||||||
file.ConvertedType = r.file.ConvertedType;
|
|
||||||
file.Comment = r.file.Comment;
|
|
||||||
file.Encrypted = r.file.Encrypted;
|
|
||||||
file.Forcesave = r.file.Forcesave;
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
).ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<File> FromQuery(IQueryable<DbFile> dbFiles)
|
protected List<File> FromQuery(IQueryable<DbFile> dbFiles)
|
||||||
{
|
{
|
||||||
return dbFiles
|
return dbFiles
|
||||||
.Select(r => new
|
.Select(r => new DbFileQuery
|
||||||
{
|
{
|
||||||
file = r,
|
file = r,
|
||||||
root = FilesDbContext.Folders
|
root = FilesDbContext.Folders
|
||||||
@ -1240,31 +1214,40 @@ namespace ASC.Files.Core.Data
|
|||||||
shared = true
|
shared = true
|
||||||
})
|
})
|
||||||
.ToList()
|
.ToList()
|
||||||
.Select(r =>
|
.Select(ToFile)
|
||||||
{
|
.ToList();
|
||||||
var file = ServiceProvider.GetService<File>();
|
|
||||||
file.ID = r.file.Id;
|
|
||||||
file.Title = r.file.Title;
|
|
||||||
file.FolderID = r.file.FolderId;
|
|
||||||
file.CreateOn = TenantUtil.DateTimeFromUtc(r.file.CreateOn);
|
|
||||||
file.CreateBy = r.file.CreateBy;
|
|
||||||
file.Version = r.file.Version;
|
|
||||||
file.VersionGroup = r.file.VersionGroup;
|
|
||||||
file.ContentLength = r.file.ContentLength;
|
|
||||||
file.ModifiedOn = TenantUtil.DateTimeFromUtc(r.file.ModifiedOn);
|
|
||||||
file.ModifiedBy = r.file.ModifiedBy;
|
|
||||||
file.RootFolderType = r.root.FolderType;
|
|
||||||
file.RootFolderCreator = r.root.CreateBy;
|
|
||||||
file.RootFolderId = r.root.Id;
|
|
||||||
file.Shared = r.shared;
|
|
||||||
file.ConvertedType = r.file.ConvertedType;
|
|
||||||
file.Comment = r.file.Comment;
|
|
||||||
file.Encrypted = r.file.Encrypted;
|
|
||||||
file.Forcesave = r.file.Forcesave;
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
).ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public File ToFile(DbFileQuery r)
|
||||||
|
{
|
||||||
|
var file = ServiceProvider.GetService<File>();
|
||||||
|
file.ID = r.file.Id;
|
||||||
|
file.Title = r.file.Title;
|
||||||
|
file.FolderID = r.file.FolderId;
|
||||||
|
file.CreateOn = TenantUtil.DateTimeFromUtc(r.file.CreateOn);
|
||||||
|
file.CreateBy = r.file.CreateBy;
|
||||||
|
file.Version = r.file.Version;
|
||||||
|
file.VersionGroup = r.file.VersionGroup;
|
||||||
|
file.ContentLength = r.file.ContentLength;
|
||||||
|
file.ModifiedOn = TenantUtil.DateTimeFromUtc(r.file.ModifiedOn);
|
||||||
|
file.ModifiedBy = r.file.ModifiedBy;
|
||||||
|
file.RootFolderType = r.root?.FolderType ?? default;
|
||||||
|
file.RootFolderCreator = r.root?.CreateBy ?? default;
|
||||||
|
file.RootFolderId = r.root?.Id ?? default;
|
||||||
|
file.Shared = r.shared;
|
||||||
|
file.ConvertedType = r.file.ConvertedType;
|
||||||
|
file.Comment = r.file.Comment;
|
||||||
|
file.Encrypted = r.file.Encrypted;
|
||||||
|
file.Forcesave = r.file.Forcesave;
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DbFileQuery
|
||||||
|
{
|
||||||
|
public DbFile file { get; set; }
|
||||||
|
public DbFolder root { get; set; }
|
||||||
|
public bool shared { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class FileDaoExtention
|
public static class FileDaoExtention
|
||||||
|
@ -223,13 +223,13 @@ namespace ASC.Files.Core.Data
|
|||||||
|| filterType == FilterType.ArchiveOnly || filterType == FilterType.MediaOnly)
|
|| filterType == FilterType.ArchiveOnly || filterType == FilterType.MediaOnly)
|
||||||
return new List<Folder>();
|
return new List<Folder>();
|
||||||
|
|
||||||
var q = GetFolderQuery(r => folderIds.Any(q => q == (object)r.Id));
|
var q = GetFolderQuery(r => folderIds.Any(q => q.ToString() == r.Id.ToString()));
|
||||||
|
|
||||||
if (searchSubfolders)
|
if (searchSubfolders)
|
||||||
{
|
{
|
||||||
q = GetFolderQuery()
|
q = GetFolderQuery()
|
||||||
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
|
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
|
||||||
.Where(r => folderIds.Any(q => q == (object)r.folder.ParentId))
|
.Where(r => folderIds.Any(q => q.ToString() == r.folder.ParentId.ToString()))
|
||||||
.Select(r => r.folder);
|
.Select(r => r.folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,7 +558,7 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
var childs = Query(r => r.Folders)
|
var childs = Query(r => r.Folders)
|
||||||
.Where(r => r.ParentId == (int)folderId)
|
.Where(r => r.ParentId == (int)folderId)
|
||||||
.Select(r => (object)r.Id);
|
.Select(r => r.Id.ToString());
|
||||||
|
|
||||||
foreach (var pair in CanMoveOrCopy(childs.ToArray(), conflict))
|
foreach (var pair in CanMoveOrCopy(childs.ToArray(), conflict))
|
||||||
{
|
{
|
||||||
@ -850,7 +850,7 @@ namespace ASC.Files.Core.Data
|
|||||||
protected IQueryable<DbFolder> GetFolderQuery(Expression<Func<DbFolder, bool>> where = null)
|
protected IQueryable<DbFolder> GetFolderQuery(Expression<Func<DbFolder, bool>> where = null)
|
||||||
{
|
{
|
||||||
var q = Query(r => r.Folders);
|
var q = Query(r => r.Folders);
|
||||||
if (q != null)
|
if (where != null)
|
||||||
{
|
{
|
||||||
q = q.Where(where);
|
q = q.Where(where);
|
||||||
}
|
}
|
||||||
@ -860,9 +860,9 @@ namespace ASC.Files.Core.Data
|
|||||||
protected List<Folder> FromQueryWithShared(IQueryable<DbFolder> dbFiles)
|
protected List<Folder> FromQueryWithShared(IQueryable<DbFolder> dbFiles)
|
||||||
{
|
{
|
||||||
return dbFiles
|
return dbFiles
|
||||||
.Select(r => new
|
.Select(r => new DbFolderQuery
|
||||||
{
|
{
|
||||||
file = r,
|
folder = r,
|
||||||
root = FilesDbContext.Folders
|
root = FilesDbContext.Folders
|
||||||
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
|
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
|
||||||
.Where(x => x.folder.TenantId == r.TenantId)
|
.Where(x => x.folder.TenantId == r.TenantId)
|
||||||
@ -870,40 +870,22 @@ namespace ASC.Files.Core.Data
|
|||||||
.OrderByDescending(r => r.tree.Level)
|
.OrderByDescending(r => r.tree.Level)
|
||||||
.Select(r => r.folder)
|
.Select(r => r.folder)
|
||||||
.FirstOrDefault(),
|
.FirstOrDefault(),
|
||||||
shared =
|
shared = FilesDbContext.Security
|
||||||
FilesDbContext.Security
|
.Where(r => r.EntryType == FileEntryType.Folder)
|
||||||
.Where(r => r.EntryType == FileEntryType.Folder)
|
.Where(x => x.EntryId == r.Id.ToString())
|
||||||
.Where(x => x.EntryId == r.Id.ToString())
|
.Any()
|
||||||
.Any()
|
|
||||||
})
|
})
|
||||||
.ToList()
|
.ToList()
|
||||||
.Select(r =>
|
.Select(ToFolder)
|
||||||
{
|
.ToList();
|
||||||
var result = ServiceProvider.GetService<Folder>();
|
|
||||||
result.ID = r.file.Id;
|
|
||||||
result.ParentFolderID = r.file.ParentId;
|
|
||||||
result.Title = r.file.Title;
|
|
||||||
result.CreateOn = TenantUtil.DateTimeFromUtc(r.file.CreateOn);
|
|
||||||
result.CreateBy = r.file.CreateBy;
|
|
||||||
result.ModifiedOn = TenantUtil.DateTimeFromUtc(r.file.ModifiedOn);
|
|
||||||
result.ModifiedBy = r.file.ModifiedBy;
|
|
||||||
result.FolderType = r.file.FolderType;
|
|
||||||
result.TotalSubFolders = r.file.FoldersCount;
|
|
||||||
result.TotalFiles = r.file.FilesCount;
|
|
||||||
result.RootFolderType = r.root.FolderType;
|
|
||||||
result.RootFolderCreator = r.root.CreateBy;
|
|
||||||
result.RootFolderId = r.root.Id;
|
|
||||||
result.Shared = r.shared;
|
|
||||||
return result;
|
|
||||||
}).ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<Folder> FromQuery(IQueryable<DbFolder> dbFiles)
|
protected List<Folder> FromQuery(IQueryable<DbFolder> dbFiles)
|
||||||
{
|
{
|
||||||
return dbFiles
|
return dbFiles
|
||||||
.Select(r => new
|
.Select(r => new DbFolderQuery
|
||||||
{
|
{
|
||||||
file = r,
|
folder = r,
|
||||||
root = FilesDbContext.Folders
|
root = FilesDbContext.Folders
|
||||||
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
|
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
|
||||||
.Where(x => x.folder.TenantId == r.TenantId)
|
.Where(x => x.folder.TenantId == r.TenantId)
|
||||||
@ -914,25 +896,28 @@ namespace ASC.Files.Core.Data
|
|||||||
shared = true
|
shared = true
|
||||||
})
|
})
|
||||||
.ToList()
|
.ToList()
|
||||||
.Select(r =>
|
.Select(ToFolder)
|
||||||
{
|
.ToList();
|
||||||
var result = ServiceProvider.GetService<Folder>();
|
}
|
||||||
result.ID = r.file.Id;
|
|
||||||
result.ParentFolderID = r.file.ParentId;
|
public Folder ToFolder(DbFolderQuery r)
|
||||||
result.Title = r.file.Title;
|
{
|
||||||
result.CreateOn = TenantUtil.DateTimeFromUtc(r.file.CreateOn);
|
var result = ServiceProvider.GetService<Folder>();
|
||||||
result.CreateBy = r.file.CreateBy;
|
result.ID = r.folder.Id;
|
||||||
result.ModifiedOn = TenantUtil.DateTimeFromUtc(r.file.ModifiedOn);
|
result.ParentFolderID = r.folder.ParentId;
|
||||||
result.ModifiedBy = r.file.ModifiedBy;
|
result.Title = r.folder.Title;
|
||||||
result.FolderType = r.file.FolderType;
|
result.CreateOn = TenantUtil.DateTimeFromUtc(r.folder.CreateOn);
|
||||||
result.TotalSubFolders = r.file.FoldersCount;
|
result.CreateBy = r.folder.CreateBy;
|
||||||
result.TotalFiles = r.file.FilesCount;
|
result.ModifiedOn = TenantUtil.DateTimeFromUtc(r.folder.ModifiedOn);
|
||||||
result.RootFolderType = r.root.FolderType;
|
result.ModifiedBy = r.folder.ModifiedBy;
|
||||||
result.RootFolderCreator = r.root.CreateBy;
|
result.FolderType = r.folder.FolderType;
|
||||||
result.RootFolderId = r.root.Id;
|
result.TotalSubFolders = r.folder.FoldersCount;
|
||||||
result.Shared = r.shared;
|
result.TotalFiles = r.folder.FilesCount;
|
||||||
return result;
|
result.RootFolderType = r.root?.FolderType ?? default;
|
||||||
}).ToList();
|
result.RootFolderCreator = r.root?.CreateBy ?? default;
|
||||||
|
result.RootFolderId = r.root?.Id ?? default;
|
||||||
|
result.Shared = r.shared;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetBunchObjectID(object folderID)
|
public string GetBunchObjectID(object folderID)
|
||||||
@ -1003,6 +988,14 @@ namespace ASC.Files.Core.Data
|
|||||||
//return projectTitle;
|
//return projectTitle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DbFolderQuery
|
||||||
|
{
|
||||||
|
public DbFolder folder { get; set; }
|
||||||
|
public DbFolder root { get; set; }
|
||||||
|
public bool shared { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public static class FolderDaoExtention
|
public static class FolderDaoExtention
|
||||||
{
|
{
|
||||||
public static DIHelper AddFolderDaoService(this DIHelper services)
|
public static DIHelper AddFolderDaoService(this DIHelper services)
|
||||||
|
@ -283,14 +283,18 @@ namespace ASC.Files.Core.Data
|
|||||||
var q = Query(r => r.Security)
|
var q = Query(r => r.Security)
|
||||||
.Join(FilesDbContext.Tree, r => r.EntryId, a => a.ParentId.ToString(), (security, tree) => new SecurityTreeRecord { DbFilesSecurity = security, DbFolderTree = tree })
|
.Join(FilesDbContext.Tree, r => r.EntryId, a => a.ParentId.ToString(), (security, tree) => new SecurityTreeRecord { DbFilesSecurity = security, DbFolderTree = tree })
|
||||||
.Where(r => folders.Any(f => f == r.DbFolderTree.FolderId))
|
.Where(r => folders.Any(f => f == r.DbFolderTree.FolderId))
|
||||||
.Where(r => r.DbFilesSecurity.EntryType == FileEntryType.Folder);
|
.Where(r => r.DbFilesSecurity.EntryType == FileEntryType.Folder)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
if (0 < files.Count)
|
if (0 < files.Count)
|
||||||
{
|
{
|
||||||
q = q.Union(GetQuery(r => files.Any(f => f == r.EntryId) && r.EntryType == FileEntryType.File).Select(r => new SecurityTreeRecord { DbFilesSecurity = r, DbFolderTree = new DbFolderTree() { Level = -1 } }));
|
var q1 = GetQuery(r => files.Any(f => f == r.EntryId) && r.EntryType == FileEntryType.File)
|
||||||
|
.Select(r => new SecurityTreeRecord { DbFilesSecurity = r })
|
||||||
|
.ToList();
|
||||||
|
q = q.Union(q1).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return FromQuery(q)
|
return q.Select(ToFileShareRecord)
|
||||||
.OrderBy(r => r.Level)
|
.OrderBy(r => r.Level)
|
||||||
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
|
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
|
||||||
.ToList();
|
.ToList();
|
||||||
@ -350,7 +354,7 @@ namespace ASC.Files.Core.Data
|
|||||||
private FileShareRecord ToFileShareRecord(SecurityTreeRecord r)
|
private FileShareRecord ToFileShareRecord(SecurityTreeRecord r)
|
||||||
{
|
{
|
||||||
var result = ToFileShareRecord(r.DbFilesSecurity);
|
var result = ToFileShareRecord(r.DbFilesSecurity);
|
||||||
result.Level = r.DbFolderTree.Level;
|
result.Level = r.DbFolderTree?.Level ?? -1;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -539,7 +539,7 @@ namespace ASC.Files.Core.Data
|
|||||||
subFoldersSqlQuery = subFoldersSqlQuery.Where(r => r.Level == 1);
|
subFoldersSqlQuery = subFoldersSqlQuery.Where(r => r.Level == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
monitorFolderIds = monitorFolderIds.Concat(subFoldersSqlQuery.Select(r => (object)r.FolderId));
|
monitorFolderIds = monitorFolderIds.Concat(subFoldersSqlQuery.Select(r => r.FolderId).ToList().ConvertAll(r => (object)r));
|
||||||
|
|
||||||
var newTagsForFolders = getBaseSqlQuery()
|
var newTagsForFolders = getBaseSqlQuery()
|
||||||
.Where(r => monitorFolderIds.Any(a => r.Link.EntryId == a.ToString()))
|
.Where(r => monitorFolderIds.Any(a => r.Link.EntryId == a.ToString()))
|
||||||
|
@ -80,6 +80,11 @@ namespace ASC.Web.Files.Core.Search
|
|||||||
protected override string Table { get { return "files_file"; } }
|
protected override string Table { get { return "files_file"; } }
|
||||||
|
|
||||||
|
|
||||||
|
public FilesWrapper()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public FilesWrapper(IServiceProvider serviceProvider, TenantManager tenantManager, FileUtility fileUtility, IDaoFactory daoFactory)
|
public FilesWrapper(IServiceProvider serviceProvider, TenantManager tenantManager, FileUtility fileUtility, IDaoFactory daoFactory)
|
||||||
{
|
{
|
||||||
ServiceProvider = serviceProvider;
|
ServiceProvider = serviceProvider;
|
||||||
@ -88,7 +93,7 @@ namespace ASC.Web.Files.Core.Search
|
|||||||
DaoFactory = daoFactory;
|
DaoFactory = daoFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FilesWrapper GetFilesWrapper(IServiceProvider serviceProvider, File d, List<object> parentFolders = null)
|
public static FilesWrapper GetFilesWrapper(IServiceProvider serviceProvider, File d, List<int> parentFolders = null)
|
||||||
{
|
{
|
||||||
var wrapper = serviceProvider.GetService<FilesWrapper>();
|
var wrapper = serviceProvider.GetService<FilesWrapper>();
|
||||||
var tenantManager = serviceProvider.GetService<TenantManager>();
|
var tenantManager = serviceProvider.GetService<TenantManager>();
|
||||||
@ -133,10 +138,10 @@ namespace ASC.Web.Files.Core.Search
|
|||||||
get { return FilesCommonResource.IndexTitle; }
|
get { return FilesCommonResource.IndexTitle; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IServiceProvider ServiceProvider { get; }
|
private IServiceProvider ServiceProvider { get; }
|
||||||
public TenantManager TenantManager { get; }
|
private TenantManager TenantManager { get; }
|
||||||
public FileUtility FileUtility { get; }
|
private FileUtility FileUtility { get; }
|
||||||
public IDaoFactory DaoFactory { get; }
|
private IDaoFactory DaoFactory { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class FilesFoldersWrapper : Wrapper
|
public sealed class FilesFoldersWrapper : Wrapper
|
||||||
|
@ -27,9 +27,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
using ASC.Files.Core;
|
using ASC.Files.Core;
|
||||||
using ASC.Web.Files.Helpers;
|
using ASC.Web.Files.Helpers;
|
||||||
using ASC.Web.Files.Services.WCFService.FileOperations;
|
using ASC.Web.Files.Services.WCFService.FileOperations;
|
||||||
|
|
||||||
using File = ASC.Files.Core.File;
|
using File = ASC.Files.Core.File;
|
||||||
using FileShare = ASC.Files.Core.Security.FileShare;
|
using FileShare = ASC.Files.Core.Security.FileShare;
|
||||||
|
|
||||||
@ -71,7 +73,7 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
|
|
||||||
File GetFile(string fileId, int version);
|
File GetFile(string fileId, int version);
|
||||||
|
|
||||||
File CreateNewFile(string parentId, string fileTitle);
|
File CreateNewFile(FileWrapper fileWrapper);
|
||||||
|
|
||||||
File FileRename(string fileId, string title);
|
File FileRename(string fileId, string title);
|
||||||
|
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
using ASC.Api.Core.Auth;
|
using ASC.Api.Core.Auth;
|
||||||
using ASC.Api.Core.Core;
|
using ASC.Api.Core.Core;
|
||||||
using ASC.Api.Core.Middleware;
|
using ASC.Api.Core.Middleware;
|
||||||
using ASC.Common;
|
using ASC.Common;
|
||||||
using ASC.Common.DependencyInjection;
|
using ASC.Common.DependencyInjection;
|
||||||
using ASC.Common.Logging;
|
using ASC.Common.Logging;
|
||||||
using ASC.Common.Threading.Workers;
|
|
||||||
using ASC.Web.Files.Services.WCFService;
|
using ASC.Web.Files.Services.WCFService;
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Authentication;
|
using Microsoft.AspNetCore.Authentication;
|
||||||
@ -23,8 +20,6 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
using static ASC.Web.Files.Utils.FileMarker;
|
|
||||||
|
|
||||||
namespace ASC.Files
|
namespace ASC.Files
|
||||||
{
|
{
|
||||||
public class Startup
|
public class Startup
|
||||||
@ -81,14 +76,6 @@ namespace ASC.Files
|
|||||||
.AddProductSecurityFilter()
|
.AddProductSecurityFilter()
|
||||||
.AddTenantStatusFilter();
|
.AddTenantStatusFilter();
|
||||||
|
|
||||||
services.Configure<WorkerQueue<AsyncTaskData>>(r =>
|
|
||||||
{
|
|
||||||
r.workerCount = 1;
|
|
||||||
r.waitInterval = (int)TimeSpan.FromSeconds(60).TotalMilliseconds;
|
|
||||||
r.errorCount = 1;
|
|
||||||
r.stopAfterFinsih = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
diHelper.AddNLogManager("ASC.Files");
|
diHelper.AddNLogManager("ASC.Files");
|
||||||
|
|
||||||
diHelper.AddFileStorageServiceController();
|
diHelper.AddFileStorageServiceController();
|
||||||
|
@ -50,6 +50,10 @@ namespace ASC.Web.Files.Utils
|
|||||||
|
|
||||||
public ChunkedUploadSessionHolder(IOptionsMonitor<ILog> options, GlobalStore globalStore, SetupInfo setupInfo)
|
public ChunkedUploadSessionHolder(IOptionsMonitor<ILog> options, GlobalStore globalStore, SetupInfo setupInfo)
|
||||||
{
|
{
|
||||||
|
Options = options;
|
||||||
|
GlobalStore = globalStore;
|
||||||
|
SetupInfo = setupInfo;
|
||||||
|
|
||||||
// clear old sessions
|
// clear old sessions
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -59,10 +63,6 @@ namespace ASC.Web.Files.Utils
|
|||||||
{
|
{
|
||||||
options.CurrentValue.Error(err);
|
options.CurrentValue.Error(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
Options = options;
|
|
||||||
GlobalStore = globalStore;
|
|
||||||
SetupInfo = setupInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StoreSession(ChunkedUploadSession s)
|
public void StoreSession(ChunkedUploadSession s)
|
||||||
|
@ -31,6 +31,7 @@ using System.Security;
|
|||||||
|
|
||||||
using ASC.Common;
|
using ASC.Common;
|
||||||
using ASC.Common.Caching;
|
using ASC.Common.Caching;
|
||||||
|
using ASC.Common.Logging;
|
||||||
using ASC.Common.Threading.Workers;
|
using ASC.Common.Threading.Workers;
|
||||||
using ASC.Core;
|
using ASC.Core;
|
||||||
using ASC.Core.Users;
|
using ASC.Core.Users;
|
||||||
@ -41,6 +42,7 @@ using ASC.Files.Resources;
|
|||||||
using ASC.Web.Files.Classes;
|
using ASC.Web.Files.Classes;
|
||||||
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
using static ASC.Web.Files.Utils.FileMarker;
|
using static ASC.Web.Files.Utils.FileMarker;
|
||||||
|
|
||||||
@ -48,6 +50,33 @@ using File = ASC.Files.Core.File;
|
|||||||
|
|
||||||
namespace ASC.Web.Files.Utils
|
namespace ASC.Web.Files.Utils
|
||||||
{
|
{
|
||||||
|
public class FileMarkerHelper
|
||||||
|
{
|
||||||
|
private IServiceProvider ServiceProvider { get; }
|
||||||
|
public ILog Log { get; }
|
||||||
|
|
||||||
|
public FileMarkerHelper(IServiceProvider serviceProvider, IOptionsMonitor<ILog> optionsMonitor)
|
||||||
|
{
|
||||||
|
ServiceProvider = serviceProvider;
|
||||||
|
Log = optionsMonitor.CurrentValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void ExecMarkFileAsNew(AsyncTaskData obj)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var scope = ServiceProvider.CreateScope();
|
||||||
|
var fileMarker = scope.ServiceProvider.GetService<FileMarker>();
|
||||||
|
fileMarker.ExecMarkFileAsNew(obj);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public class FileMarker
|
public class FileMarker
|
||||||
{
|
{
|
||||||
private static readonly object locker = new object();
|
private static readonly object locker = new object();
|
||||||
@ -64,6 +93,7 @@ namespace ASC.Web.Files.Utils
|
|||||||
public CoreBaseSettings CoreBaseSettings { get; }
|
public CoreBaseSettings CoreBaseSettings { get; }
|
||||||
public AuthContext AuthContext { get; }
|
public AuthContext AuthContext { get; }
|
||||||
public IServiceProvider ServiceProvider { get; }
|
public IServiceProvider ServiceProvider { get; }
|
||||||
|
public FileMarkerHelper FileMarkerHelper { get; }
|
||||||
|
|
||||||
public FileMarker(
|
public FileMarker(
|
||||||
TenantManager tenantManager,
|
TenantManager tenantManager,
|
||||||
@ -74,7 +104,8 @@ namespace ASC.Web.Files.Utils
|
|||||||
CoreBaseSettings coreBaseSettings,
|
CoreBaseSettings coreBaseSettings,
|
||||||
AuthContext authContext,
|
AuthContext authContext,
|
||||||
IServiceProvider serviceProvider,
|
IServiceProvider serviceProvider,
|
||||||
WorkerQueueOptionsManager<AsyncTaskData> workerQueueOptionsManager)
|
WorkerQueueOptionsManager<AsyncTaskData> workerQueueOptionsManager,
|
||||||
|
FileMarkerHelper fileMarkerHelper)
|
||||||
{
|
{
|
||||||
TenantManager = tenantManager;
|
TenantManager = tenantManager;
|
||||||
UserManager = userManager;
|
UserManager = userManager;
|
||||||
@ -84,11 +115,12 @@ namespace ASC.Web.Files.Utils
|
|||||||
CoreBaseSettings = coreBaseSettings;
|
CoreBaseSettings = coreBaseSettings;
|
||||||
AuthContext = authContext;
|
AuthContext = authContext;
|
||||||
ServiceProvider = serviceProvider;
|
ServiceProvider = serviceProvider;
|
||||||
|
FileMarkerHelper = fileMarkerHelper;
|
||||||
cache = AscCache.Memory;
|
cache = AscCache.Memory;
|
||||||
tasks = workerQueueOptionsManager.Value;
|
tasks = workerQueueOptionsManager.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ExecMarkFileAsNew(AsyncTaskData obj)
|
internal void ExecMarkFileAsNew(AsyncTaskData obj)
|
||||||
{
|
{
|
||||||
TenantManager.SetCurrentTenant(Convert.ToInt32(obj.TenantID));
|
TenantManager.SetCurrentTenant(Convert.ToInt32(obj.TenantID));
|
||||||
|
|
||||||
@ -281,7 +313,7 @@ namespace ASC.Web.Files.Utils
|
|||||||
tasks.Add(taskData);
|
tasks.Add(taskData);
|
||||||
|
|
||||||
if (!tasks.IsStarted)
|
if (!tasks.IsStarted)
|
||||||
tasks.Start(ExecMarkFileAsNew);
|
tasks.Start(FileMarkerHelper.ExecMarkFileAsNew);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -699,8 +731,21 @@ namespace ASC.Web.Files.Utils
|
|||||||
{
|
{
|
||||||
public static DIHelper AddFileMarkerService(this DIHelper services)
|
public static DIHelper AddFileMarkerService(this DIHelper services)
|
||||||
{
|
{
|
||||||
services.TryAddScoped<FileMarker>();
|
_ = services
|
||||||
services.TryAddSingleton<WorkerQueueOptionsManager<AsyncTaskData>>();
|
.TryAddTransient<AsyncTaskData>()
|
||||||
|
.TryAddScoped<FileMarker>()
|
||||||
|
.TryAddSingleton<FileMarkerHelper>()
|
||||||
|
.TryAddSingleton<WorkerQueueOptionsManager<AsyncTaskData>>()
|
||||||
|
.TryAddSingleton<WorkerQueue<AsyncTaskData>>()
|
||||||
|
.AddSingleton<IConfigureOptions<WorkerQueue<AsyncTaskData>>, ConfigureWorkerQueue<AsyncTaskData>>();
|
||||||
|
|
||||||
|
_ = services.Configure<WorkerQueue<AsyncTaskData>>(r =>
|
||||||
|
{
|
||||||
|
r.workerCount = 1;
|
||||||
|
r.waitInterval = (int)TimeSpan.FromSeconds(60).TotalMilliseconds;
|
||||||
|
r.errorCount = 1;
|
||||||
|
r.stopAfterFinsih = false;
|
||||||
|
});
|
||||||
|
|
||||||
return services
|
return services
|
||||||
.AddTenantManagerService()
|
.AddTenantManagerService()
|
||||||
|
@ -85,7 +85,7 @@ namespace ASC.People
|
|||||||
.AddProductSecurityFilter()
|
.AddProductSecurityFilter()
|
||||||
.AddTenantStatusFilter();
|
.AddTenantStatusFilter();
|
||||||
|
|
||||||
services.Configure<WorkerQueue<ResizeWorkerItem>>(r =>
|
diHelper.Configure<WorkerQueue<ResizeWorkerItem>>(r =>
|
||||||
{
|
{
|
||||||
r.workerCount = 2;
|
r.workerCount = 2;
|
||||||
r.waitInterval = (int)TimeSpan.FromSeconds(30).TotalMilliseconds;
|
r.waitInterval = (int)TimeSpan.FromSeconds(30).TotalMilliseconds;
|
||||||
@ -93,7 +93,7 @@ namespace ASC.People
|
|||||||
r.stopAfterFinsih = true;
|
r.stopAfterFinsih = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
services.Configure<ProgressQueue<ReassignProgressItem>>(r =>
|
diHelper.Configure<ProgressQueue<ReassignProgressItem>>(r =>
|
||||||
{
|
{
|
||||||
r.workerCount = 1;
|
r.workerCount = 1;
|
||||||
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
|
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
|
||||||
@ -102,7 +102,7 @@ namespace ASC.People
|
|||||||
r.errorCount = 0;
|
r.errorCount = 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
services.Configure<ProgressQueue<RemoveProgressItem>>(r =>
|
diHelper.Configure<ProgressQueue<RemoveProgressItem>>(r =>
|
||||||
{
|
{
|
||||||
r.workerCount = 1;
|
r.workerCount = 1;
|
||||||
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
|
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
|
||||||
|
Loading…
Reference in New Issue
Block a user