This commit is contained in:
pavelbannov 2023-01-30 16:55:02 +03:00
parent 07ad44edd7
commit 683b1ecd83
5 changed files with 43 additions and 26 deletions

View File

@ -121,6 +121,11 @@ public class AbstractDao
await filesDbContext.SaveChangesAsync(); await filesDbContext.SaveChangesAsync();
} }
protected ValueTask<object> MappingIDAsync(object id)
{
return MappingIDAsync(id, false);
}
protected ValueTask<object> MappingIDAsync(object id, bool saveIfNotExist = false) protected ValueTask<object> MappingIDAsync(object id, bool saveIfNotExist = false)
{ {
if (id == null) if (id == null)
@ -138,6 +143,16 @@ public class AbstractDao
return InternalMappingIDAsync(id, saveIfNotExist); return InternalMappingIDAsync(id, saveIfNotExist);
} }
protected int MappingIDAsync(int id)
{
return MappingIDAsync(id, false);
}
protected int MappingIDAsync(int id, bool saveIfNotExist = false)
{
return id;
}
private async ValueTask<object> InternalMappingIDAsync(object id, bool saveIfNotExist = false) private async ValueTask<object> InternalMappingIDAsync(object id, bool saveIfNotExist = false)
{ {
object result; object result;
@ -178,11 +193,6 @@ public class AbstractDao
return result; return result;
} }
protected ValueTask<object> MappingIDAsync(object id)
{
return MappingIDAsync(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
{ {
var lowerText = GetSearchText(text); var lowerText = GetSearchText(text);

View File

@ -73,15 +73,22 @@ internal class SecurityDao<T> : AbstractDao, ISecurityDao<T>
foreach (var record in records) foreach (var record in records)
{ {
var query = await filesDbContext.Security List<DbFilesSecurity> toDelete = new();
var query = filesDbContext.Security
.Where(r => r.TenantId == record.TenantId) .Where(r => r.TenantId == record.TenantId)
.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() .AsAsyncEnumerable();
.WhereAwait(async r => r.EntryId == (await MappingIDAsync(record.EntryId)).ToString())
.ToListAsync();
filesDbContext.RemoveRange(query); await foreach (var r in query)
{
r.EntryId = (await MappingIDAsync(r.EntryId)).ToString();
toDelete.Add(r);
}
filesDbContext.RemoveRange(toDelete);
} }
await tx.CommitAsync(); await tx.CommitAsync();
@ -90,7 +97,7 @@ internal class SecurityDao<T> : AbstractDao, ISecurityDao<T>
public async Task<bool> IsSharedAsync(T entryId, FileEntryType type) public async Task<bool> IsSharedAsync(T entryId, FileEntryType type)
{ {
var mappedId = (await MappingIDAsync(entryId)).ToString(); var mappedId = (entryId is int fid ? MappingIDAsync(fid) : await MappingIDAsync(entryId)).ToString();
using var filesDbContext = _dbContextFactory.CreateDbContext(); using var filesDbContext = _dbContextFactory.CreateDbContext();
return await Query(filesDbContext.Security) return await Query(filesDbContext.Security)
@ -101,7 +108,7 @@ internal class SecurityDao<T> : AbstractDao, ISecurityDao<T>
{ {
if (r.Share == FileShare.None) if (r.Share == FileShare.None)
{ {
var entryId = (await MappingIDAsync(r.EntryId) ?? "").ToString(); var entryId = (r.EntryId is int fid ? MappingIDAsync(fid) : (await MappingIDAsync(r.EntryId) ?? "")).ToString();
if (string.IsNullOrEmpty(entryId)) if (string.IsNullOrEmpty(entryId))
{ {
return; return;
@ -283,7 +290,7 @@ internal class SecurityDao<T> : AbstractDao, ISecurityDao<T>
T folderId; T folderId;
if (entry.FileEntryType == FileEntryType.File) if (entry.FileEntryType == FileEntryType.File)
{ {
var fileId = await MappingIDAsync(entry.Id); var fileId = entry.Id is int entryId ? MappingIDAsync(entryId) : await MappingIDAsync(entry.Id);
folderId = ((File<T>)entry).ParentId; folderId = ((File<T>)entry).ParentId;
if (!files.Contains(fileId.ToString())) if (!files.Contains(fileId.ToString()))
{ {
@ -300,7 +307,7 @@ internal class SecurityDao<T> : AbstractDao, ISecurityDao<T>
foldersInt.Add(folderIdInt); foldersInt.Add(folderIdInt);
} }
var mappedId = await MappingIDAsync(folderId); var mappedId = folderId is int fid ? MappingIDAsync(fid) : await MappingIDAsync(folderId);
if (folders != null) if (folders != null)
{ {
folders.Add(mappedId.ToString()); folders.Add(mappedId.ToString());

View File

@ -68,7 +68,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
foreach (var f in fileEntries) foreach (var f in fileEntries)
{ {
var idObj = await MappingIDAsync(f.Id); var idObj = f.Id is int fid ? MappingIDAsync(fid) : await MappingIDAsync(f.Id);
var id = idObj.ToString(); var id = idObj.ToString();
if (f.FileEntryType == FileEntryType.File) if (f.FileEntryType == FileEntryType.File)
{ {
@ -116,7 +116,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
foreach (var f in fileEntries) foreach (var f in fileEntries)
{ {
var idObj = await MappingIDAsync(f.Id); var idObj = f.Id is int fid ? MappingIDAsync(fid) : await MappingIDAsync(f.Id);
var id = idObj.ToString(); var id = idObj.ToString();
if (f.FileEntryType == FileEntryType.File) if (f.FileEntryType == FileEntryType.File)
{ {
@ -149,7 +149,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
await foreach (var f in fileEntries) await foreach (var f in fileEntries)
{ {
var idObj = await MappingIDAsync(f.Id); var idObj = f.Id is int fid ? MappingIDAsync(fid) : await MappingIDAsync(f.Id);
var id = idObj.ToString(); var id = idObj.ToString();
if (f.FileEntryType == FileEntryType.File) if (f.FileEntryType == FileEntryType.File)
{ {
@ -181,7 +181,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
public async IAsyncEnumerable<Tag> GetTagsAsync(T entryID, FileEntryType entryType, TagType tagType) public async IAsyncEnumerable<Tag> GetTagsAsync(T entryID, FileEntryType entryType, TagType tagType)
{ {
var mappedId = (await MappingIDAsync(entryID)).ToString(); var mappedId = (entryID is int fid ? MappingIDAsync(fid) : await MappingIDAsync(entryID)).ToString();
var filesDbContext = _dbContextFactory.CreateDbContext(); var filesDbContext = _dbContextFactory.CreateDbContext();
var q = Query(filesDbContext.Tag) var q = Query(filesDbContext.Tag)
@ -598,7 +598,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
public async Task RemoveTagsAsync(FileEntry<T> entry, IEnumerable<int> tagsIds) public async Task RemoveTagsAsync(FileEntry<T> entry, IEnumerable<int> tagsIds)
{ {
var entryId = (await MappingIDAsync(entry.Id)).ToString(); var entryId = (entry.Id is int fid ? MappingIDAsync(fid) : await MappingIDAsync(entry.Id)).ToString();
using var filesDbContext = _dbContextFactory.CreateDbContext(); using var filesDbContext = _dbContextFactory.CreateDbContext();
var toDelete = await Query(filesDbContext.TagLink) var toDelete = await Query(filesDbContext.TagLink)
@ -657,7 +657,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
if (id != 0) if (id != 0)
{ {
var entryId = (await MappingIDAsync(tag.EntryId)).ToString(); var entryId = (tag.EntryId is int fid ? MappingIDAsync(fid) : await MappingIDAsync(tag.EntryId)).ToString();
var toDelete = await Query(filesDbContext.TagLink) var toDelete = await Query(filesDbContext.TagLink)
.Where(r => r.TagId == id && .Where(r => r.TagId == id &&
r.EntryId == entryId && r.EntryId == entryId &&
@ -902,7 +902,7 @@ internal abstract class BaseTagDao<T> : AbstractDao
foreach (var r in fileEntries) foreach (var r in fileEntries)
{ {
var idObj = await MappingIDAsync(r.Id); var idObj = r.Id is int fid ? MappingIDAsync(fid) : await MappingIDAsync(r.Id);
var id = idObj.ToString(); var id = idObj.ToString();
var entryType = (r.FileEntryType == FileEntryType.File) ? FileEntryType.File : FileEntryType.Folder; var entryType = (r.FileEntryType == FileEntryType.File) ? FileEntryType.File : FileEntryType.Folder;

View File

@ -54,7 +54,7 @@ public class CustomTagsService
private IDictionary<string, StringValues> Headers => _httpContextAccessor?.HttpContext?.Request?.Headers; private IDictionary<string, StringValues> Headers => _httpContextAccessor?.HttpContext?.Request?.Headers;
public async Task<object> CreateTagAsync<T>(string name) public async Task<string> CreateTagAsync(string name)
{ {
if (_userManager.IsUser(_authContext.CurrentAccount.ID)) if (_userManager.IsUser(_authContext.CurrentAccount.ID))
{ {
@ -63,7 +63,7 @@ public class CustomTagsService
ArgumentNullOrEmptyException.ThrowIfNullOrEmpty(name); ArgumentNullOrEmptyException.ThrowIfNullOrEmpty(name);
var tagDao = _daoFactory.GetTagDao<T>(); var tagDao = _daoFactory.GetTagDao<int>();
var tags = await tagDao.GetTagsInfoAsync(name, TagType.Custom, true).ToListAsync(); var tags = await tagDao.GetTagsInfoAsync(name, TagType.Custom, true).ToListAsync();
if (tags.Any()) if (tags.Any())

View File

@ -702,11 +702,11 @@ public class VirtualRoomsCommonController : ApiControllerBase
/// Tag name /// Tag name
/// </returns> /// </returns>
[HttpPost("tags")] [HttpPost("tags")]
public async Task<object> CreateTagAsync(CreateTagRequestDto inDto) public async Task<string> CreateTagAsync(CreateTagRequestDto inDto)
{ {
ErrorIfNotDocSpace(); ErrorIfNotDocSpace();
return await _customTagsService.CreateTagAsync<int>(inDto.Name); return await _customTagsService.CreateTagAsync(inDto.Name);
} }
/// <summary> /// <summary>