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) =>
|
||||
{
|
||||
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 ASC.Data.Storage.Configuration;
|
||||
|
||||
namespace ASC.Data.Storage
|
||||
@ -34,9 +35,16 @@ namespace ASC.Data.Storage
|
||||
public DataList(Module config)
|
||||
{
|
||||
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
|
||||
tenant = TenantPath.CreatePath(tenant);
|
||||
|
||||
var store = DataStoreCache.Get(tenant, module);
|
||||
if (store == null)
|
||||
//remove cache
|
||||
//var store = DataStoreCache.Get(tenant, module);
|
||||
//if (store == null)
|
||||
//{
|
||||
var section = StorageFactoryConfig.Section;
|
||||
if (section == null)
|
||||
{
|
||||
var section = StorageFactoryConfig.Section;
|
||||
if (section == null)
|
||||
{
|
||||
throw new InvalidOperationException("config section not found");
|
||||
}
|
||||
|
||||
var settings = SettingsManager.LoadForTenant<StorageSettings>(tenantId);
|
||||
|
||||
store = GetStoreAndCache(tenant, module, StorageSettingsHelper.DataStoreConsumer(settings), controller);
|
||||
throw new InvalidOperationException("config section not found");
|
||||
}
|
||||
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)
|
||||
|
@ -500,7 +500,7 @@ namespace ASC.ElasticSearch
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -43,7 +43,8 @@ namespace ASC.ElasticSearch
|
||||
{
|
||||
public class Client
|
||||
{
|
||||
private static volatile ElasticClient client;
|
||||
private static volatile ElasticClient client;
|
||||
private bool IsInit;
|
||||
private static readonly object Locker = new object();
|
||||
|
||||
public ILog Log { get; }
|
||||
@ -92,8 +93,35 @@ namespace ASC.ElasticSearch
|
||||
}
|
||||
});
|
||||
}
|
||||
#endif
|
||||
return client = new ElasticClient(settings);
|
||||
#endif
|
||||
|
||||
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,
|
||||
IOptionsMonitor<ILog> options,
|
||||
CoreBaseSettings coreBaseSettings)
|
||||
{
|
||||
{
|
||||
Client = client;
|
||||
CoreBaseSettings = coreBaseSettings;
|
||||
|
||||
try
|
||||
{
|
||||
Log = options.Get("ASC.Indexer");
|
||||
@ -450,26 +453,11 @@ namespace ASC.ElasticSearch
|
||||
Builder = container;
|
||||
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)
|
||||
{
|
||||
Log.Fatal("FactoryIndexer", e);
|
||||
}
|
||||
|
||||
Client = client;
|
||||
CoreBaseSettings = coreBaseSettings;
|
||||
}
|
||||
|
||||
public bool CheckState(bool cacheState = true)
|
||||
|
@ -73,7 +73,7 @@
|
||||
"visible": false,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"type": "disc",
|
||||
"path": "Products\\Files\\DocStore",
|
||||
"path": "DocStore",
|
||||
"virtualpath": "~/products/files/docstore",
|
||||
"appendTenantId": false,
|
||||
"public": true,
|
||||
|
@ -522,15 +522,15 @@ namespace ASC.Web.Files.Services.WCFService
|
||||
return new ItemList<File>(result);
|
||||
}
|
||||
|
||||
[Read("folders-files-createfile")]
|
||||
public File CreateNewFile(string parentId, string title)
|
||||
[Create("folders-files-createfile")]
|
||||
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 folderDao = GetFolderDao();
|
||||
|
||||
var folder = folderDao.GetFolder(parentId);
|
||||
var folder = folderDao.GetFolder(fileWrapper.ParentId);
|
||||
ErrorIf(folder == null, FilesCommonResource.ErrorMassage_FolderNotFound);
|
||||
ErrorIf(folder.RootFolderType == FolderType.TRASH, FilesCommonResource.ErrorMassage_CreateNewFolderInTrash);
|
||||
ErrorIf(!FileSecurity.CanCreate(folder), FilesCommonResource.ErrorMassage_SecurityException_Create);
|
||||
@ -539,15 +539,15 @@ namespace ASC.Web.Files.Services.WCFService
|
||||
file.FolderID = folder.ID;
|
||||
file.Comment = FilesCommonResource.CommentCreate;
|
||||
|
||||
var fileExt = FileUtility.GetInternalExtension(title);
|
||||
var fileExt = FileUtility.GetInternalExtension(fileWrapper.Title);
|
||||
if (!FileUtility.InternalExtension.Values.Contains(fileExt))
|
||||
{
|
||||
fileExt = FileUtility.InternalExtension[FileType.Document];
|
||||
file.Title = title + fileExt;
|
||||
file.Title = fileWrapper.Title + fileExt;
|
||||
}
|
||||
else
|
||||
{
|
||||
file.Title = FileUtility.ReplaceFileExtension(title, fileExt);
|
||||
file.Title = FileUtility.ReplaceFileExtension(fileWrapper.Title, fileExt);
|
||||
}
|
||||
|
||||
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 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))
|
||||
{
|
||||
@ -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
|
||||
{
|
||||
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)
|
||||
@ -111,7 +111,8 @@ namespace ASC.Files.Core.Data
|
||||
{
|
||||
var folders = FilesDbContext.Folders
|
||||
.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)
|
||||
{
|
||||
|
@ -217,9 +217,10 @@ namespace ASC.Files.Core.Data
|
||||
var query = GetFileQuery(r => r.FolderId.ToString() == parentId.ToString() && r.CurrentVersion).Select(r => r.Id);
|
||||
|
||||
return Query(r => r.Files)
|
||||
.Where(r => (object)r.FolderId == parentId && r.CurrentVersion)
|
||||
.Select(r => (object)r.Id)
|
||||
.ToList();
|
||||
.Where(r => r.FolderId.ToString() == parentId.ToString() && r.CurrentVersion)
|
||||
.Select(r => r.Id)
|
||||
.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)
|
||||
@ -359,7 +360,7 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
|
||||
var isNew = false;
|
||||
List<object> parentFoldersIds;
|
||||
List<int> parentFoldersIds;
|
||||
lock (syncRoot)
|
||||
{
|
||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||
@ -382,12 +383,14 @@ namespace ASC.Files.Core.Data
|
||||
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
||||
|
||||
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();
|
||||
|
||||
toUpdate.CurrentVersion = false;
|
||||
FilesDbContext.SaveChanges();
|
||||
|
||||
if (toUpdate != null)
|
||||
{
|
||||
toUpdate.CurrentVersion = false;
|
||||
FilesDbContext.SaveChanges();
|
||||
}
|
||||
|
||||
var toInsert = new DbFile
|
||||
{
|
||||
@ -421,13 +424,13 @@ namespace ASC.Files.Core.Data
|
||||
FilesDbContext.Tree
|
||||
.Where(r => r.FolderId == (int)file.FolderID)
|
||||
.OrderByDescending(r => r.Level)
|
||||
.Select(r => (object)r.ParentId)
|
||||
.Select(r => r.ParentId)
|
||||
.ToList();
|
||||
|
||||
if (parentFoldersIds.Count > 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@ -491,7 +494,7 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
}
|
||||
|
||||
List<object> parentFoldersIds;
|
||||
List<int> parentFoldersIds;
|
||||
lock (syncRoot)
|
||||
{
|
||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||
@ -506,7 +509,7 @@ namespace ASC.Files.Core.Data
|
||||
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
||||
|
||||
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();
|
||||
|
||||
toUpdate.Version = file.Version;
|
||||
@ -533,13 +536,13 @@ namespace ASC.Files.Core.Data
|
||||
parentFoldersIds = FilesDbContext.Tree
|
||||
.Where(r => r.FolderId == (int)file.FolderID)
|
||||
.OrderByDescending(r => r.Level)
|
||||
.Select(r => (object)r.ParentId)
|
||||
.Select(r => r.ParentId)
|
||||
.ToList();
|
||||
|
||||
if (parentFoldersIds.Count > 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@ -923,7 +926,7 @@ namespace ASC.Files.Core.Data
|
||||
{
|
||||
var toUpdate = Query(r => r.Files)
|
||||
.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)
|
||||
{
|
||||
@ -939,7 +942,7 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
var q = GetFileQuery(r => r.CurrentVersion)
|
||||
.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);
|
||||
|
||||
if (!string.IsNullOrEmpty(searchText))
|
||||
@ -1099,13 +1102,6 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
#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)
|
||||
{
|
||||
return s =>
|
||||
@ -1180,7 +1176,7 @@ namespace ASC.Files.Core.Data
|
||||
protected List<File> FromQueryWithShared(IQueryable<DbFile> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new
|
||||
.Select(r => new DbFileQuery
|
||||
{
|
||||
file = r,
|
||||
root =
|
||||
@ -1198,36 +1194,14 @@ namespace ASC.Files.Core.Data
|
||||
.Any()
|
||||
})
|
||||
.ToList()
|
||||
.Select(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;
|
||||
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();
|
||||
.Select(ToFile)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
protected List<File> FromQuery(IQueryable<DbFile> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new
|
||||
.Select(r => new DbFileQuery
|
||||
{
|
||||
file = r,
|
||||
root = FilesDbContext.Folders
|
||||
@ -1240,31 +1214,40 @@ namespace ASC.Files.Core.Data
|
||||
shared = true
|
||||
})
|
||||
.ToList()
|
||||
.Select(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;
|
||||
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();
|
||||
.Select(ToFile)
|
||||
.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
|
||||
|
@ -223,13 +223,13 @@ namespace ASC.Files.Core.Data
|
||||
|| filterType == FilterType.ArchiveOnly || filterType == FilterType.MediaOnly)
|
||||
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)
|
||||
{
|
||||
q = GetFolderQuery()
|
||||
.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);
|
||||
}
|
||||
|
||||
@ -558,7 +558,7 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
var childs = Query(r => r.Folders)
|
||||
.Where(r => r.ParentId == (int)folderId)
|
||||
.Select(r => (object)r.Id);
|
||||
.Select(r => r.Id.ToString());
|
||||
|
||||
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)
|
||||
{
|
||||
var q = Query(r => r.Folders);
|
||||
if (q != null)
|
||||
if (where != null)
|
||||
{
|
||||
q = q.Where(where);
|
||||
}
|
||||
@ -860,9 +860,9 @@ namespace ASC.Files.Core.Data
|
||||
protected List<Folder> FromQueryWithShared(IQueryable<DbFolder> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new
|
||||
.Select(r => new DbFolderQuery
|
||||
{
|
||||
file = r,
|
||||
folder = r,
|
||||
root = FilesDbContext.Folders
|
||||
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
|
||||
.Where(x => x.folder.TenantId == r.TenantId)
|
||||
@ -870,40 +870,22 @@ namespace ASC.Files.Core.Data
|
||||
.OrderByDescending(r => r.tree.Level)
|
||||
.Select(r => r.folder)
|
||||
.FirstOrDefault(),
|
||||
shared =
|
||||
FilesDbContext.Security
|
||||
.Where(r => r.EntryType == FileEntryType.Folder)
|
||||
.Where(x => x.EntryId == r.Id.ToString())
|
||||
.Any()
|
||||
shared = FilesDbContext.Security
|
||||
.Where(r => r.EntryType == FileEntryType.Folder)
|
||||
.Where(x => x.EntryId == r.Id.ToString())
|
||||
.Any()
|
||||
})
|
||||
.ToList()
|
||||
.Select(r =>
|
||||
{
|
||||
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();
|
||||
.Select(ToFolder)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
protected List<Folder> FromQuery(IQueryable<DbFolder> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new
|
||||
.Select(r => new DbFolderQuery
|
||||
{
|
||||
file = r,
|
||||
folder = r,
|
||||
root = FilesDbContext.Folders
|
||||
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
|
||||
.Where(x => x.folder.TenantId == r.TenantId)
|
||||
@ -914,25 +896,28 @@ namespace ASC.Files.Core.Data
|
||||
shared = true
|
||||
})
|
||||
.ToList()
|
||||
.Select(r =>
|
||||
{
|
||||
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();
|
||||
.Select(ToFolder)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public Folder ToFolder(DbFolderQuery r)
|
||||
{
|
||||
var result = ServiceProvider.GetService<Folder>();
|
||||
result.ID = r.folder.Id;
|
||||
result.ParentFolderID = r.folder.ParentId;
|
||||
result.Title = r.folder.Title;
|
||||
result.CreateOn = TenantUtil.DateTimeFromUtc(r.folder.CreateOn);
|
||||
result.CreateBy = r.folder.CreateBy;
|
||||
result.ModifiedOn = TenantUtil.DateTimeFromUtc(r.folder.ModifiedOn);
|
||||
result.ModifiedBy = r.folder.ModifiedBy;
|
||||
result.FolderType = r.folder.FolderType;
|
||||
result.TotalSubFolders = r.folder.FoldersCount;
|
||||
result.TotalFiles = r.folder.FilesCount;
|
||||
result.RootFolderType = r.root?.FolderType ?? default;
|
||||
result.RootFolderCreator = r.root?.CreateBy ?? default;
|
||||
result.RootFolderId = r.root?.Id ?? default;
|
||||
result.Shared = r.shared;
|
||||
return result;
|
||||
}
|
||||
|
||||
public string GetBunchObjectID(object folderID)
|
||||
@ -1003,6 +988,14 @@ namespace ASC.Files.Core.Data
|
||||
//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 DIHelper AddFolderDaoService(this DIHelper services)
|
||||
|
@ -283,14 +283,18 @@ namespace ASC.Files.Core.Data
|
||||
var q = Query(r => r.Security)
|
||||
.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 => r.DbFilesSecurity.EntryType == FileEntryType.Folder);
|
||||
.Where(r => r.DbFilesSecurity.EntryType == FileEntryType.Folder)
|
||||
.ToList();
|
||||
|
||||
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)
|
||||
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
|
||||
.ToList();
|
||||
@ -350,7 +354,7 @@ namespace ASC.Files.Core.Data
|
||||
private FileShareRecord ToFileShareRecord(SecurityTreeRecord r)
|
||||
{
|
||||
var result = ToFileShareRecord(r.DbFilesSecurity);
|
||||
result.Level = r.DbFolderTree.Level;
|
||||
result.Level = r.DbFolderTree?.Level ?? -1;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -539,7 +539,7 @@ namespace ASC.Files.Core.Data
|
||||
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()
|
||||
.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"; } }
|
||||
|
||||
|
||||
public FilesWrapper()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public FilesWrapper(IServiceProvider serviceProvider, TenantManager tenantManager, FileUtility fileUtility, IDaoFactory daoFactory)
|
||||
{
|
||||
ServiceProvider = serviceProvider;
|
||||
@ -88,7 +93,7 @@ namespace ASC.Web.Files.Core.Search
|
||||
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 tenantManager = serviceProvider.GetService<TenantManager>();
|
||||
@ -133,10 +138,10 @@ namespace ASC.Web.Files.Core.Search
|
||||
get { return FilesCommonResource.IndexTitle; }
|
||||
}
|
||||
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
public TenantManager TenantManager { get; }
|
||||
public FileUtility FileUtility { get; }
|
||||
public IDaoFactory DaoFactory { get; }
|
||||
private IServiceProvider ServiceProvider { get; }
|
||||
private TenantManager TenantManager { get; }
|
||||
private FileUtility FileUtility { get; }
|
||||
private IDaoFactory DaoFactory { get; }
|
||||
}
|
||||
|
||||
public sealed class FilesFoldersWrapper : Wrapper
|
||||
|
@ -27,9 +27,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
using ASC.Files.Core;
|
||||
using ASC.Web.Files.Helpers;
|
||||
using ASC.Web.Files.Services.WCFService.FileOperations;
|
||||
|
||||
using File = ASC.Files.Core.File;
|
||||
using FileShare = ASC.Files.Core.Security.FileShare;
|
||||
|
||||
@ -71,7 +73,7 @@ namespace ASC.Web.Files.Services.WCFService
|
||||
|
||||
File GetFile(string fileId, int version);
|
||||
|
||||
File CreateNewFile(string parentId, string fileTitle);
|
||||
File CreateNewFile(FileWrapper fileWrapper);
|
||||
|
||||
File FileRename(string fileId, string title);
|
||||
|
||||
|
@ -1,13 +1,10 @@
|
||||
|
||||
using System;
|
||||
|
||||
using ASC.Api.Core.Auth;
|
||||
using ASC.Api.Core.Core;
|
||||
using ASC.Api.Core.Middleware;
|
||||
using ASC.Common;
|
||||
using ASC.Common.DependencyInjection;
|
||||
using ASC.Common.Logging;
|
||||
using ASC.Common.Threading.Workers;
|
||||
using ASC.Web.Files.Services.WCFService;
|
||||
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
@ -23,8 +20,6 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using static ASC.Web.Files.Utils.FileMarker;
|
||||
|
||||
namespace ASC.Files
|
||||
{
|
||||
public class Startup
|
||||
@ -81,14 +76,6 @@ namespace ASC.Files
|
||||
.AddProductSecurityFilter()
|
||||
.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.AddFileStorageServiceController();
|
||||
|
@ -50,6 +50,10 @@ namespace ASC.Web.Files.Utils
|
||||
|
||||
public ChunkedUploadSessionHolder(IOptionsMonitor<ILog> options, GlobalStore globalStore, SetupInfo setupInfo)
|
||||
{
|
||||
Options = options;
|
||||
GlobalStore = globalStore;
|
||||
SetupInfo = setupInfo;
|
||||
|
||||
// clear old sessions
|
||||
try
|
||||
{
|
||||
@ -59,10 +63,6 @@ namespace ASC.Web.Files.Utils
|
||||
{
|
||||
options.CurrentValue.Error(err);
|
||||
}
|
||||
|
||||
Options = options;
|
||||
GlobalStore = globalStore;
|
||||
SetupInfo = setupInfo;
|
||||
}
|
||||
|
||||
public void StoreSession(ChunkedUploadSession s)
|
||||
|
@ -31,6 +31,7 @@ using System.Security;
|
||||
|
||||
using ASC.Common;
|
||||
using ASC.Common.Caching;
|
||||
using ASC.Common.Logging;
|
||||
using ASC.Common.Threading.Workers;
|
||||
using ASC.Core;
|
||||
using ASC.Core.Users;
|
||||
@ -41,6 +42,7 @@ using ASC.Files.Resources;
|
||||
using ASC.Web.Files.Classes;
|
||||
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using static ASC.Web.Files.Utils.FileMarker;
|
||||
|
||||
@ -48,6 +50,33 @@ using File = ASC.Files.Core.File;
|
||||
|
||||
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
|
||||
{
|
||||
private static readonly object locker = new object();
|
||||
@ -64,6 +93,7 @@ namespace ASC.Web.Files.Utils
|
||||
public CoreBaseSettings CoreBaseSettings { get; }
|
||||
public AuthContext AuthContext { get; }
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
public FileMarkerHelper FileMarkerHelper { get; }
|
||||
|
||||
public FileMarker(
|
||||
TenantManager tenantManager,
|
||||
@ -74,7 +104,8 @@ namespace ASC.Web.Files.Utils
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
AuthContext authContext,
|
||||
IServiceProvider serviceProvider,
|
||||
WorkerQueueOptionsManager<AsyncTaskData> workerQueueOptionsManager)
|
||||
WorkerQueueOptionsManager<AsyncTaskData> workerQueueOptionsManager,
|
||||
FileMarkerHelper fileMarkerHelper)
|
||||
{
|
||||
TenantManager = tenantManager;
|
||||
UserManager = userManager;
|
||||
@ -84,11 +115,12 @@ namespace ASC.Web.Files.Utils
|
||||
CoreBaseSettings = coreBaseSettings;
|
||||
AuthContext = authContext;
|
||||
ServiceProvider = serviceProvider;
|
||||
FileMarkerHelper = fileMarkerHelper;
|
||||
cache = AscCache.Memory;
|
||||
tasks = workerQueueOptionsManager.Value;
|
||||
}
|
||||
|
||||
private void ExecMarkFileAsNew(AsyncTaskData obj)
|
||||
internal void ExecMarkFileAsNew(AsyncTaskData obj)
|
||||
{
|
||||
TenantManager.SetCurrentTenant(Convert.ToInt32(obj.TenantID));
|
||||
|
||||
@ -281,7 +313,7 @@ namespace ASC.Web.Files.Utils
|
||||
tasks.Add(taskData);
|
||||
|
||||
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)
|
||||
{
|
||||
services.TryAddScoped<FileMarker>();
|
||||
services.TryAddSingleton<WorkerQueueOptionsManager<AsyncTaskData>>();
|
||||
_ = services
|
||||
.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
|
||||
.AddTenantManagerService()
|
||||
|
@ -85,7 +85,7 @@ namespace ASC.People
|
||||
.AddProductSecurityFilter()
|
||||
.AddTenantStatusFilter();
|
||||
|
||||
services.Configure<WorkerQueue<ResizeWorkerItem>>(r =>
|
||||
diHelper.Configure<WorkerQueue<ResizeWorkerItem>>(r =>
|
||||
{
|
||||
r.workerCount = 2;
|
||||
r.waitInterval = (int)TimeSpan.FromSeconds(30).TotalMilliseconds;
|
||||
@ -93,7 +93,7 @@ namespace ASC.People
|
||||
r.stopAfterFinsih = true;
|
||||
});
|
||||
|
||||
services.Configure<ProgressQueue<ReassignProgressItem>>(r =>
|
||||
diHelper.Configure<ProgressQueue<ReassignProgressItem>>(r =>
|
||||
{
|
||||
r.workerCount = 1;
|
||||
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
|
||||
@ -102,7 +102,7 @@ namespace ASC.People
|
||||
r.errorCount = 0;
|
||||
});
|
||||
|
||||
services.Configure<ProgressQueue<RemoveProgressItem>>(r =>
|
||||
diHelper.Configure<ProgressQueue<RemoveProgressItem>>(r =>
|
||||
{
|
||||
r.workerCount = 1;
|
||||
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
|
||||
|
Loading…
Reference in New Issue
Block a user