added async to ISecurityDao
This commit is contained in:
parent
0876c22f6f
commit
e6f3c19b6e
@ -115,32 +115,6 @@ namespace ASC.Files.Core.Data
|
|||||||
.Where(where);
|
.Where(where);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void GetRecalculateFilesCountUpdate(int folderId)
|
|
||||||
{
|
|
||||||
var folders = FilesDbContext.Folders
|
|
||||||
.AsQueryable()
|
|
||||||
.Where(r => r.TenantId == TenantID)
|
|
||||||
.Where(r => FilesDbContext.Tree.AsQueryable().Where(r => r.FolderId == folderId).Select(r => r.ParentId).Any(a => a == r.Id))
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
foreach (var f in folders)
|
|
||||||
{
|
|
||||||
var filesCount =
|
|
||||||
FilesDbContext.Files
|
|
||||||
.AsQueryable()
|
|
||||||
.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)
|
|
||||||
.Select(r => r.file.Id)
|
|
||||||
.Distinct()
|
|
||||||
.Count();
|
|
||||||
|
|
||||||
f.FilesCount = filesCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
FilesDbContext.SaveChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected async Task GetRecalculateFilesCountUpdateAsync(int folderId)
|
protected async Task GetRecalculateFilesCountUpdateAsync(int folderId)
|
||||||
{
|
{
|
||||||
var folders = await FilesDbContext.Folders
|
var folders = await FilesDbContext.Folders
|
||||||
@ -151,7 +125,7 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
foreach (var f in folders)
|
foreach (var f in folders)
|
||||||
{
|
{
|
||||||
var filesCount =
|
f.FilesCount = await
|
||||||
FilesDbContext.Files
|
FilesDbContext.Files
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.Join(FilesDbContext.Tree, 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 })
|
||||||
@ -160,53 +134,9 @@ namespace ASC.Files.Core.Data
|
|||||||
.Select(r => r.file.Id)
|
.Select(r => r.file.Id)
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.CountAsync();
|
.CountAsync();
|
||||||
|
|
||||||
f.FilesCount = await filesCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
}
|
|
||||||
|
|
||||||
protected object MappingID(object id, bool saveIfNotExist)
|
|
||||||
{
|
|
||||||
if (id == null) return null;
|
|
||||||
|
|
||||||
var isNumeric = int.TryParse(id.ToString(), out var n);
|
|
||||||
|
|
||||||
if (isNumeric) return n;
|
|
||||||
|
|
||||||
object result;
|
|
||||||
|
|
||||||
if (id.ToString().StartsWith("sbox")
|
|
||||||
|| id.ToString().StartsWith("box")
|
|
||||||
|| id.ToString().StartsWith("dropbox")
|
|
||||||
|| id.ToString().StartsWith("spoint")
|
|
||||||
|| id.ToString().StartsWith("drive")
|
|
||||||
|| id.ToString().StartsWith("onedrive"))
|
|
||||||
{
|
|
||||||
result = Regex.Replace(BitConverter.ToString(Hasher.Hash(id.ToString(), HashAlg.MD5)), "-", "").ToLower();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = Query(FilesDbContext.ThirdpartyIdMapping)
|
|
||||||
.Where(r => r.HashId == id.ToString())
|
|
||||||
.Select(r => r.Id)
|
|
||||||
.FirstOrDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (saveIfNotExist)
|
|
||||||
{
|
|
||||||
var newItem = new DbFilesThirdpartyIdMapping
|
|
||||||
{
|
|
||||||
Id = id.ToString(),
|
|
||||||
HashId = result.ToString(),
|
|
||||||
TenantId = TenantID
|
|
||||||
};
|
|
||||||
|
|
||||||
FilesDbContext.AddOrUpdate(r => r.ThirdpartyIdMapping, newItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async ValueTask<object> MappingIDAsync(object id, bool saveIfNotExist = false)
|
protected async ValueTask<object> MappingIDAsync(object id, bool saveIfNotExist = false)
|
||||||
@ -251,15 +181,9 @@ namespace ASC.Files.Core.Data
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected ValueTask<object> MappingIDAsync(object id)
|
||||||
|
|
||||||
protected int MappingID(int id)
|
|
||||||
{
|
{
|
||||||
return id;
|
return MappingIDAsync(id, false);
|
||||||
}
|
|
||||||
protected object MappingID(object id)
|
|
||||||
{
|
|
||||||
return MappingID(id, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static IQueryable<T> BuildSearch<T>(IQueryable<T> query, string text, SearhTypeEnum searhTypeEnum) where T : IDbSearch
|
internal static IQueryable<T> BuildSearch<T>(IQueryable<T> query, string text, SearhTypeEnum searhTypeEnum) where T : IDbSearch
|
||||||
|
@ -81,40 +81,43 @@ namespace ASC.Files.Core.Data
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeleteShareRecords(IEnumerable<FileShareRecord> records)
|
public async Task DeleteShareRecordsAsync(IEnumerable<FileShareRecord> records)
|
||||||
{
|
{
|
||||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
using var tx = await FilesDbContext.Database.BeginTransactionAsync();
|
||||||
|
|
||||||
foreach (var record in records)
|
foreach (var record in records)
|
||||||
{
|
{
|
||||||
var query = FilesDbContext.Security
|
var query = await FilesDbContext.Security
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.Where(r => r.TenantId == record.Tenant)
|
.Where(r => r.TenantId == record.Tenant)
|
||||||
.Where(r => r.EntryId == MappingID(record.EntryId).ToString())
|
|
||||||
.Where(r => r.EntryType == record.EntryType)
|
.Where(r => r.EntryType == record.EntryType)
|
||||||
.Where(r => r.Subject == record.Subject);
|
.Where(r => r.Subject == record.Subject)
|
||||||
|
.AsAsyncEnumerable()
|
||||||
|
.WhereAwait(async r => r.EntryId == (await MappingIDAsync(record.EntryId)).ToString())
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
FilesDbContext.RemoveRange(query);
|
FilesDbContext.RemoveRange(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit();
|
await tx.CommitAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsShared(object entryId, FileEntryType type)
|
public ValueTask<bool> IsSharedAsync(object entryId, FileEntryType type)
|
||||||
{
|
{
|
||||||
return Query(FilesDbContext.Security)
|
return Query(FilesDbContext.Security)
|
||||||
.Any(r => r.EntryId == MappingID(entryId).ToString() &&
|
.AsAsyncEnumerable()
|
||||||
|
.AnyAwaitAsync(async r => r.EntryId == (await MappingIDAsync(entryId)).ToString() &&
|
||||||
r.EntryType == type);
|
r.EntryType == type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetShare(FileShareRecord r)
|
public async Task SetShareAsync(FileShareRecord r)
|
||||||
{
|
{
|
||||||
if (r.Share == FileShare.None)
|
if (r.Share == FileShare.None)
|
||||||
{
|
{
|
||||||
var entryId = (MappingID(r.EntryId) ?? "").ToString();
|
var entryId = (await MappingIDAsync(r.EntryId) ?? "").ToString();
|
||||||
if (string.IsNullOrEmpty(entryId)) return;
|
if (string.IsNullOrEmpty(entryId)) return;
|
||||||
|
|
||||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
using var tx = await FilesDbContext.Database.BeginTransactionAsync();
|
||||||
var files = new List<string>();
|
var files = new List<string>();
|
||||||
|
|
||||||
if (r.EntryType == FileEntryType.Folder)
|
if (r.EntryType == FileEntryType.Folder)
|
||||||
@ -122,14 +125,14 @@ namespace ASC.Files.Core.Data
|
|||||||
var folders = new List<string>();
|
var folders = new List<string>();
|
||||||
if (int.TryParse(entryId, out var intEntryId))
|
if (int.TryParse(entryId, out var intEntryId))
|
||||||
{
|
{
|
||||||
var foldersInt = FilesDbContext.Tree
|
var foldersInt = await FilesDbContext.Tree
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.Where(r => r.ParentId.ToString() == entryId)
|
.Where(r => r.ParentId.ToString() == entryId)
|
||||||
.Select(r => r.FolderId)
|
.Select(r => r.FolderId)
|
||||||
.ToList();
|
.ToListAsync();
|
||||||
|
|
||||||
folders.AddRange(foldersInt.Select(folderInt => folderInt.ToString()));
|
folders.AddRange(foldersInt.Select(folderInt => folderInt.ToString()));
|
||||||
files.AddRange(Query(FilesDbContext.Files).Where(r => foldersInt.Contains(r.FolderId)).Select(r => r.Id.ToString()));
|
files.AddRange(await Query(FilesDbContext.Files).Where(r => foldersInt.Contains(r.FolderId)).Select(r => r.Id.ToString()).ToListAsync());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -144,7 +147,7 @@ namespace ASC.Files.Core.Data
|
|||||||
a.Subject == r.Subject);
|
a.Subject == r.Subject);
|
||||||
|
|
||||||
FilesDbContext.Security.RemoveRange(toDelete);
|
FilesDbContext.Security.RemoveRange(toDelete);
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -162,17 +165,17 @@ namespace ASC.Files.Core.Data
|
|||||||
a.Subject == r.Subject);
|
a.Subject == r.Subject);
|
||||||
|
|
||||||
FilesDbContext.Security.RemoveRange(toDelete);
|
FilesDbContext.Security.RemoveRange(toDelete);
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit();
|
await tx.CommitAsync();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var toInsert = new DbFilesSecurity
|
var toInsert = new DbFilesSecurity
|
||||||
{
|
{
|
||||||
TenantId = r.Tenant,
|
TenantId = r.Tenant,
|
||||||
EntryId = MappingID(r.EntryId, true).ToString(),
|
EntryId = (await MappingIDAsync(r.EntryId, true)).ToString(),
|
||||||
EntryType = r.EntryType,
|
EntryType = r.EntryType,
|
||||||
Subject = r.Subject,
|
Subject = r.Subject,
|
||||||
Owner = r.Owner,
|
Owner = r.Owner,
|
||||||
@ -180,18 +183,18 @@ namespace ASC.Files.Core.Data
|
|||||||
TimeStamp = DateTime.UtcNow
|
TimeStamp = DateTime.UtcNow
|
||||||
};
|
};
|
||||||
|
|
||||||
FilesDbContext.AddOrUpdate(r => r.Security, toInsert);
|
await FilesDbContext.AddOrUpdateAsync(r => r.Security, toInsert);
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(IEnumerable<Guid> subjects)
|
public ValueTask<List<FileShareRecord>> GetSharesAsync(IEnumerable<Guid> subjects)
|
||||||
{
|
{
|
||||||
var q = GetQuery(r => subjects.Contains(r.Subject));
|
var q = GetQuery(r => subjects.Contains(r.Subject));
|
||||||
return FromQuery(q);
|
return FromQueryAsync(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetPureShareRecords(IEnumerable<FileEntry<T>> entries)
|
public async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(IEnumerable<FileEntry<T>> entries)
|
||||||
{
|
{
|
||||||
if (entries == null) return new List<FileShareRecord>();
|
if (entries == null) return new List<FileShareRecord>();
|
||||||
|
|
||||||
@ -200,10 +203,10 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
foreach (var entry in entries)
|
foreach (var entry in entries)
|
||||||
{
|
{
|
||||||
SelectFilesAndFoldersForShare(entry, files, folders, null);
|
await SelectFilesAndFoldersForShareAsync(entry, files, folders, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetPureShareRecordsDb(files, folders);
|
return await GetPureShareRecordsDbAsync(files, folders);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(IAsyncEnumerable<FileEntry<T>> entries)
|
public async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(IAsyncEnumerable<FileEntry<T>> entries)
|
||||||
@ -218,35 +221,19 @@ namespace ASC.Files.Core.Data
|
|||||||
await SelectFilesAndFoldersForShareAsync(entry, files, folders, null);
|
await SelectFilesAndFoldersForShareAsync(entry, files, folders, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetPureShareRecordsDb(files, folders);
|
return await GetPureShareRecordsDbAsync(files, folders);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetPureShareRecords(FileEntry<T> entry)
|
public async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(FileEntry<T> entry)
|
||||||
{
|
{
|
||||||
if (entry == null) return new List<FileShareRecord>();
|
if (entry == null) return new List<FileShareRecord>();
|
||||||
|
|
||||||
var files = new List<string>();
|
var files = new List<string>();
|
||||||
var folders = new List<string>();
|
var folders = new List<string>();
|
||||||
|
|
||||||
SelectFilesAndFoldersForShare(entry, files, folders, null);
|
await SelectFilesAndFoldersForShareAsync(entry, files, folders, null);
|
||||||
|
|
||||||
return GetPureShareRecordsDb(files, folders);
|
return await GetPureShareRecordsDbAsync(files, folders);
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerable<FileShareRecord> GetPureShareRecordsDb(List<string> files, List<string> folders)
|
|
||||||
{
|
|
||||||
var result = new List<FileShareRecord>();
|
|
||||||
|
|
||||||
var q = GetQuery(r => folders.Contains(r.EntryId) && r.EntryType == FileEntryType.Folder);
|
|
||||||
|
|
||||||
if (files.Any())
|
|
||||||
{
|
|
||||||
q = q.Union(GetQuery(r => files.Contains(r.EntryId) && r.EntryType == FileEntryType.File));
|
|
||||||
}
|
|
||||||
|
|
||||||
result.AddRange(FromQuery(q));
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsDbAsync(List<string> files, List<string> folders)
|
private async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsDbAsync(List<string> files, List<string> folders)
|
||||||
@ -270,7 +257,7 @@ namespace ASC.Files.Core.Data
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="entries"></param>
|
/// <param name="entries"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<FileShareRecord> GetShares(IEnumerable<FileEntry<T>> entries)
|
public async Task<IEnumerable<FileShareRecord>> GetSharesAsync(IEnumerable<FileEntry<T>> entries)
|
||||||
{
|
{
|
||||||
if (entries == null) return new List<FileShareRecord>();
|
if (entries == null) return new List<FileShareRecord>();
|
||||||
|
|
||||||
@ -279,10 +266,10 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
foreach (var entry in entries)
|
foreach (var entry in entries)
|
||||||
{
|
{
|
||||||
SelectFilesAndFoldersForShare(entry, files, null, foldersInt);
|
await SelectFilesAndFoldersForShareAsync(entry, files, null, foldersInt);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SaveFilesAndFoldersForShare(files, foldersInt);
|
return await SaveFilesAndFoldersForShareAsync(files, foldersInt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -290,34 +277,15 @@ namespace ASC.Files.Core.Data
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="entry"></param>
|
/// <param name="entry"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<FileShareRecord> GetShares(FileEntry<T> entry)
|
public async Task<IEnumerable<FileShareRecord>> GetSharesAsync(FileEntry<T> entry)
|
||||||
{
|
{
|
||||||
if (entry == null) return new List<FileShareRecord>();
|
if (entry == null) return new List<FileShareRecord>();
|
||||||
|
|
||||||
var files = new List<string>();
|
var files = new List<string>();
|
||||||
var foldersInt = new List<int>();
|
var foldersInt = new List<int>();
|
||||||
|
|
||||||
SelectFilesAndFoldersForShare(entry, files, null, foldersInt);
|
await SelectFilesAndFoldersForShareAsync(entry, files, null, foldersInt);
|
||||||
return SaveFilesAndFoldersForShare(files, foldersInt);
|
return await SaveFilesAndFoldersForShareAsync(files, foldersInt);
|
||||||
}
|
|
||||||
|
|
||||||
private void SelectFilesAndFoldersForShare(FileEntry<T> entry, ICollection<string> files, ICollection<string> folders, ICollection<int> foldersInt)
|
|
||||||
{
|
|
||||||
T folderId;
|
|
||||||
if (entry.FileEntryType == FileEntryType.File)
|
|
||||||
{
|
|
||||||
var fileId = MappingID(entry.ID);
|
|
||||||
folderId = ((File<T>)entry).FolderID;
|
|
||||||
if (!files.Contains(fileId.ToString())) files.Add(fileId.ToString());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
folderId = entry.ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foldersInt != null && int.TryParse(folderId.ToString(), out var folderIdInt) && !foldersInt.Contains(folderIdInt)) foldersInt.Add(folderIdInt);
|
|
||||||
|
|
||||||
if (folders != null) folders.Add(MappingID(folderId).ToString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SelectFilesAndFoldersForShareAsync(FileEntry<T> entry, ICollection<string> files, ICollection<string> folders, ICollection<int> foldersInt)
|
private async Task SelectFilesAndFoldersForShareAsync(FileEntry<T> entry, ICollection<string> files, ICollection<string> folders, ICollection<int> foldersInt)
|
||||||
@ -340,42 +308,41 @@ namespace ASC.Files.Core.Data
|
|||||||
if (folders != null) folders.Add(mappedId.ToString());
|
if (folders != null) folders.Add(mappedId.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<FileShareRecord> SaveFilesAndFoldersForShare(List<string> files, List<int> folders)
|
private async Task<IEnumerable<FileShareRecord>> SaveFilesAndFoldersForShareAsync(List<string> files, List<int> folders)
|
||||||
{
|
{
|
||||||
var q = Query(FilesDbContext.Security)
|
var q = Query(FilesDbContext.Security)
|
||||||
.Join(FilesDbContext.Tree, r => r.EntryId, a => a.ParentId.ToString(), (security, tree) => new SecurityTreeRecord { DbFilesSecurity = security, DbFolderTree = tree })
|
.Join(FilesDbContext.Tree, r => r.EntryId, a => a.ParentId.ToString(), (security, tree) => new SecurityTreeRecord { DbFilesSecurity = security, DbFolderTree = tree })
|
||||||
.Where(r => folders.Contains(r.DbFolderTree.FolderId) &&
|
.Where(r => folders.Contains(r.DbFolderTree.FolderId) &&
|
||||||
r.DbFilesSecurity.EntryType == FileEntryType.Folder)
|
r.DbFilesSecurity.EntryType == FileEntryType.Folder);
|
||||||
.ToList();
|
|
||||||
|
|
||||||
if (0 < files.Count)
|
if (0 < files.Count)
|
||||||
{
|
{
|
||||||
var q1 = GetQuery(r => files.Contains(r.EntryId) && r.EntryType == FileEntryType.File)
|
var q1 = GetQuery(r => files.Contains(r.EntryId) && r.EntryType == FileEntryType.File)
|
||||||
.Select(r => new SecurityTreeRecord { DbFilesSecurity = r })
|
.Select(r => new SecurityTreeRecord { DbFilesSecurity = r });
|
||||||
.ToList();
|
q = q.Union(q1);
|
||||||
q = q.Union(q1).ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return q.Select(ToFileShareRecord)
|
return await q.AsAsyncEnumerable()
|
||||||
|
.SelectAwait(async e => await ToFileShareRecordAsync(e))
|
||||||
.OrderBy(r => r.Level)
|
.OrderBy(r => r.Level)
|
||||||
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
|
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
|
||||||
.ToList();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveSubject(Guid subject)
|
public async Task RemoveSubjectAsync(Guid subject)
|
||||||
{
|
{
|
||||||
using var tr = FilesDbContext.Database.BeginTransaction();
|
using var tr = await FilesDbContext.Database.BeginTransactionAsync();
|
||||||
|
|
||||||
var toDelete1 = FilesDbContext.Security.AsQueryable().Where(r => r.Subject == subject);
|
var toDelete1 = FilesDbContext.Security.AsQueryable().Where(r => r.Subject == subject);
|
||||||
var toDelete2 = FilesDbContext.Security.AsQueryable().Where(r => r.Owner == subject);
|
var toDelete2 = FilesDbContext.Security.AsQueryable().Where(r => r.Owner == subject);
|
||||||
|
|
||||||
FilesDbContext.RemoveRange(toDelete1);
|
FilesDbContext.RemoveRange(toDelete1);
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
|
|
||||||
FilesDbContext.RemoveRange(toDelete2);
|
FilesDbContext.RemoveRange(toDelete2);
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
|
|
||||||
tr.Commit();
|
await tr.CommitAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private IQueryable<DbFilesSecurity> GetQuery(Expression<Func<DbFilesSecurity, bool>> where = null)
|
private IQueryable<DbFilesSecurity> GetQuery(Expression<Func<DbFilesSecurity, bool>> where = null)
|
||||||
@ -388,36 +355,20 @@ namespace ASC.Files.Core.Data
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<FileShareRecord> FromQuery(IQueryable<DbFilesSecurity> filesSecurities)
|
protected ValueTask<List<FileShareRecord>> FromQueryAsync(IQueryable<DbFilesSecurity> filesSecurities)
|
||||||
{
|
{
|
||||||
return filesSecurities
|
return filesSecurities
|
||||||
.ToList()
|
.AsAsyncEnumerable()
|
||||||
.Select(ToFileShareRecord)
|
.SelectAwait(async e => await ToFileShareRecordAsync(e))
|
||||||
.ToList();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task<List<FileShareRecord>> FromQueryAsync(IQueryable<DbFilesSecurity> filesSecurities)
|
private async Task<FileShareRecord> ToFileShareRecordAsync(DbFilesSecurity r)
|
||||||
{
|
|
||||||
var files = await filesSecurities.ToListAsync();
|
|
||||||
return files
|
|
||||||
.Select(ToFileShareRecord)
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected List<FileShareRecord> FromQuery(IQueryable<SecurityTreeRecord> filesSecurities)
|
|
||||||
{
|
|
||||||
return filesSecurities
|
|
||||||
.ToList()
|
|
||||||
.Select(ToFileShareRecord)
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private FileShareRecord ToFileShareRecord(DbFilesSecurity r)
|
|
||||||
{
|
{
|
||||||
return new FileShareRecord
|
return new FileShareRecord
|
||||||
{
|
{
|
||||||
Tenant = r.TenantId,
|
Tenant = r.TenantId,
|
||||||
EntryId = MappingID(r.EntryId),
|
EntryId = await MappingIDAsync(r.EntryId),
|
||||||
EntryType = r.EntryType,
|
EntryType = r.EntryType,
|
||||||
Subject = r.Subject,
|
Subject = r.Subject,
|
||||||
Owner = r.Owner,
|
Owner = r.Owner,
|
||||||
@ -425,9 +376,9 @@ namespace ASC.Files.Core.Data
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileShareRecord ToFileShareRecord(SecurityTreeRecord r)
|
private async Task<FileShareRecord> ToFileShareRecordAsync(SecurityTreeRecord r)
|
||||||
{
|
{
|
||||||
var result = ToFileShareRecord(r.DbFilesSecurity);
|
var result = await ToFileShareRecordAsync(r.DbFilesSecurity);
|
||||||
if (r.DbFolderTree != null)
|
if (r.DbFolderTree != null)
|
||||||
{
|
{
|
||||||
result.EntryId = r.DbFolderTree.FolderId;
|
result.EntryId = r.DbFolderTree.FolderId;
|
||||||
|
@ -178,7 +178,7 @@ ctx.Tag
|
|||||||
.Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
|
.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.TenantId == r.Tag.TenantId)
|
||||||
.Where(r => r.Link.EntryType == entryType)
|
.Where(r => r.Link.EntryType == entryType)
|
||||||
.Where(r => r.Link.EntryId == MappingID(entryID).ToString())
|
.Where(r => r.Link.EntryId == MappingIDAsync(entryID).Result.ToString())
|
||||||
.Where(r => r.Tag.Flag == tagType);
|
.Where(r => r.Tag.Flag == tagType);
|
||||||
|
|
||||||
await foreach (var e in FromQueryAsync(q).ConfigureAwait(false))
|
await foreach (var e in FromQueryAsync(q).ConfigureAwait(false))
|
||||||
@ -250,7 +250,7 @@ ctx.Tag
|
|||||||
var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow());
|
var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow());
|
||||||
var cacheTagId = new Dictionary<string, int>();
|
var cacheTagId = new Dictionary<string, int>();
|
||||||
|
|
||||||
result.AddRange(tags.Select(t => SaveTag(t, cacheTagId, createOn)));
|
result.AddRange(tags.Select(t => SaveTagAsync(t, cacheTagId, createOn).Result));
|
||||||
|
|
||||||
tx.Commit();
|
tx.Commit();
|
||||||
}
|
}
|
||||||
@ -274,7 +274,7 @@ ctx.Tag
|
|||||||
var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow());
|
var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow());
|
||||||
var cacheTagId = new Dictionary<string, int>();
|
var cacheTagId = new Dictionary<string, int>();
|
||||||
|
|
||||||
result.Add(SaveTag(tag, cacheTagId, createOn));
|
result.Add(SaveTagAsync(tag, cacheTagId, createOn).Result);
|
||||||
|
|
||||||
tx.Commit();
|
tx.Commit();
|
||||||
}
|
}
|
||||||
@ -310,19 +310,19 @@ ctx.Tag
|
|||||||
FilesDbContext.SaveChanges();
|
FilesDbContext.SaveChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Tag SaveTag(Tag t, Dictionary<string, int> cacheTagId, DateTime createOn)
|
private async Task<Tag> SaveTagAsync(Tag t, Dictionary<string, int> cacheTagId, DateTime createOn)
|
||||||
{
|
{
|
||||||
var cacheTagIdKey = string.Join("/", new[] { TenantID.ToString(), t.Owner.ToString(), t.TagName, ((int)t.TagType).ToString(CultureInfo.InvariantCulture) });
|
var cacheTagIdKey = string.Join("/", new[] { TenantID.ToString(), t.Owner.ToString(), t.TagName, ((int)t.TagType).ToString(CultureInfo.InvariantCulture) });
|
||||||
|
|
||||||
if (!cacheTagId.TryGetValue(cacheTagIdKey, out var id))
|
if (!cacheTagId.TryGetValue(cacheTagIdKey, out var id))
|
||||||
{
|
{
|
||||||
id = FilesDbContext.Tag
|
id = await FilesDbContext.Tag
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.Where(r => r.Owner == t.Owner)
|
.Where(r => r.Owner == t.Owner)
|
||||||
.Where(r => r.Name == t.TagName)
|
.Where(r => r.Name == t.TagName)
|
||||||
.Where(r => r.Flag == t.TagType)
|
.Where(r => r.Flag == t.TagType)
|
||||||
.Select(r => r.Id)
|
.Select(r => r.Id)
|
||||||
.FirstOrDefault();
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
{
|
{
|
||||||
@ -336,7 +336,7 @@ ctx.Tag
|
|||||||
};
|
};
|
||||||
|
|
||||||
toAdd = FilesDbContext.Tag.Add(toAdd).Entity;
|
toAdd = FilesDbContext.Tag.Add(toAdd).Entity;
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
id = toAdd.Id;
|
id = toAdd.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,15 +349,15 @@ ctx.Tag
|
|||||||
{
|
{
|
||||||
TenantId = TenantID,
|
TenantId = TenantID,
|
||||||
TagId = id,
|
TagId = id,
|
||||||
EntryId = MappingID(t.EntryId, true).ToString(),
|
EntryId = (await MappingIDAsync(t.EntryId, true)).ToString(),
|
||||||
EntryType = t.EntryType,
|
EntryType = t.EntryType,
|
||||||
CreateBy = AuthContext.CurrentAccount.ID,
|
CreateBy = AuthContext.CurrentAccount.ID,
|
||||||
CreateOn = createOn,
|
CreateOn = createOn,
|
||||||
TagCount = t.Count
|
TagCount = t.Count
|
||||||
};
|
};
|
||||||
|
|
||||||
FilesDbContext.AddOrUpdate(r => r.TagLink, linkToInsert);
|
await FilesDbContext.AddOrUpdateAsync(r => r.TagLink, linkToInsert);
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
@ -373,7 +373,7 @@ ctx.Tag
|
|||||||
|
|
||||||
foreach (var tag in tags)
|
foreach (var tag in tags)
|
||||||
{
|
{
|
||||||
UpdateNewTagsInDb(tag, createOn);
|
UpdateNewTagsInDbAsync(tag, createOn).Wait();
|
||||||
}
|
}
|
||||||
tx.Commit();
|
tx.Commit();
|
||||||
}
|
}
|
||||||
@ -387,18 +387,18 @@ ctx.Tag
|
|||||||
{
|
{
|
||||||
var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow());
|
var createOn = TenantUtil.DateTimeToUtc(TenantUtil.DateTimeNow());
|
||||||
|
|
||||||
UpdateNewTagsInDb(tag, createOn);
|
UpdateNewTagsInDbAsync(tag, createOn).Wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateNewTagsInDb(Tag tag, DateTime createOn)
|
private async Task UpdateNewTagsInDbAsync(Tag tag, DateTime createOn)
|
||||||
{
|
{
|
||||||
if (tag == null) return;
|
if (tag == null) return;
|
||||||
|
|
||||||
var forUpdate = Query(FilesDbContext.TagLink)
|
var forUpdate = Query(FilesDbContext.TagLink)
|
||||||
.Where(r => r.TagId == tag.Id)
|
.Where(r => r.TagId == tag.Id)
|
||||||
.Where(r => r.EntryType == tag.EntryType)
|
.Where(r => r.EntryType == tag.EntryType)
|
||||||
.Where(r => r.EntryId == MappingID(tag.EntryId).ToString());
|
.Where(r => r.EntryId == MappingIDAsync(tag.EntryId).Result.ToString());
|
||||||
|
|
||||||
foreach (var f in forUpdate)
|
foreach (var f in forUpdate)
|
||||||
{
|
{
|
||||||
@ -407,7 +407,7 @@ ctx.Tag
|
|||||||
f.TagCount = tag.Count;
|
f.TagCount = tag.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
FilesDbContext.SaveChanges();
|
await FilesDbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveTags(IEnumerable<Tag> tags)
|
public void RemoveTags(IEnumerable<Tag> tags)
|
||||||
@ -419,7 +419,7 @@ ctx.Tag
|
|||||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||||
foreach (var t in tags)
|
foreach (var t in tags)
|
||||||
{
|
{
|
||||||
RemoveTagInDb(t);
|
RemoveTagInDbAsync(t).Wait();
|
||||||
}
|
}
|
||||||
tx.Commit();
|
tx.Commit();
|
||||||
}
|
}
|
||||||
@ -432,44 +432,12 @@ ctx.Tag
|
|||||||
lock (syncRoot)
|
lock (syncRoot)
|
||||||
{
|
{
|
||||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||||
RemoveTagInDb(tag);
|
RemoveTagInDbAsync(tag).Wait();
|
||||||
|
|
||||||
tx.Commit();
|
tx.Commit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveTagInDb(Tag tag)
|
|
||||||
{
|
|
||||||
if (tag == null) return;
|
|
||||||
|
|
||||||
var id = Query(FilesDbContext.Tag)
|
|
||||||
.Where(r => r.Name == tag.TagName &&
|
|
||||||
r.Owner == tag.Owner &&
|
|
||||||
r.Flag == tag.TagType)
|
|
||||||
.Select(r => r.Id)
|
|
||||||
.FirstOrDefault();
|
|
||||||
|
|
||||||
if (id != 0)
|
|
||||||
{
|
|
||||||
var entryId = MappingID(tag.EntryId).ToString();
|
|
||||||
var toDelete = Query(FilesDbContext.TagLink)
|
|
||||||
.Where(r => r.TagId == id &&
|
|
||||||
r.EntryId == entryId &&
|
|
||||||
r.EntryType == tag.EntryType);
|
|
||||||
|
|
||||||
FilesDbContext.TagLink.RemoveRange(toDelete);
|
|
||||||
FilesDbContext.SaveChanges();
|
|
||||||
|
|
||||||
var count = Query(FilesDbContext.TagLink).Count(r => r.TagId == id);
|
|
||||||
if (count == 0)
|
|
||||||
{
|
|
||||||
var tagToDelete = Query(FilesDbContext.Tag).Where(r => r.Id == id);
|
|
||||||
FilesDbContext.Tag.RemoveRange(tagToDelete);
|
|
||||||
FilesDbContext.SaveChanges();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task RemoveTagInDbAsync(Tag tag)
|
private async Task RemoveTagInDbAsync(Tag tag)
|
||||||
{
|
{
|
||||||
if (tag == null) return;
|
if (tag == null) return;
|
||||||
|
@ -2001,7 +2001,7 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
}
|
}
|
||||||
|
|
||||||
var securityDao = GetSecurityDao();
|
var securityDao = GetSecurityDao();
|
||||||
if (securityDao.IsShared(entry.ID, entry.FileEntryType))
|
if (await securityDao.IsSharedAsync(entry.ID, entry.FileEntryType))
|
||||||
{
|
{
|
||||||
result.Add(entry.ID);
|
result.Add(entry.ID);
|
||||||
}
|
}
|
||||||
@ -2009,19 +2009,6 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveAce(List<T> filesId, List<T> foldersId)
|
|
||||||
{
|
|
||||||
ErrorIf(!AuthContext.IsAuthenticated, FilesCommonResource.ErrorMassage_SecurityException);
|
|
||||||
var entries = new List<FileEntry<T>>();
|
|
||||||
|
|
||||||
var fileDao = GetFileDao();
|
|
||||||
var folderDao = GetFolderDao();
|
|
||||||
entries.AddRange(filesId.Select(fileId => fileDao.GetFileAsync(fileId).Result));
|
|
||||||
entries.AddRange(foldersId.Select(e => folderDao.GetFolderAsync(e).Result));
|
|
||||||
|
|
||||||
FileSharingAceHelper.RemoveAce(entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task RemoveAceAsync(List<T> filesId, List<T> foldersId)
|
public Task RemoveAceAsync(List<T> filesId, List<T> foldersId)
|
||||||
{
|
{
|
||||||
ErrorIf(!AuthContext.IsAuthenticated, FilesCommonResource.ErrorMassage_SecurityException);
|
ErrorIf(!AuthContext.IsAuthenticated, FilesCommonResource.ErrorMassage_SecurityException);
|
||||||
@ -2084,7 +2071,7 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
}
|
}
|
||||||
|
|
||||||
var securityDao = GetSecurityDao();
|
var securityDao = GetSecurityDao();
|
||||||
return securityDao.IsShared(file.ID, FileEntryType.File);
|
return await securityDao.IsSharedAsync(file.ID, FileEntryType.File);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<MentionWrapper>> SharedUsersAsync(T fileId)
|
public async Task<List<MentionWrapper>> SharedUsersAsync(T fileId)
|
||||||
|
@ -679,7 +679,7 @@ namespace ASC.Files.Core.Security
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Share<T>(T entryId, FileEntryType entryType, Guid @for, FileShare share)
|
public async Task ShareAsync<T>(T entryId, FileEntryType entryType, Guid @for, FileShare share)
|
||||||
{
|
{
|
||||||
var securityDao = daoFactory.GetSecurityDao<T>();
|
var securityDao = daoFactory.GetSecurityDao<T>();
|
||||||
var r = new FileShareRecord
|
var r = new FileShareRecord
|
||||||
@ -691,24 +691,34 @@ namespace ASC.Files.Core.Security
|
|||||||
Owner = AuthContext.CurrentAccount.ID,
|
Owner = AuthContext.CurrentAccount.ID,
|
||||||
Share = share,
|
Share = share,
|
||||||
};
|
};
|
||||||
securityDao.SetShare(r);
|
await securityDao.SetShareAsync(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares<T>(IEnumerable<FileEntry<T>> entries)
|
public IEnumerable<FileShareRecord> GetShares<T>(IEnumerable<FileEntry<T>> entries)
|
||||||
{
|
{
|
||||||
return daoFactory.GetSecurityDao<T>().GetShares(entries);
|
return daoFactory.GetSecurityDao<T>().GetSharesAsync(entries).Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<FileShareRecord>> GetSharesAsync<T>(IEnumerable<FileEntry<T>> entries)
|
||||||
|
{
|
||||||
|
return await daoFactory.GetSecurityDao<T>().GetSharesAsync(entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares<T>(FileEntry<T> entry)
|
public IEnumerable<FileShareRecord> GetShares<T>(FileEntry<T> entry)
|
||||||
{
|
{
|
||||||
return daoFactory.GetSecurityDao<T>().GetShares(entry);
|
return daoFactory.GetSecurityDao<T>().GetSharesAsync(entry).Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<FileShareRecord>> GetSharesAsync<T>(FileEntry<T> entry)
|
||||||
|
{
|
||||||
|
return await daoFactory.GetSecurityDao<T>().GetSharesAsync(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<FileEntry>> GetSharesForMeAsync(FilterType filterType, bool subjectGroup, Guid subjectID, string searchText = "", bool searchInContent = false, bool withSubfolders = false)
|
public async Task<List<FileEntry>> GetSharesForMeAsync(FilterType filterType, bool subjectGroup, Guid subjectID, string searchText = "", bool searchInContent = false, bool withSubfolders = false)
|
||||||
{
|
{
|
||||||
var securityDao = daoFactory.GetSecurityDao<int>();
|
var securityDao = daoFactory.GetSecurityDao<int>();
|
||||||
var subjects = GetUserSubjects(AuthContext.CurrentAccount.ID);
|
var subjects = GetUserSubjects(AuthContext.CurrentAccount.ID);
|
||||||
var records = securityDao.GetShares(subjects);
|
IEnumerable<FileShareRecord> records = await securityDao.GetSharesAsync(subjects);
|
||||||
|
|
||||||
var result = new List<FileEntry>();
|
var result = new List<FileEntry>();
|
||||||
result.AddRange(await GetSharesForMeAsync<int>(records.Where(r => r.EntryId.GetType() == typeof(int)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders));
|
result.AddRange(await GetSharesForMeAsync<int>(records.Where(r => r.EntryId.GetType() == typeof(int)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders));
|
||||||
@ -819,7 +829,7 @@ namespace ASC.Files.Core.Security
|
|||||||
|
|
||||||
if (failedRecords.Any())
|
if (failedRecords.Any())
|
||||||
{
|
{
|
||||||
securityDao.DeleteShareRecords(failedRecords);
|
await securityDao.DeleteShareRecordsAsync(failedRecords);
|
||||||
}
|
}
|
||||||
|
|
||||||
return entries.Where(x => string.IsNullOrEmpty(x.Error)).Cast<FileEntry>().ToList();
|
return entries.Where(x => string.IsNullOrEmpty(x.Error)).Cast<FileEntry>().ToList();
|
||||||
@ -829,7 +839,7 @@ namespace ASC.Files.Core.Security
|
|||||||
{
|
{
|
||||||
var securityDao = daoFactory.GetSecurityDao<int>();
|
var securityDao = daoFactory.GetSecurityDao<int>();
|
||||||
var subjects = GetUserSubjects(AuthContext.CurrentAccount.ID);
|
var subjects = GetUserSubjects(AuthContext.CurrentAccount.ID);
|
||||||
var records = securityDao.GetShares(subjects);
|
IEnumerable<FileShareRecord> records = await securityDao.GetSharesAsync(subjects);
|
||||||
|
|
||||||
var result = new List<FileEntry>();
|
var result = new List<FileEntry>();
|
||||||
result.AddRange(await GetPrivacyForMeAsync<int>(records.Where(r => r.EntryId.GetType() == typeof(int)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders));
|
result.AddRange(await GetPrivacyForMeAsync<int>(records.Where(r => r.EntryId.GetType() == typeof(int)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders));
|
||||||
@ -921,10 +931,9 @@ namespace ASC.Files.Core.Security
|
|||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task RemoveSubjectAsync<T>(Guid subject)
|
||||||
public void RemoveSubject<T>(Guid subject)
|
|
||||||
{
|
{
|
||||||
daoFactory.GetSecurityDao<T>().RemoveSubject(subject);
|
await daoFactory.GetSecurityDao<T>().RemoveSubjectAsync(subject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Guid> GetUserSubjects(Guid userId)
|
public List<Guid> GetUserSubjects(Guid userId)
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using ASC.Common;
|
using ASC.Common;
|
||||||
|
|
||||||
@ -34,22 +35,22 @@ namespace ASC.Files.Core.Security
|
|||||||
[Scope]
|
[Scope]
|
||||||
public interface ISecurityDao<T>
|
public interface ISecurityDao<T>
|
||||||
{
|
{
|
||||||
void SetShare(FileShareRecord r);
|
Task SetShareAsync(FileShareRecord r);
|
||||||
|
|
||||||
IEnumerable<FileShareRecord> GetShares(IEnumerable<Guid> subjects);
|
ValueTask<List<FileShareRecord>> GetSharesAsync(IEnumerable<Guid> subjects);
|
||||||
|
|
||||||
IEnumerable<FileShareRecord> GetShares(IEnumerable<FileEntry<T>> entry);
|
Task<IEnumerable<FileShareRecord>> GetSharesAsync(IEnumerable<FileEntry<T>> entry);
|
||||||
|
|
||||||
IEnumerable<FileShareRecord> GetShares(FileEntry<T> entry);
|
Task<IEnumerable<FileShareRecord>> GetSharesAsync(FileEntry<T> entry);
|
||||||
|
|
||||||
void RemoveSubject(Guid subject);
|
Task RemoveSubjectAsync(Guid subject);
|
||||||
|
|
||||||
IEnumerable<FileShareRecord> GetPureShareRecords(IEnumerable<FileEntry<T>> entries);
|
Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(IEnumerable<FileEntry<T>> entries);
|
||||||
|
|
||||||
IEnumerable<FileShareRecord> GetPureShareRecords(FileEntry<T> entry);
|
Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(FileEntry<T> entry);
|
||||||
|
|
||||||
void DeleteShareRecords(IEnumerable<FileShareRecord> records);
|
Task DeleteShareRecordsAsync(IEnumerable<FileShareRecord> records);
|
||||||
|
|
||||||
bool IsShared(object entryId, FileEntryType type);
|
ValueTask<bool> IsSharedAsync(object entryId, FileEntryType type);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -53,11 +53,11 @@ namespace ASC.Files.Core.Thirdparty
|
|||||||
var securityDao = ServiceProvider.GetService<ISecurityDao<TFrom>>();
|
var securityDao = ServiceProvider.GetService<ISecurityDao<TFrom>>();
|
||||||
var tagDao = ServiceProvider.GetService<ITagDao<TFrom>>();
|
var tagDao = ServiceProvider.GetService<ITagDao<TFrom>>();
|
||||||
|
|
||||||
var fromFileShareRecords = securityDao.GetPureShareRecords(fromFile).Where(x => x.EntryType == FileEntryType.File);
|
var fromFileShareRecords = (await securityDao.GetPureShareRecordsAsync(fromFile)).Where(x => x.EntryType == FileEntryType.File);
|
||||||
var fromFileNewTags = tagDao.GetNewTagsAsync(Guid.Empty, fromFile).ToListAsync().Result;
|
var fromFileNewTags = await tagDao.GetNewTagsAsync(Guid.Empty, fromFile).ToListAsync();
|
||||||
var fromFileLockTag = tagDao.GetTagsAsync(fromFile.ID, FileEntryType.File, TagType.Locked).ToListAsync().Result.FirstOrDefault();
|
var fromFileLockTag = (await tagDao.GetTagsAsync(fromFile.ID, FileEntryType.File, TagType.Locked).ToListAsync()).FirstOrDefault();
|
||||||
var fromFileFavoriteTag = tagDao.GetTagsAsync(fromFile.ID, FileEntryType.File, TagType.Favorite).ToListAsync().Result;
|
var fromFileFavoriteTag = await tagDao.GetTagsAsync(fromFile.ID, FileEntryType.File, TagType.Favorite).ToListAsync();
|
||||||
var fromFileTemplateTag = tagDao.GetTagsAsync(fromFile.ID, FileEntryType.File, TagType.Template).ToListAsync().Result;
|
var fromFileTemplateTag = await tagDao.GetTagsAsync(fromFile.ID, FileEntryType.File, TagType.Template).ToListAsync();
|
||||||
|
|
||||||
var toFile = ServiceProvider.GetService<File<TTo>>();
|
var toFile = ServiceProvider.GetService<File<TTo>>();
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ namespace ASC.Files.Core.Thirdparty
|
|||||||
fromFileShareRecords.ToList().ForEach(x =>
|
fromFileShareRecords.ToList().ForEach(x =>
|
||||||
{
|
{
|
||||||
x.EntryId = toFile.ID;
|
x.EntryId = toFile.ID;
|
||||||
securityDao.SetShare(x);
|
securityDao.SetShareAsync(x).Wait();
|
||||||
});
|
});
|
||||||
|
|
||||||
var fromFileTags = fromFileNewTags;
|
var fromFileTags = fromFileNewTags;
|
||||||
@ -164,7 +164,7 @@ namespace ASC.Files.Core.Thirdparty
|
|||||||
if (deleteSourceFolder)
|
if (deleteSourceFolder)
|
||||||
{
|
{
|
||||||
var securityDao = ServiceProvider.GetService<ISecurityDao<TFrom>>();
|
var securityDao = ServiceProvider.GetService<ISecurityDao<TFrom>>();
|
||||||
var fromFileShareRecords = securityDao.GetPureShareRecords(fromFolder)
|
var fromFileShareRecords = (await securityDao.GetPureShareRecordsAsync(fromFolder))
|
||||||
.Where(x => x.EntryType == FileEntryType.Folder);
|
.Where(x => x.EntryType == FileEntryType.Folder);
|
||||||
|
|
||||||
if (fromFileShareRecords.Any())
|
if (fromFileShareRecords.Any())
|
||||||
@ -172,7 +172,7 @@ namespace ASC.Files.Core.Thirdparty
|
|||||||
fromFileShareRecords.ToList().ForEach(x =>
|
fromFileShareRecords.ToList().ForEach(x =>
|
||||||
{
|
{
|
||||||
x.EntryId = toFolderId;
|
x.EntryId = toFolderId;
|
||||||
securityDao.SetShare(x);
|
securityDao.SetShareAsync(x).Wait();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,45 +389,48 @@ namespace ASC.Files.Thirdparty
|
|||||||
|
|
||||||
|
|
||||||
#region SecurityDao
|
#region SecurityDao
|
||||||
|
public Task SetShareAsync(FileShareRecord r)
|
||||||
public void SetShare(FileShareRecord r)
|
|
||||||
{
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(IEnumerable<Guid> subjects)
|
public ValueTask<List<FileShareRecord>> GetSharesAsync(IEnumerable<Guid> subjects)
|
||||||
|
{
|
||||||
|
List<FileShareRecord> result = null;
|
||||||
|
return new ValueTask<List<FileShareRecord>>(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<IEnumerable<FileShareRecord>> GetSharesAsync(IEnumerable<FileEntry<string>> entry)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(IEnumerable<FileEntry<string>> entry)
|
public Task<IEnumerable<FileShareRecord>> GetSharesAsync(FileEntry<string> entry)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(FileEntry<string> entry)
|
public Task RemoveSubjectAsync(Guid subject)
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(IEnumerable<FileEntry<string>> entries)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveSubject(Guid subject)
|
public Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(FileEntry<string> entry)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetPureShareRecords(IEnumerable<FileEntry<string>> entries)
|
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetPureShareRecords(FileEntry<string> entry)
|
public Task DeleteShareRecordsAsync(IEnumerable<FileShareRecord> records)
|
||||||
{
|
{
|
||||||
return null;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeleteShareRecords(IEnumerable<FileShareRecord> records)
|
public ValueTask<bool> IsSharedAsync(object entryId, FileEntryType type)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsShared(object entryId, FileEntryType type)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using ASC.Common;
|
using ASC.Common;
|
||||||
using ASC.Core;
|
using ASC.Core;
|
||||||
@ -52,12 +53,12 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetShare(FileShareRecord r)
|
public async Task SetShareAsync(FileShareRecord r)
|
||||||
{
|
{
|
||||||
SecurityDao.SetShare(r);
|
await SecurityDao.SetShareAsync(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(IEnumerable<FileEntry<string>> entries)
|
public async Task<IEnumerable<FileShareRecord>> GetSharesAsync(IEnumerable<FileEntry<string>> entries)
|
||||||
{
|
{
|
||||||
var result = new List<FileShareRecord>();
|
var result = new List<FileShareRecord>();
|
||||||
|
|
||||||
@ -69,10 +70,10 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
var folderIds = files.Select(x => ((File<string>)x).FolderID).Distinct();
|
var folderIds = files.Select(x => ((File<string>)x).FolderID).Distinct();
|
||||||
foreach (var folderId in folderIds)
|
foreach (var folderId in folderIds)
|
||||||
{
|
{
|
||||||
GetFoldersForShare(folderId, folders);
|
await GetFoldersForShareAsync(folderId, folders);
|
||||||
}
|
}
|
||||||
|
|
||||||
var pureShareRecords = SecurityDao.GetPureShareRecords(files);
|
var pureShareRecords = await SecurityDao.GetPureShareRecordsAsync(files);
|
||||||
if (pureShareRecords != null)
|
if (pureShareRecords != null)
|
||||||
{
|
{
|
||||||
foreach (var pureShareRecord in pureShareRecords)
|
foreach (var pureShareRecord in pureShareRecords)
|
||||||
@ -84,12 +85,12 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.AddRange(GetShareForFolders(folders));
|
result.AddRange(GetShareForFoldersAsync(folders).Result);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(FileEntry<string> entry)
|
public async Task<IEnumerable<FileShareRecord>> GetSharesAsync(FileEntry<string> entry)
|
||||||
{
|
{
|
||||||
var result = new List<FileShareRecord>();
|
var result = new List<FileShareRecord>();
|
||||||
|
|
||||||
@ -104,9 +105,9 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
|
|
||||||
if (entry is File<string> file)
|
if (entry is File<string> file)
|
||||||
{
|
{
|
||||||
GetFoldersForShare(file.FolderID, folders);
|
await GetFoldersForShareAsync(file.FolderID, folders);
|
||||||
|
|
||||||
var pureShareRecords = SecurityDao.GetPureShareRecords(entry);
|
var pureShareRecords = await SecurityDao.GetPureShareRecordsAsync(entry);
|
||||||
if (pureShareRecords != null)
|
if (pureShareRecords != null)
|
||||||
{
|
{
|
||||||
foreach (var pureShareRecord in pureShareRecords)
|
foreach (var pureShareRecord in pureShareRecords)
|
||||||
@ -118,22 +119,22 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.AddRange(GetShareForFolders(folders));
|
result.AddRange(await GetShareForFoldersAsync(folders));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GetFoldersForShare(string folderId, ICollection<FileEntry<string>> folders)
|
private async Task GetFoldersForShareAsync(string folderId, ICollection<FileEntry<string>> folders)
|
||||||
{
|
{
|
||||||
var selector = GetSelector(folderId);
|
var selector = GetSelector(folderId);
|
||||||
var folderDao = selector.GetFolderDao(folderId);
|
var folderDao = selector.GetFolderDao(folderId);
|
||||||
if (folderDao == null) return;
|
if (folderDao == null) return;
|
||||||
|
|
||||||
var folder = folderDao.GetFolderAsync(selector.ConvertId(folderId)).Result;
|
var folder = await folderDao.GetFolderAsync(selector.ConvertId(folderId));
|
||||||
if (folder != null) folders.Add(folder);
|
if (folder != null) folders.Add(folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FileShareRecord> GetShareForFolders(IReadOnlyCollection<FileEntry<string>> folders)
|
private async Task<List<FileShareRecord>> GetShareForFoldersAsync(IReadOnlyCollection<FileEntry<string>> folders)
|
||||||
{
|
{
|
||||||
if (!folders.Any()) return new List<FileShareRecord>();
|
if (!folders.Any()) return new List<FileShareRecord>();
|
||||||
|
|
||||||
@ -145,11 +146,11 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
var folderDao = selector.GetFolderDao(folder.ID);
|
var folderDao = selector.GetFolderDao(folder.ID);
|
||||||
if (folderDao == null) continue;
|
if (folderDao == null) continue;
|
||||||
|
|
||||||
var parentFolders = folderDao.GetParentFoldersAsync(selector.ConvertId(folder.ID)).Result;
|
var parentFolders = await folderDao.GetParentFoldersAsync(selector.ConvertId(folder.ID));
|
||||||
if (parentFolders == null || !parentFolders.Any()) continue;
|
if (parentFolders == null || !parentFolders.Any()) continue;
|
||||||
|
|
||||||
parentFolders.Reverse();
|
parentFolders.Reverse();
|
||||||
var pureShareRecords = GetPureShareRecords(parentFolders);
|
var pureShareRecords = await GetPureShareRecordsAsync(parentFolders);
|
||||||
if (pureShareRecords == null) continue;
|
if (pureShareRecords == null) continue;
|
||||||
|
|
||||||
foreach (var pureShareRecord in pureShareRecords)
|
foreach (var pureShareRecord in pureShareRecords)
|
||||||
@ -167,34 +168,34 @@ namespace ASC.Files.Thirdparty.ProviderDao
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveSubject(Guid subject)
|
public async Task RemoveSubjectAsync(Guid subject)
|
||||||
{
|
{
|
||||||
SecurityDao.RemoveSubject(subject);
|
await SecurityDao.RemoveSubjectAsync(subject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetShares(IEnumerable<Guid> subjects)
|
public ValueTask<List<FileShareRecord>> GetSharesAsync(IEnumerable<Guid> subjects)
|
||||||
{
|
{
|
||||||
return SecurityDao.GetShares(subjects);
|
return SecurityDao.GetSharesAsync(subjects);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetPureShareRecords(IEnumerable<FileEntry<string>> entries)
|
public async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(IEnumerable<FileEntry<string>> entries)
|
||||||
{
|
{
|
||||||
return SecurityDao.GetPureShareRecords(entries);
|
return await SecurityDao.GetPureShareRecordsAsync(entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FileShareRecord> GetPureShareRecords(FileEntry<string> entry)
|
public async Task<IEnumerable<FileShareRecord>> GetPureShareRecordsAsync(FileEntry<string> entry)
|
||||||
{
|
{
|
||||||
return SecurityDao.GetPureShareRecords(entry);
|
return await SecurityDao.GetPureShareRecordsAsync(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeleteShareRecords(IEnumerable<FileShareRecord> records)
|
public async Task DeleteShareRecordsAsync(IEnumerable<FileShareRecord> records)
|
||||||
{
|
{
|
||||||
SecurityDao.DeleteShareRecords(records);
|
await SecurityDao.DeleteShareRecordsAsync(records);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsShared(object entryId, FileEntryType type)
|
public async ValueTask<bool> IsSharedAsync(object entryId, FileEntryType type)
|
||||||
{
|
{
|
||||||
return SecurityDao.IsShared(entryId, type);
|
return await SecurityDao.IsSharedAsync(entryId, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -622,7 +622,7 @@ namespace ASC.Web.Files.Utils
|
|||||||
if (folderList.Any())
|
if (folderList.Any())
|
||||||
{
|
{
|
||||||
var securityDao = DaoFactory.GetSecurityDao<string>();
|
var securityDao = DaoFactory.GetSecurityDao<string>();
|
||||||
securityDao.GetPureShareRecords(folderList)
|
(await securityDao.GetPureShareRecordsAsync(folderList))
|
||||||
//.Where(x => x.Owner == SecurityContext.CurrentAccount.ID)
|
//.Where(x => x.Owner == SecurityContext.CurrentAccount.ID)
|
||||||
.Select(x => x.EntryId).Distinct().ToList()
|
.Select(x => x.EntryId).Distinct().ToList()
|
||||||
.ForEach(id =>
|
.ForEach(id =>
|
||||||
|
@ -119,7 +119,7 @@ namespace ASC.Web.Files.Utils
|
|||||||
share = w.Share == FileShare.Restrict ? FileShare.None : w.Share;
|
share = w.Share == FileShare.Restrict ? FileShare.None : w.Share;
|
||||||
}
|
}
|
||||||
|
|
||||||
fileSecurity.Share(entry.ID, entryType, w.SubjectId, share);
|
await fileSecurity.ShareAsync(entry.ID, entryType, w.SubjectId, share);
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
if (w.SubjectId == FileConstant.ShareLinkId)
|
if (w.SubjectId == FileConstant.ShareLinkId)
|
||||||
@ -190,33 +190,6 @@ namespace ASC.Web.Files.Utils
|
|||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveAce(List<FileEntry<T>> entries)
|
|
||||||
{
|
|
||||||
var fileSecurity = FileSecurity;
|
|
||||||
|
|
||||||
entries.ForEach(
|
|
||||||
entry =>
|
|
||||||
{
|
|
||||||
if (entry.RootFolderType != FolderType.USER && entry.RootFolderType != FolderType.Privacy
|
|
||||||
|| Equals(entry.RootFolderId, GlobalFolderHelper.FolderMy)
|
|
||||||
|| Equals(entry.RootFolderId, GlobalFolderHelper.FolderPrivacy))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var entryType = entry.FileEntryType;
|
|
||||||
fileSecurity.Share(entry.ID, entryType, AuthContext.CurrentAccount.ID,
|
|
||||||
entry.RootFolderType == FolderType.USER
|
|
||||||
? fileSecurity.DefaultMyShare
|
|
||||||
: fileSecurity.DefaultPrivacyShare);
|
|
||||||
|
|
||||||
if (entryType == FileEntryType.File)
|
|
||||||
{
|
|
||||||
DocumentServiceHelper.CheckUsersForDrop((File<T>)entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
FileMarker.RemoveMarkAsNew(entry);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task RemoveAceAsync(IAsyncEnumerable<FileEntry<T>> entries)
|
public Task RemoveAceAsync(IAsyncEnumerable<FileEntry<T>> entries)
|
||||||
{
|
{
|
||||||
var fileSecurity = FileSecurity;
|
var fileSecurity = FileSecurity;
|
||||||
@ -230,7 +203,7 @@ namespace ASC.Web.Files.Utils
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var entryType = entry.FileEntryType;
|
var entryType = entry.FileEntryType;
|
||||||
fileSecurity.Share(entry.ID, entryType, AuthContext.CurrentAccount.ID,
|
await fileSecurity.ShareAsync(entry.ID, entryType, AuthContext.CurrentAccount.ID,
|
||||||
entry.RootFolderType == FolderType.USER
|
entry.RootFolderType == FolderType.USER
|
||||||
? fileSecurity.DefaultMyShare
|
? fileSecurity.DefaultMyShare
|
||||||
: fileSecurity.DefaultPrivacyShare);
|
: fileSecurity.DefaultPrivacyShare);
|
||||||
@ -369,7 +342,7 @@ namespace ASC.Web.Files.Utils
|
|||||||
|
|
||||||
if (g.ID == Constants.LostGroupInfo.ID)
|
if (g.ID == Constants.LostGroupInfo.ID)
|
||||||
{
|
{
|
||||||
fileSecurity.RemoveSubject<T>(r.Subject);
|
await fileSecurity.RemoveSubjectAsync<T>(r.Subject);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user