From 7d5a698be6f9606c6f00c0fd670c45e9a59a1129 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 30 Jan 2020 16:59:42 +0300 Subject: [PATCH] Files: TagDao --- .../Server/Core/Dao/Interfaces/ITagDao.cs | 2 +- .../Server/Core/Dao/TeamlabDao/AbstractDao.cs | 14 +- .../Server/Core/Dao/TeamlabDao/FileDao.cs | 2 +- .../Server/Core/Dao/TeamlabDao/FolderDao.cs | 6 +- .../Server/Core/Dao/TeamlabDao/SecurityDao.cs | 1 + .../Server/Core/Dao/TeamlabDao/TagDao.cs | 558 +++++++++--------- .../ASC.Files/Server/Core/EF/DbFilesTag.cs | 2 +- .../Server/Core/EF/DbFilesTagLink.cs | 4 +- .../Core/EF/DbFilesThirdpartyAccount.cs | 37 ++ .../Server/Core/EF/FilesDbContext.cs | 1 + 10 files changed, 348 insertions(+), 279 deletions(-) create mode 100644 products/ASC.Files/Server/Core/EF/DbFilesThirdpartyAccount.cs diff --git a/products/ASC.Files/Server/Core/Dao/Interfaces/ITagDao.cs b/products/ASC.Files/Server/Core/Dao/Interfaces/ITagDao.cs index d4a6256904..a1e092a612 100644 --- a/products/ASC.Files/Server/Core/Dao/Interfaces/ITagDao.cs +++ b/products/ASC.Files/Server/Core/Dao/Interfaces/ITagDao.cs @@ -29,7 +29,7 @@ using System.Collections.Generic; namespace ASC.Files.Core { - public interface ITagDao : IDisposable + public interface ITagDao { IEnumerable GetTags(TagType tagType, IEnumerable fileEntries); diff --git a/products/ASC.Files/Server/Core/Dao/TeamlabDao/AbstractDao.cs b/products/ASC.Files/Server/Core/Dao/TeamlabDao/AbstractDao.cs index 1418c06bb4..7b75bdf810 100644 --- a/products/ASC.Files/Server/Core/Dao/TeamlabDao/AbstractDao.cs +++ b/products/ASC.Files/Server/Core/Dao/TeamlabDao/AbstractDao.cs @@ -122,9 +122,9 @@ namespace ASC.Files.Core.Data ContentLength = r.file.ContentLength, ModifiedOn = TenantUtil.DateTimeFromUtc(r.file.ModifiedOn), ModifiedBy = r.file.ModifiedBy, - RootFolderType = ParseRootFolderType(r.root), - RootFolderCreator = ParseRootFolderCreator(r.root), - RootFolderId = ParseRootFolderId(r.root), + RootFolderType = r.root.FolderType, + RootFolderCreator = r.root.CreateBy, + RootFolderId = r.root.Id, Shared = r.shared, ConvertedType = r.file.ConvertedType, Comment = r.file.Comment, @@ -133,24 +133,24 @@ namespace ASC.Files.Core.Data }).ToList(); } - protected string GetRootFolderType(DbFile file) + protected DbFolder GetRootFolderType(DbFile file) { return FilesDbContext.Folders .Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree }) .Where(r => r.folder.TenantId == file.TenantId) .Where(r => r.tree.FolderId == file.FolderId) .OrderByDescending(r => r.tree.Level) - .Select(r => r.folder.FolderType + r.folder.CreateBy.ToString() + r.folder.Id.ToString()) + .Select(r => r.folder) .FirstOrDefault(); } - protected string GetRootFolderType(DbFolder folder) + protected DbFolder GetRootFolderType(DbFolder folder) { return FilesDbContext.Folders .Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree }) .Where(r => r.folder.TenantId == folder.TenantId) .Where(r => r.tree.FolderId == folder.ParentId) .OrderByDescending(r => r.tree.Level) - .Select(r => r.folder.FolderType + r.folder.CreateBy.ToString() + r.folder.Id.ToString()) + .Select(r => r.folder) .FirstOrDefault(); } diff --git a/products/ASC.Files/Server/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Server/Core/Dao/TeamlabDao/FileDao.cs index dfbbb3ebc2..8e4d8236db 100644 --- a/products/ASC.Files/Server/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Server/Core/Dao/TeamlabDao/FileDao.cs @@ -605,7 +605,7 @@ namespace ASC.Files.Core.Data var toDeleteFiles = Query(r => r.Files).Where(r => r.Id == (int)fileId); FilesDbContext.RemoveRange(toDeleteFiles); - var toDeleteLinks = Query(r => r.TagLink).Where(r => r.EntryId == fileId.ToString()).Where(r => r.EntryType == (int)FileEntryType.File); + var toDeleteLinks = Query(r => r.TagLink).Where(r => r.EntryId == fileId.ToString()).Where(r => r.EntryType == FileEntryType.File); FilesDbContext.RemoveRange(toDeleteFiles); var tagsToRemove = Query(r => r.Tag) diff --git a/products/ASC.Files/Server/Core/Dao/TeamlabDao/FolderDao.cs b/products/ASC.Files/Server/Core/Dao/TeamlabDao/FolderDao.cs index bd5f4a08d7..b95571be68 100644 --- a/products/ASC.Files/Server/Core/Dao/TeamlabDao/FolderDao.cs +++ b/products/ASC.Files/Server/Core/Dao/TeamlabDao/FolderDao.cs @@ -865,9 +865,9 @@ namespace ASC.Files.Core.Data FolderType = r.file.FolderType, TotalSubFolders = r.file.FoldersCount, TotalFiles = r.file.FilesCount, - RootFolderType = ParseRootFolderType(r.root), - RootFolderCreator = ParseRootFolderCreator(r.root), - RootFolderId = ParseRootFolderId(r.root), + RootFolderType = r.root.FolderType, + RootFolderCreator = r.root.CreateBy, + RootFolderId = r.root.Id, Shared = r.shared }).ToList(); } diff --git a/products/ASC.Files/Server/Core/Dao/TeamlabDao/SecurityDao.cs b/products/ASC.Files/Server/Core/Dao/TeamlabDao/SecurityDao.cs index 56692f65fd..020084d75e 100644 --- a/products/ASC.Files/Server/Core/Dao/TeamlabDao/SecurityDao.cs +++ b/products/ASC.Files/Server/Core/Dao/TeamlabDao/SecurityDao.cs @@ -328,6 +328,7 @@ namespace ASC.Files.Core.Data .Select(ToFileShareRecord) .ToList(); } + protected List FromQuery(IQueryable filesSecurities) { return filesSecurities diff --git a/products/ASC.Files/Server/Core/Dao/TeamlabDao/TagDao.cs b/products/ASC.Files/Server/Core/Dao/TeamlabDao/TagDao.cs index db40cf74b1..143c2d3329 100644 --- a/products/ASC.Files/Server/Core/Dao/TeamlabDao/TagDao.cs +++ b/products/ASC.Files/Server/Core/Dao/TeamlabDao/TagDao.cs @@ -28,7 +28,15 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; + +using ASC.Core; +using ASC.Core.Common.EF; +using ASC.Core.Common.Settings; using ASC.Core.Tenants; +using ASC.Files.Core.EF; +using ASC.Web.Studio.Core; +using ASC.Web.Studio.UserControls.Statistics; +using ASC.Web.Studio.Utility; namespace ASC.Files.Core.Data { @@ -36,8 +44,31 @@ namespace ASC.Files.Core.Data { private static readonly object syncRoot = new object(); - public TagDao(int tenant, string dbid) - : base(tenant, dbid) + public TagDao( + UserManager userManager, + DbContextManager dbContextManager, + TenantManager tenantManager, + TenantUtil tenantUtil, + SetupInfo setupInfo, + TenantExtra tenantExtra, + TenantStatisticsProvider tenantStatisticProvider, + CoreBaseSettings coreBaseSettings, + CoreConfiguration coreConfiguration, + SettingsManager settingsManager, + AuthContext authContext, + string dbid) + : base(dbContextManager, + userManager, + tenantManager, + tenantUtil, + setupInfo, + tenantExtra, + tenantStatisticProvider, + coreBaseSettings, + coreConfiguration, + settingsManager, + authContext, + dbid) { } @@ -46,54 +77,40 @@ namespace ASC.Files.Core.Data var filesId = fileEntries.Where(e => e.FileEntryType == FileEntryType.File).Select(e => MappingID(e.ID)).ToList(); var foldersId = fileEntries.Where(e => e.FileEntryType == FileEntryType.Folder).Select(e => MappingID(e.ID)).ToList(); - var q = Query("files_tag t") - .InnerJoin("files_tag_link l", - Exp.EqColumns("l.tenant_id", "t.tenant_id") & - Exp.EqColumns("l.tag_id", "t.id")) - .Select("t.name", "t.flag", "t.owner", "entry_id", "entry_type", "tag_count", "t.id") - .Where("l.tenant_id", TenantID) - .Where((Exp.Eq("l.entry_type", (int)FileEntryType.File) & Exp.In("l.entry_id", filesId)) - | (Exp.Eq("l.entry_type", (int)FileEntryType.Folder) & Exp.In("l.entry_id", foldersId))) - .Where("t.flag", (int)tagType); + var q = Query(r => r.Tag) + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Tag.Flag == tagType) + .Where(r => r.Link.EntryType == FileEntryType.File && filesId.Any(f => r.Link.EntryId == f.ToString()) + || r.Link.EntryType == FileEntryType.Folder && foldersId.Any(f => r.Link.EntryId == f.ToString())); - return SelectTagByQuery(q); + return FromQuery(q); } public IEnumerable GetTags(object entryID, FileEntryType entryType, TagType tagType) { - var q = Query("files_tag t") - .InnerJoin("files_tag_link l", - Exp.EqColumns("l.tenant_id", "t.tenant_id") & - Exp.EqColumns("l.tag_id", "t.id")) - .Select("t.name", "t.flag", "t.owner", "entry_id", "entry_type", "tag_count", "t.id") - .Where("l.tenant_id", TenantID) - .Where("l.entry_type", (int)entryType) - .Where(Exp.Eq("l.entry_id", MappingID(entryID).ToString())) - .Where("t.flag", (int)tagType); + var q = Query(r => r.Tag) + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Link.EntryType == entryType) + .Where(r => r.Link.EntryId == MappingID(entryID).ToString()) + .Where(r => r.Tag.Flag == tagType); - return SelectTagByQuery(q); + return FromQuery(q); } public IEnumerable GetTags(string[] names, TagType tagType) { if (names == null) throw new ArgumentNullException("names"); - var q = Query("files_tag t") - .InnerJoin("files_tag_link l", - Exp.EqColumns("l.tenant_id", "t.tenant_id") & - Exp.EqColumns("l.tag_id", "t.id")) - .Select("t.name", "t.flag", "t.owner", "entry_id", "entry_type", "tag_count", "t.id") - .Where("l.tenant_id", TenantID) - .Where("t.owner", Guid.Empty.ToString()) - .Where(Exp.In("t.name", names)) - .Where("t.flag", (int)tagType); + var q = Query(r => r.Tag) + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Tag.Owner == Guid.Empty) + .Where(r => names.Any(n => r.Tag.Name == n)) + .Where(r => r.Tag.Flag == tagType); - return SelectTagByQuery(q); - } - - private IEnumerable SelectTagByQuery(SqlQuery q) - { - return dbManager.ExecuteList(q).ConvertAll(ToTag); + return FromQuery(q); } public IEnumerable GetTags(string name, TagType tagType) @@ -105,18 +122,18 @@ namespace ASC.Files.Core.Data public IEnumerable GetTags(Guid owner, TagType tagType) { - var q = Query("files_tag t") - .InnerJoin("files_tag_link l", - Exp.EqColumns("l.tenant_id", "t.tenant_id") & - Exp.EqColumns("l.tag_id", "t.id")) - .Select("t.name", "t.flag", "t.owner", "entry_id", "entry_type", "tag_count", "t.id") - .Where("l.tenant_id", TenantID) - .Where("t.flag", (int)tagType); + var q = + Query(r => r.Tag) + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Tag.Flag == tagType); if (owner != Guid.Empty) - q.Where("t.owner", owner.ToString()); + { + q = q.Where(r => r.Tag.Owner == owner); + } - return SelectTagByQuery(q); + return FromQuery(q); } public IEnumerable SaveTags(IEnumerable tags) @@ -131,17 +148,15 @@ namespace ASC.Files.Core.Data lock (syncRoot) { - using (var tx = dbManager.BeginTransaction()) - { - DeleteTagsBeforeSave(); + using var tx = FilesDbContext.Database.BeginTransaction(); + DeleteTagsBeforeSave(); - var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow()); - var cacheTagId = new Dictionary(); + var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow()); + var cacheTagId = new Dictionary(); - result.AddRange(tags.Select(t => SaveTag(t, cacheTagId, createOn))); + result.AddRange(tags.Select(t => SaveTag(t, cacheTagId, createOn))); - tx.Commit(); - } + tx.Commit(); } return result; @@ -157,17 +172,15 @@ namespace ASC.Files.Core.Data lock (syncRoot) { - using (var tx = dbManager.BeginTransaction()) - { - DeleteTagsBeforeSave(); + using var tx = FilesDbContext.Database.BeginTransaction(); + DeleteTagsBeforeSave(); - var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow()); - var cacheTagId = new Dictionary(); + var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow()); + var cacheTagId = new Dictionary(); - result.Add(SaveTag(tag, cacheTagId, createOn)); + result.Add(SaveTag(tag, cacheTagId, createOn)); - tx.Commit(); - } + tx.Commit(); } return result; @@ -175,58 +188,56 @@ namespace ASC.Files.Core.Data private void DeleteTagsBeforeSave() { - var mustBeDeleted = dbManager.ExecuteList(Query("files_tag ft") - .Select("ftl.tag_id", - "ftl.entry_id", - "ftl.entry_type") - .Distinct() - .InnerJoin("files_tag_link ftl", - Exp.EqColumns("ft.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("ft.id", "ftl.tag_id")) - .Where(Exp.Eq("ft.flag", (int)TagType.New) & - Exp.Le("create_on", TenantUtil.DateTimeNow().AddMonths(-1)))); + var mustBeDeleted = + Query(r => r.Tag) + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Tag.Flag == TagType.New && r.Link.CreateOn <= TenantUtil.DateTimeNow().AddMonths(-1)); foreach (var row in mustBeDeleted) { - dbManager.ExecuteNonQuery(Delete("files_tag_link") - .Where(Exp.Eq("tag_id", row[0]) & - Exp.Eq("entry_id", row[1]) & - Exp.Eq("entry_type", row[2]))); + var linksToRemove = Query(r => r.TagLink) + .Where(r => r.TagId == row.Link.TagId) + .Where(r => r.EntryId == row.Link.EntryId) + .Where(r => r.EntryType == row.Link.EntryType); + FilesDbContext.TagLink.RemoveRange(linksToRemove); } - var tagsToRemove = dbManager.ExecuteList( - Query("files_tag") - .Select("id") - .Where(Exp.EqColumns("0", - Query("files_tag_link l").SelectCount().Where(Exp.EqColumns("tag_id", "id"))))) - .ConvertAll(r => Convert.ToInt32(r[0])); + FilesDbContext.SaveChanges(); - dbManager.ExecuteNonQuery(Delete("files_tag").Where(Exp.In("id", tagsToRemove))); + var tagsToRemove = Query(r => r.Tag) + .Where(r => !Query(a => a.TagLink).Where(a => a.TagId == r.Id).Any()); + + FilesDbContext.Tag.RemoveRange(tagsToRemove); + FilesDbContext.SaveChanges(); } private Tag SaveTag(Tag t, Dictionary cacheTagId, DateTime createOn) { - int id; - var cacheTagIdKey = string.Join("/", new[] { TenantID.ToString(), t.Owner.ToString(), t.TagName, ((int)t.TagType).ToString(CultureInfo.InvariantCulture) }); - if (!cacheTagId.TryGetValue(cacheTagIdKey, out id)) + if (!cacheTagId.TryGetValue(cacheTagIdKey, out var id)) { - id = dbManager.ExecuteScalar(Query("files_tag") - .Select("id") - .Where("owner", t.Owner.ToString()) - .Where("name", t.TagName) - .Where("flag", (int)t.TagType)); + id = FilesDbContext.Tag + .Where(r => r.Owner == t.Owner) + .Where(r => r.Name == t.TagName) + .Where(r => r.Flag == t.TagType) + .Select(r => r.Id) + .FirstOrDefault(); if (id == 0) { - var i1 = Insert("files_tag") - .InColumnValue("id", 0) - .InColumnValue("name", t.TagName) - .InColumnValue("owner", t.Owner.ToString()) - .InColumnValue("flag", (int)t.TagType) - .Identity(1, 0, true); - id = dbManager.ExecuteScalar(i1); + var toAdd = new DbFilesTag + { + Id = 0, + Name = t.TagName, + Owner = t.Owner, + Flag = t.TagType, + TenantId = TenantID + }; + + toAdd = FilesDbContext.Tag.Add(toAdd).Entity; + id = toAdd.Id; } cacheTagId.Add(cacheTagIdKey, id); @@ -234,15 +245,19 @@ namespace ASC.Files.Core.Data t.Id = id; - var i2 = Insert("files_tag_link") - .InColumnValue("tag_id", id) - .InColumnValue("entry_id", MappingID(t.EntryId, true)) - .InColumnValue("entry_type", (int)t.EntryType) - .InColumnValue("create_by", ASC.Core.SecurityContext.CurrentAccount.ID) - .InColumnValue("create_on", createOn) - .InColumnValue("tag_count", t.Count); + var linkToInsert = new DbFilesTagLink + { + TenantId = TenantID, + TagId = id, + EntryId = MappingID(t.EntryId, true).ToString(), + EntryType = t.EntryType, + CreateBy = AuthContext.CurrentAccount.ID, + CreateOn = createOn, + TagCount = t.Count + }; - dbManager.ExecuteNonQuery(i2); + FilesDbContext.AddOrUpdate(r => r.TagLink, linkToInsert); + FilesDbContext.SaveChanges(); return t; } @@ -253,7 +268,7 @@ namespace ASC.Files.Core.Data lock (syncRoot) { - using (var tx = dbManager.BeginTransaction(true)) + using (var tx = FilesDbContext.Database.BeginTransaction()) { var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow()); @@ -282,15 +297,19 @@ namespace ASC.Files.Core.Data { if (tag == null) return; - dbManager.ExecuteNonQuery( - Update("files_tag_link") - .Set("create_by", ASC.Core.SecurityContext.CurrentAccount.ID) - .Set("create_on", createOn) - .Set("tag_count", tag.Count) - .Where("tag_id", tag.Id) - .Where("entry_type", (int)tag.EntryType) - .Where(Exp.Eq("entry_id", MappingID(tag.EntryId).ToString())) - ); + var forUpdate = Query(r => r.TagLink) + .Where(r => r.TagId == tag.Id) + .Where(r => r.EntryType == tag.EntryType) + .Where(r => r.EntryId == MappingID(tag.EntryId).ToString()); + + foreach (var f in forUpdate) + { + f.CreateBy = AuthContext.CurrentAccount.ID; + f.CreateOn = createOn; + f.TagCount = tag.Count; + } + + FilesDbContext.SaveChanges(); } public void RemoveTags(IEnumerable tags) @@ -299,7 +318,7 @@ namespace ASC.Files.Core.Data lock (syncRoot) { - using (var tx = dbManager.BeginTransaction(true)) + using (var tx = FilesDbContext.Database.BeginTransaction()) { foreach (var t in tags) { @@ -316,7 +335,7 @@ namespace ASC.Files.Core.Data lock (syncRoot) { - using (var tx = dbManager.BeginTransaction(true)) + using (var tx = FilesDbContext.Database.BeginTransaction()) { RemoveTagInDb(tag); @@ -329,25 +348,29 @@ namespace ASC.Files.Core.Data { if (tag == null) return; - var id = dbManager.ExecuteScalar(Query("files_tag") - .Select("id") - .Where("name", tag.TagName) - .Where("owner", tag.Owner.ToString()) - .Where("flag", (int) tag.TagType)); + var id = Query(r => r.Tag) + .Where(r => r.Name == tag.TagName) + .Where(r => r.Owner == tag.Owner) + .Where(r => r.Flag == tag.TagType) + .Select(r => r.Id) + .FirstOrDefault(); if (id != 0) { - var d = Delete("files_tag_link") - .Where("tag_id", id) - .Where(Exp.Eq("entry_id", MappingID(tag.EntryId).ToString())) - .Where("entry_type", (int) tag.EntryType); - dbManager.ExecuteNonQuery(d); + var toDelete = Query(r => r.TagLink) + .Where(r => r.TagId == id) + .Where(r => r.EntryId == MappingID(tag.EntryId).ToString()) + .Where(r => r.EntryType == tag.EntryType); - var count = dbManager.ExecuteScalar(Query("files_tag_link").SelectCount().Where("tag_id", id)); + FilesDbContext.TagLink.RemoveRange(toDelete); + FilesDbContext.SaveChanges(); + + var count = Query(r => r.TagLink).Where(r => r.TagId == id).Count(); if (count == 0) { - d = Delete("files_tag").Where("id", id); - dbManager.ExecuteNonQuery(d); + var tagToDelete = Query(r => r.Tag).Where(r => r.Id == id); + FilesDbContext.Tag.RemoveRange(tagToDelete); + FilesDbContext.SaveChanges(); } } } @@ -383,7 +406,7 @@ namespace ASC.Files.Core.Data return GetNewTags(subject, () => { var insertQuery = new SqlInsert("files_tag_temporary", true) - .InColumns(new[] {GetTenantColumnName("files_tag_temporary"), "entry_id", "entry_type"}); + .InColumns(new[] { GetTenantColumnName("files_tag_temporary"), "entry_id", "entry_type" }); insertQuery.Values(new[] { @@ -400,24 +423,18 @@ namespace ASC.Files.Core.Data { List result; - using (var tx = dbManager.BeginTransaction()) + using (var tx = FilesDbContext.Database.BeginTransaction()) { - var sqlQuery = Query("files_tag ft") - .Select("ft.name", - "ft.flag", - "ft.owner", - "ftl.entry_id", - "ftl.entry_type", - "ftl.tag_count", - "ft.id") + var sqlQuery = Query(r => r.Tag) .Distinct() - .InnerJoin("files_tag_link ftl", - Exp.EqColumns("ft.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("ft.id", "ftl.tag_id")) - .Where(Exp.Eq("ft.flag", (int)TagType.New)); + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Tag.Flag == TagType.New); if (subject != Guid.Empty) - sqlQuery.Where(Exp.Eq("ft.owner", subject)); + { + sqlQuery = sqlQuery.Where(r => r.Tag.Owner == subject); + } const string sqlQueryStr = @" @@ -456,89 +473,88 @@ namespace ASC.Files.Core.Data var monitorFolderIds = new[] { parentFolder.ID }.AsEnumerable(); - var getBaseSqlQuery = new Func(() => - { - var fnResult = - Query("files_tag ft") - .Select("ft.name", - "ft.flag", - "ft.owner", - "ftl.entry_id", - "ftl.entry_type", - "ftl.tag_count", - "ft.id") - .Distinct() - .InnerJoin("files_tag_link ftl", - Exp.EqColumns("ft.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("ft.id", "ftl.tag_id")) - .Where(Exp.Eq("ft.flag", (int)TagType.New)); + var getBaseSqlQuery = new Func>(() => + { + var fnResult = Query(r => r.Tag) + .Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link }) + .Where(r => r.Link.TenantId == r.Tag.TenantId) + .Where(r => r.Tag.Flag == TagType.New) + .Distinct(); - if (subject != Guid.Empty) - fnResult.Where(Exp.Eq("ft.owner", subject)); + if (subject != Guid.Empty) + { + fnResult = fnResult.Where(r => r.Tag.Owner == subject); + } - return fnResult; - }); + return fnResult; + }); var tempTags = Enumerable.Empty(); if (parentFolder.FolderType == FolderType.SHARE) { var shareQuery = - new Func(() => getBaseSqlQuery().Where(Exp.Exists( - new SqlQuery("files_security fs") - .Select("fs.entry_id") - .Where( - Exp.EqColumns("fs.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("fs.entry_id", "ftl.entry_id") & - Exp.EqColumns("fs.entry_type", "ftl.entry_type"))))); + new Func>(() => getBaseSqlQuery().Where( + r => FilesDbContext.Security + .Where(a => a.TenantId == r.Link.TenantId) + .Where(a => a.EntryId == r.Link.EntryId) + .Where(a => a.EntryType == r.Link.EntryType) + .Any())); - var tmpShareFileTags = dbManager.ExecuteList( - shareQuery().InnerJoin("files_file f", - Exp.EqColumns("f.tenant_id", "ftl.tenant_id") & - !Exp.Eq("f.create_by", subject) & - Exp.EqColumns("f.id", "ftl.entry_id") & - Exp.Eq("ftl.entry_type", (int)FileEntryType.File)) - .Select(GetRootFolderType("folder_id"))) - .Where(r => ParseRootFolderType(r[7]) == FolderType.USER).ToList() - .ConvertAll(ToTag); - tempTags = tempTags.Concat(tmpShareFileTags); - - - var tmpShareFolderTags = dbManager.ExecuteList( - shareQuery().InnerJoin("files_folder f", - Exp.EqColumns("f.tenant_id", "ftl.tenant_id") & - !Exp.Eq("f.create_by", subject) & - Exp.EqColumns("f.id", "ftl.entry_id") & - Exp.Eq("ftl.entry_type", (int)FileEntryType.Folder)) - .Select(GetRootFolderType("parent_id"))) - .Where(r => ParseRootFolderType(r[7]) == FolderType.USER).ToList() - .ConvertAll(ToTag); - tempTags = tempTags.Concat(tmpShareFolderTags); - - var tmpShareSboxTags = dbManager.ExecuteList( + var tmpShareFileTags = shareQuery() - .InnerJoin("files_thirdparty_id_mapping m", - Exp.EqColumns("m.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("m.hash_id", "ftl.entry_id")) - .InnerJoin("files_thirdparty_account ac", - Exp.EqColumns("ac.tenant_id", "m.tenant_id") & - Exp.Sql("m.id Like concat('sbox-', ac.id, '%') or m.id Like concat('box-', ac.id, '%') or m.id Like concat('dropbox-', ac.id, '%') or m.id Like concat('spoint-', ac.id, '%') or m.id Like concat('drive-', ac.id, '%') or m.id Like concat('onedrive-', ac.id, '%')") & - !Exp.Eq("ac.user_id", subject) & - Exp.Eq("ac.folder_type", FolderType.USER) - ) - ).ConvertAll(ToTag); + .Join(FilesDbContext.Files, r => r.Link.EntryId, f => f.Id.ToString(), (tagLink, file) => new { tagLink, file }) + .Where(r => r.file.TenantId == r.tagLink.Link.TenantId) + .Where(r => r.file.CreateBy != subject) + .Where(r => r.tagLink.Link.EntryType == FileEntryType.File) + .Select(r => new { r.tagLink, root = GetRootFolderType(r.file) }) + .Where(r => r.root.FolderType == FolderType.USER) + .Select(r => r.tagLink); - tempTags = tempTags.Concat(tmpShareSboxTags); + tempTags = tempTags.Concat(FromQuery(tmpShareFileTags)); + + + var tmpShareFolderTags = + shareQuery() + .Join(FilesDbContext.Folders, r => r.Link.EntryId, f => f.Id.ToString(), (tagLink, folder) => new { tagLink, folder }) + .Where(r => r.folder.TenantId == r.tagLink.Link.TenantId) + .Where(r => r.folder.CreateBy != subject) + .Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder) + .Select(r => new { r.tagLink, root = GetRootFolderType(r.folder) }) + .Where(r => r.root.FolderType == FolderType.USER) + .Select(r => r.tagLink); + + tempTags = tempTags.Concat(FromQuery(tmpShareFolderTags)); + + var tmpShareSboxTags = + shareQuery() + .Join(FilesDbContext.ThirdpartyIdMapping, r => r.Link.EntryId, r => r.HashId, (tagLink, mapping) => new { tagLink, mapping }) + .Where(r => r.mapping.TenantId == r.tagLink.Link.TenantId) + .Join(FilesDbContext.ThirdpartyAccount, r => r.mapping.TenantId, r => r.TenantId, (tagLinkMapping, account) => new { tagLinkMapping.tagLink, tagLinkMapping.mapping, account }) + .Where(r => r.account.UserId != subject) + .Where(r => r.account.FolderType == FolderType.USER) + .Where(r => + r.mapping.Id.StartsWith($"'sbox-'{r.account.Id}") || + r.mapping.Id.StartsWith($"'box-'{r.account.Id}") || + r.mapping.Id.StartsWith($"'dropbox-'{r.account.Id}") || + r.mapping.Id.StartsWith($"'spoint-'{r.account.Id}") || + r.mapping.Id.StartsWith($"'drive-'{r.account.Id}") || + r.mapping.Id.StartsWith($"'onedrive-'{r.account.Id}") + ) + .Select(r => r.tagLink); + + tempTags = tempTags.Concat(FromQuery(tmpShareSboxTags)); } else if (parentFolder.FolderType == FolderType.Projects) - tempTags = tempTags.Concat( - dbManager.ExecuteList(getBaseSqlQuery() - .InnerJoin("files_bunch_objects fbo", - Exp.EqColumns("fbo.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("fbo.left_node", "ftl.entry_id") & - Exp.Eq("ftl.entry_type", (int)FileEntryType.Folder)) - .Where(Exp.Eq("fbo.tenant_id", TenantID) & Exp.Like("fbo.right_node", "projects/project/", SqlLike.StartWith))) - .ConvertAll(ToTag)); + { + var q = getBaseSqlQuery() + .Join(FilesDbContext.BunchObjects, r => r.Link.TenantId, r => r.TenantId, (tagLink, bunch) => new { tagLink, bunch }) + .Where(r => r.bunch.LeftNode == r.tagLink.Link.EntryId) + .Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder) + .Where(r => r.bunch.RightNode.StartsWith("projects/project/")) + .Select(r => r.tagLink); + tempTags = tempTags.Concat(FromQuery(q)); + } if (tempTags.Any()) { @@ -548,79 +564,93 @@ namespace ASC.Files.Core.Data result.AddRange(tempTags); } - var subFoldersSqlQuery = new SqlQuery("files_folder_tree") - .Select("folder_id") - .Where(Exp.In("parent_id", monitorFolderIds.ToArray())); + var subFoldersSqlQuery = + FilesDbContext.Tree + .Where(r => monitorFolderIds.Any(a => r.ParentId == (int)a)); if (!deepSearch) - subFoldersSqlQuery.Where(Exp.Eq("level", 1)); + { + subFoldersSqlQuery = subFoldersSqlQuery.Where(r => r.Level == 1); + } - monitorFolderIds = monitorFolderIds.Concat(dbManager.ExecuteList(subFoldersSqlQuery).ConvertAll(x => x[0])); + monitorFolderIds = monitorFolderIds.Concat(subFoldersSqlQuery.Select(r => (object)r.FolderId)); - var newTagsForFolders = dbManager.ExecuteList(getBaseSqlQuery() - .Where(Exp.In("ftl.entry_id", monitorFolderIds.ToArray()) & - Exp.Eq("ftl.entry_type", (int)FileEntryType.Folder))) - .ConvertAll(ToTag); + var newTagsForFolders = getBaseSqlQuery() + .Where(r => monitorFolderIds.Any(a => r.Link.EntryId == a.ToString())) + .Where(r => r.Link.EntryType == FileEntryType.Folder); - result.AddRange(newTagsForFolders); + result.AddRange(FromQuery(newTagsForFolders)); - var newTagsForFiles = dbManager.ExecuteList(getBaseSqlQuery() - .InnerJoin("files_file ff", - Exp.EqColumns("ftl.tenant_id", "ff.tenant_id") & - Exp.EqColumns("ftl.entry_id", "ff.id")) - .Where(Exp.In("ff.folder_id", (deepSearch - ? monitorFolderIds.ToArray() - : new[] { parentFolder.ID })) & - Exp.Eq("ftl.entry_type", (int)FileEntryType.File))) - .ConvertAll(ToTag); + var newTagsForFiles = + getBaseSqlQuery() + .Join(FilesDbContext.Files, r => r.Link.EntryId, r => r.Id.ToString(), (tagLink, file) => new { tagLink, file }) + .Where(r => r.file.TenantId == r.tagLink.Link.TenantId) + .Where(r => (deepSearch ? monitorFolderIds.ToArray() : new[] { parentFolder.ID }).Any(a => r.file.FolderId == (int)a)) + .Where(r => r.tagLink.Link.EntryType == FileEntryType.File) + .Select(r => r.tagLink); - result.AddRange(newTagsForFiles); + result.AddRange(FromQuery(newTagsForFiles)); if (parentFolder.FolderType == FolderType.USER || parentFolder.FolderType == FolderType.COMMON) { var folderType = parentFolder.FolderType; - var querySelect = new SqlQuery("files_thirdparty_account") - .Select("id") - .Where("tenant_id", TenantID) - .Where("folder_type", (int)folderType); + var querySelect = FilesDbContext.ThirdpartyAccount + .Where(r => r.TenantId == TenantID) + .Where(r => r.FolderType == folderType); if (folderType == FolderType.USER) - querySelect = querySelect.Where(Exp.Eq("user_id", subject.ToString())); + { + querySelect = querySelect.Where(r => r.UserId == subject); + } - var folderIds = dbManager.ExecuteList(querySelect); - var thirdpartyFolderIds = folderIds.ConvertAll(r => "sbox-" + r[0]) - .Concat(folderIds.ConvertAll(r => "box-" + r[0])) - .Concat(folderIds.ConvertAll(r => "dropbox-" + r[0])) - .Concat(folderIds.ConvertAll(r => "spoint-" + r[0])) - .Concat(folderIds.ConvertAll(r => "drive-" + r[0])) - .Concat(folderIds.ConvertAll(r => "onedrive-" + r[0])); + var folderIds = querySelect.Select(r => r.Id).ToList(); + var thirdpartyFolderIds = folderIds.ConvertAll(r => "sbox-" + r) + .Concat(folderIds.ConvertAll(r => $"box-{r}")) + .Concat(folderIds.ConvertAll(r => $"dropbox-{r}")) + .Concat(folderIds.ConvertAll(r => $"spoint-{r}")) + .Concat(folderIds.ConvertAll(r => $"drive-{r}")) + .Concat(folderIds.ConvertAll(r => $"onedrive-{r}")); - var newTagsForSBox = dbManager.ExecuteList(getBaseSqlQuery() - .InnerJoin("files_thirdparty_id_mapping mp", - Exp.EqColumns("mp.tenant_id", "ftl.tenant_id") & - Exp.EqColumns("ftl.entry_id", "mp.hash_id")) - .Where(Exp.In("mp.id", thirdpartyFolderIds.ToList()) & - Exp.Eq("ft.owner", subject) & - Exp.Eq("ftl.entry_type", (int)FileEntryType.Folder))) - .ConvertAll(ToTag); + var newTagsForSBox = getBaseSqlQuery() + .Join(FilesDbContext.ThirdpartyIdMapping, r => r.Link.EntryId, r => r.HashId, (tagLink, mapping) => new { tagLink, mapping }) + .Where(r => r.mapping.TenantId == r.tagLink.Link.TenantId) + .Where(r => thirdpartyFolderIds.Any(a => r.mapping.Id == a)) + .Where(r => r.tagLink.Tag.Owner == subject) + .Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder) + .Select(r => r.tagLink); - result.AddRange(newTagsForSBox); + result.AddRange(FromQuery(newTagsForSBox)); } return result; } - private Tag ToTag(object[] r) + protected List FromQuery(IQueryable dbFilesTags) { - var result = new Tag((string)r[0], (TagType)Convert.ToInt32(r[1]), new Guid((string)r[2]), null, Convert.ToInt32(r[5])) - { - EntryId = MappingID(r[3]), - EntryType = (FileEntryType)Convert.ToInt32(r[4]), - Id = Convert.ToInt32(r[6]), - }; + return dbFilesTags + .ToList() + .Select(ToTag) + .ToList(); + } + + private Tag ToTag(TagLinkData r) + { + var result = new Tag(r.Tag.Name, r.Tag.Flag, r.Tag.Owner, null, r.Link.TagCount) + { + EntryId = MappingID(r.Link.EntryId), + EntryType = r.Link.EntryType, + Id = r.Tag.Id, + }; return result; } } + + public class TagLinkData + { + public DbFilesTag Tag { get; set; } + + public DbFilesTagLink Link { get; set; } + } } \ No newline at end of file diff --git a/products/ASC.Files/Server/Core/EF/DbFilesTag.cs b/products/ASC.Files/Server/Core/EF/DbFilesTag.cs index 47f8714627..9490163de4 100644 --- a/products/ASC.Files/Server/Core/EF/DbFilesTag.cs +++ b/products/ASC.Files/Server/Core/EF/DbFilesTag.cs @@ -15,6 +15,6 @@ namespace ASC.Files.Core.EF public Guid Owner { get; set; } - public int Flag { get; set; } + public TagType Flag { get; set; } } } diff --git a/products/ASC.Files/Server/Core/EF/DbFilesTagLink.cs b/products/ASC.Files/Server/Core/EF/DbFilesTagLink.cs index 4757400df3..4415bcf15d 100644 --- a/products/ASC.Files/Server/Core/EF/DbFilesTagLink.cs +++ b/products/ASC.Files/Server/Core/EF/DbFilesTagLink.cs @@ -17,7 +17,7 @@ namespace ASC.Files.Core.EF public int TagId { get; set; } [Column("entry_type")] - public int EntryType { get; set; } + public FileEntryType EntryType { get; set; } [Column("entry_id")] public string EntryId { get; set; } @@ -29,7 +29,7 @@ namespace ASC.Files.Core.EF public DateTime CreateOn { get; set; } [Column("tag_count")] - public DateTime TagCount { get; set; } + public int TagCount { get; set; } public override object[] GetKeys() { diff --git a/products/ASC.Files/Server/Core/EF/DbFilesThirdpartyAccount.cs b/products/ASC.Files/Server/Core/EF/DbFilesThirdpartyAccount.cs new file mode 100644 index 0000000000..301cabaf5c --- /dev/null +++ b/products/ASC.Files/Server/Core/EF/DbFilesThirdpartyAccount.cs @@ -0,0 +1,37 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ASC.Files.Core.EF +{ + [Table("files_thirdparty_account")] + public class DbFilesThirdpartyAccount : IDbFile + { + public int Id { get; set; } + + public string Provider { get; set; } + + [Column("customer_title")] + public string CustomerTitle { get; set; } + + [Column("user_name")] + public string UserName { get; set; } + + public string Password { get; set; } + + public string Token { get; set; } + + [Column("user_id")] + public Guid UserId { get; set; } + + [Column("folder_type")] + public FolderType FolderType { get; set; } + + [Column("create_on")] + public DateTime CreateOn { get; set; } + + public string Url { get; set; } + + [Column("tenant_id")] + public int TenantId { get; set; } + } +} diff --git a/products/ASC.Files/Server/Core/EF/FilesDbContext.cs b/products/ASC.Files/Server/Core/EF/FilesDbContext.cs index d03d9a6bd3..6b986d9a88 100644 --- a/products/ASC.Files/Server/Core/EF/FilesDbContext.cs +++ b/products/ASC.Files/Server/Core/EF/FilesDbContext.cs @@ -13,6 +13,7 @@ namespace ASC.Files.Core.EF public DbSet BunchObjects { get; set; } public DbSet Security { get; set; } public DbSet ThirdpartyIdMapping { get; set; } + public DbSet ThirdpartyAccount { get; set; } public DbSet TagLink { get; set; } public DbSet Tag { get; set; }