Files: ef, di

This commit is contained in:
pavelbannov 2020-02-19 11:37:52 +03:00
parent 56d5d3f111
commit 7a8baecb2a
19 changed files with 258 additions and 206 deletions

View File

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

View File

@ -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>();
}
}

View File

@ -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)

View File

@ -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)
{

View File

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

View File

@ -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)

View File

@ -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,

View File

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

View File

@ -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)
{

View File

@ -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

View File

@ -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)

View File

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

View File

@ -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()))

View File

@ -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

View File

@ -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);

View File

@ -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();

View File

@ -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)

View File

@ -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()

View File

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