Files: FileDao

This commit is contained in:
pavelbannov 2020-01-28 17:59:59 +03:00
parent 4cee8feb84
commit 08d51bb1ed
10 changed files with 563 additions and 373 deletions

View File

@ -68,8 +68,8 @@ namespace ASC.Web.Files
public override List<UsageSpaceStatItem> GetStatData()
{
var myFiles = FilesDbContext.Files
.Join(FilesDbContext.FolderTree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.FilesBunchObjects, a => a.tree.ParentId.ToString(), b => b.LeftNode, (fileTree, bunch) => new { fileTree.file, fileTree.tree, bunch })
.Join(FilesDbContext.Tree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.BunchObjects, a => a.tree.ParentId.ToString(), b => b.LeftNode, (fileTree, bunch) => new { fileTree.file, fileTree.tree, bunch })
.Where(r => r.file.TenantId == r.bunch.TenantId)
.Where(r => r.file.TenantId == TenantManager.GetCurrentTenant().TenantId)
.Where(r => r.bunch.RightNode.StartsWith("files/my/") | r.bunch.RightNode.StartsWith("files/trash/"))
@ -77,8 +77,8 @@ namespace ASC.Web.Files
.Select(r => new { CreateBy = r.Key, Size = r.Sum(a => a.file.ContentLength) });
var commonFiles = FilesDbContext.Files
.Join(FilesDbContext.FolderTree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.FilesBunchObjects, a => a.tree.ParentId.ToString(), b => b.LeftNode, (fileTree, bunch) => new { fileTree.file, fileTree.tree, bunch })
.Join(FilesDbContext.Tree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.BunchObjects, a => a.tree.ParentId.ToString(), b => b.LeftNode, (fileTree, bunch) => new { fileTree.file, fileTree.tree, bunch })
.Where(r => r.file.TenantId == r.bunch.TenantId)
.Where(r => r.file.TenantId == TenantManager.GetCurrentTenant().TenantId)
.Where(r => r.bunch.RightNode.StartsWith("files/common/"))
@ -117,8 +117,8 @@ namespace ASC.Web.Files
public long GetUserSpaceUsage(Guid userId)
{
return FilesDbContext.Files
.Join(FilesDbContext.FolderTree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.FilesBunchObjects, a => a.tree.ParentId.ToString(), b => b.LeftNode, (fileTree, bunch) => new { fileTree.file, fileTree.tree, bunch })
.Join(FilesDbContext.Tree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.BunchObjects, a => a.tree.ParentId.ToString(), b => b.LeftNode, (fileTree, bunch) => new { fileTree.file, fileTree.tree, bunch })
.Where(r => r.file.TenantId == r.bunch.TenantId)
.Where(r => r.file.TenantId == TenantManager.GetCurrentTenant().TenantId)
.Where(r => r.file.CreateBy == userId)

View File

@ -33,7 +33,7 @@ namespace ASC.Files.Core
/// <summary>
/// Interface encapsulates access toFolderId files
/// </summary>
public interface IFileDao : IDisposable
public interface IFileDao
{
/// <summary>
/// Clear the application cache for the specific file

View File

@ -49,10 +49,14 @@ namespace ASC.Files.Core.Data
public FilesDbContext FilesDbContext { get; }
internal int TenantID { get; }
protected internal int TenantID { get; }
public TenantUtil TenantUtil { get; }
protected AbstractDao(DbContextManager<FilesDbContext> dbContextManager, TenantManager tenantManager, TenantUtil tenantUtil, string storageKey)
protected AbstractDao(
DbContextManager<FilesDbContext> dbContextManager,
TenantManager tenantManager,
TenantUtil tenantUtil,
string storageKey)
{
cache = AscCache.Memory;
FilesDbContext = dbContextManager.Value;
@ -104,7 +108,7 @@ namespace ASC.Files.Core.Data
protected string GetRootFolderType(DbFile file)
{
return FilesDbContext.Folders
.Join(FilesDbContext.FolderTree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Where(r => r.folder.TenantId == file.TenantId)
.Where(r => r.tree.FolderId == file.FolderId)
.OrderByDescending(r => r.tree.Level)
@ -132,23 +136,23 @@ namespace ASC.Files.Core.Data
protected bool GetSharedQuery(FileEntryType type, DbFile dbFile)
{
return
FilesDbContext.FilesSecurity
FilesDbContext.Security
.Where(r => r.EntryType == type)
.Where(r => r.EntryId == dbFile.Id.ToString())
.Any();
}
protected void GetRecalculateFilesCountUpdate(int folderId)
protected void GetRecalculateFilesCountUpdate(object folderId)
{
var folders = FilesDbContext.Folders
.Where(r => r.TenantId == TenantID)
.Where(r => FilesDbContext.FolderTree.Where(r => r.FolderId == folderId).Select(r => r.ParentId).Any(a => a == r.Id));
.Where(r => FilesDbContext.Tree.Where(r => (object)r.FolderId == folderId).Select(r => r.ParentId).Any(a => a == r.Id));
foreach (var f in folders)
{
var filesCount =
FilesDbContext.Files
.Join(FilesDbContext.FolderTree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Join(FilesDbContext.Tree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
.Where(r => r.file.TenantId == f.TenantId)
.Where(r => r.tree.ParentId == f.Id)
.Count();
@ -180,7 +184,7 @@ namespace ASC.Files.Core.Data
}
else
{
result = Query(r => r.FilesThirdpartyIdMapping)
result = Query(r => r.ThirdpartyIdMapping)
.Where(r => r.HashId == id.ToString())
.Select(r => r.Id)
.FirstOrDefault();
@ -194,7 +198,7 @@ namespace ASC.Files.Core.Data
HashId = result.ToString()
};
FilesDbContext.AddOrUpdate(r => r.FilesThirdpartyIdMapping, newItem);
FilesDbContext.AddOrUpdate(r => r.ThirdpartyIdMapping, newItem);
}
return result;
@ -205,9 +209,24 @@ namespace ASC.Files.Core.Data
return MappingID(id, false);
}
//public static Exp BuildSearch(string column, string text, SqlLike like = SqlLike.AnyWhere)
//{
// return Exp.Like(string.Format("lower({0})", column), text.ToLower().Trim().Replace("%", "\\%").Replace("_", "\\_"), like);
//}
internal static bool BuildSearch(IDbSearch dbSearch, string text, SearhTypeEnum searhTypeEnum)
{
var lowerTitle = dbSearch.Title.ToLower();
var lowerText = text.ToLower().Trim().Replace("%", "\\%").Replace("_", "\\_");
return searhTypeEnum switch
{
SearhTypeEnum.Start => lowerTitle.StartsWith(lowerText),
SearhTypeEnum.End => lowerTitle.EndsWith(lowerText),
SearhTypeEnum.Any => lowerTitle.Contains(lowerText),
_ => lowerTitle.EndsWith(lowerText),
};
}
internal enum SearhTypeEnum
{
Start,
End,
Any
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore;
namespace ASC.Files.Core.EF
{
[Table("files_file")]
public class DbFile : BaseEntity, IDbFile
public class DbFile : BaseEntity, IDbFile, IDbSearch
{
public int Id { get; set; }
public int Version { get; set; }
@ -17,7 +17,7 @@ namespace ASC.Files.Core.EF
public int VersionGroup { get; set; }
[Column("current_version")]
public int CurrentVersion { get; set; }
public bool CurrentVersion { get; set; }
[Column("folder_id")]
public int FolderId { get; set; }

View File

@ -0,0 +1,20 @@
using System;
using System.ComponentModel.DataAnnotations.Schema;
namespace ASC.Files.Core.EF
{
[Table("files_tag")]
public class DbFilesTag : IDbFile
{
[Column("tenant_id")]
public int TenantId { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public Guid Owner { get; set; }
public int Flag { get; set; }
}
}

View File

@ -0,0 +1,50 @@
using System;
using System.ComponentModel.DataAnnotations.Schema;
using ASC.Core.Common.EF;
using Microsoft.EntityFrameworkCore;
namespace ASC.Files.Core.EF
{
[Table("files_tag_link")]
public class DbFilesTagLink : BaseEntity, IDbFile
{
[Column("tenant_id")]
public int TenantId { get; set; }
[Column("tag_id")]
public int TagId { get; set; }
[Column("entry_type")]
public int EntryType { get; set; }
[Column("entry_id")]
public string EntryId { get; set; }
[Column("create_by")]
public Guid CreateBy { get; set; }
[Column("create_on")]
public DateTime CreateOn { get; set; }
[Column("tag_count")]
public DateTime TagCount { get; set; }
public override object[] GetKeys()
{
return new object[] { TenantId, TagId, EntryId, EntryType };
}
}
public static class DbFilesTagLinkExtension
{
public static ModelBuilder AddDbFilesTagLink(this ModelBuilder modelBuilder)
{
modelBuilder.Entity<DbFilesTagLink>()
.HasKey(c => new { c.TenantId, c.TagId, c.EntryId, c.EntryType });
return modelBuilder;
}
}
}

View File

@ -9,10 +9,12 @@ namespace ASC.Files.Core.EF
{
public DbSet<DbFile> Files { get; set; }
public DbSet<DbFolder> Folders { get; set; }
public DbSet<DbFolderTree> FolderTree { get; set; }
public DbSet<DbFilesBunchObjects> FilesBunchObjects { get; set; }
public DbSet<DbFilesSecurity> FilesSecurity { get; set; }
public DbSet<DbFilesThirdpartyIdMapping> FilesThirdpartyIdMapping { get; set; }
public DbSet<DbFolderTree> Tree { get; set; }
public DbSet<DbFilesBunchObjects> BunchObjects { get; set; }
public DbSet<DbFilesSecurity> Security { get; set; }
public DbSet<DbFilesThirdpartyIdMapping> ThirdpartyIdMapping { get; set; }
public DbSet<DbFilesTagLink> TagLink { get; set; }
public DbSet<DbFilesTag> Tag { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
@ -21,7 +23,8 @@ namespace ASC.Files.Core.EF
.AddDbFolderTree()
.AddDbFilesBunchObjects()
.AddDbFilesSecurity()
.AddDbFilesThirdpartyIdMapping();
.AddDbFilesThirdpartyIdMapping()
.AddDbFilesTagLink();
}
}

View File

@ -4,4 +4,9 @@
{
public int TenantId { get; set; }
}
public interface IDbSearch
{
public string Title { get; set; }
}
}

View File

@ -30,7 +30,11 @@ using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using ASC.Common.Web;
using ASC.Web.Studio.UserControls.Statistics;
using ASC.Web.Studio.Utility;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
@ -190,6 +194,17 @@ namespace ASC.Web.Studio.Core
return hideSettings == null || !hideSettings.Contains(settings, StringComparer.CurrentCultureIgnoreCase);
}
public long MaxChunkedUploadSize(TenantExtra tenantExtra, TenantStatisticsProvider tenantStatisticsProvider)
{
var diskQuota = tenantExtra.GetTenantQuota();
if (diskQuota != null)
{
var usedSize = tenantStatisticsProvider.GetUsedSize();
var freeSize = Math.Max(diskQuota.MaxTotalSize - usedSize, 0);
return Math.Min(freeSize, diskQuota.MaxFileSize);
}
return ChunkUploadSize;
}
private string GetAppSettings(string key, string defaultValue)
{