Skip to content

Commit

Permalink
Merge branch 'hotfix/v2.6.3' of git.onlyoffice.com:ONLYOFFICE/DocSpac…
Browse files Browse the repository at this point in the history
…e-server into hotfix/v2.6.3
  • Loading branch information
NikolayRechkin committed Sep 26, 2024
2 parents de2c9b4 + f24163b commit cd59791
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 21 deletions.
2 changes: 1 addition & 1 deletion common/ASC.ActiveDirectory/Base/DbHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public async Task<List<int>> TenantsAsync()
var data = await activeDirectoryDbContext.WebstudioSettings
.Where(r => r.Id == id)
.Join(activeDirectoryDbContext.Tenants, r => r.TenantId, r => r.Id, (settings, tenant) => new { settings, tenant })
.Select(r => DbFunctionsExtension.JsonValue(nameof(r.settings.Data).ToLower(), enableLdapAuthentication.ToString()))
.Select(r => DbFunctionsExtension.JsonExtract(nameof(r.settings.Data).ToLower(), enableLdapAuthentication.ToString()))
.Distinct()
.Select(r => r != null ? Convert.ToInt32(r) : 0)
.ToListAsync();
Expand Down
7 changes: 6 additions & 1 deletion common/ASC.Core.Common/EF/DbFunctionsExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,14 @@ public static string SubstringIndex(string str, char delimiter, int number)
throw new NotImplementedException();
}

public static string JsonValue(string column, [NotParameterized] string path)
public static string JsonExtract(string column, [NotParameterized] string path)
{
//not using
return column + path;
}

public static string JsonValue(string jsonDoc, [NotParameterized] string path)
{
throw new NotImplementedException();
}
}
42 changes: 41 additions & 1 deletion common/ASC.Core.Common/EF/Model/ModelBuilderWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public EntityTypeBuilder<T> Entity<T>() where T : class
public void AddDbFunctions()
{
ModelBuilder
.HasDbFunction(typeof(DbFunctionsExtension).GetMethod(nameof(DbFunctionsExtension.JsonValue))!)
.HasDbFunction(typeof(DbFunctionsExtension).GetMethod(nameof(DbFunctionsExtension.JsonExtract))!)
.HasTranslation(e =>
{
var res = new List<SqlExpression>();
Expand Down Expand Up @@ -122,5 +122,45 @@ public void AddDbFunctions()
default:
throw new InvalidOperationException();
}

ModelBuilder.HasDbFunction(typeof(DbFunctionsExtension).GetMethod(nameof(DbFunctionsExtension.JsonValue))!)
.HasTranslation(expressions =>
{
var result = new List<SqlExpression>();
var jsonDoc = expressions[0];
switch (jsonDoc)
{
case SqlConstantExpression key:
result.Add(new SqlFragmentExpression($"`{key.Value}`"));
break;
case SqlFunctionExpression function:
result.Add(function);
break;
default:
throw new InvalidOperationException();
}
var path = expressions[1];
if (path is SqlConstantExpression value)
{
var strValue = value.Value?.ToString();
if (strValue != null && strValue.StartsWith('[') && strValue.EndsWith(']'))
{
result.Add(new SqlConstantExpression(Expression.Constant($"${strValue}"), value.TypeMapping));
}
else
{
result.Add(new SqlConstantExpression(Expression.Constant($"$.{strValue}"), value.TypeMapping));
}
}
else
{
throw new InvalidOperationException();
}
return new SqlFunctionExpression("JSON_VALUE", result, true, result.Select(_ => false), typeof(string), null);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ private async Task RemoveOldEventsAsync<T>(Expression<Func<MessagesContext, DbSe
.Where(r => r.Date < DateTime.UtcNow.AddDays(-Convert.ToDouble(
ef.WebstudioSettings
.Where(a => a.TenantId == r.TenantId && a.Id == TenantAuditSettings.Guid)
.Select(dbWebstudioSettings => DbFunctionsExtension.JsonValue(nameof(dbWebstudioSettings.Data).ToLower(), settings))
.Select(dbWebstudioSettings => DbFunctionsExtension.JsonExtract(nameof(dbWebstudioSettings.Data).ToLower(), settings))
.FirstOrDefault() ?? TenantAuditSettings.MaxLifeTime.ToString())))
.Take(1000);

Expand Down
82 changes: 65 additions & 17 deletions products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2238,29 +2238,77 @@ private async Task<IQueryable<FileByTagQuery>> GetFilesByTagQuery(Guid? tagOwner
{
IQueryable<FileByTagQuery> query;

var initQuery = (await GetFileQuery(filesDbContext, r => r.CurrentVersion))
.Join(filesDbContext.TagLink, f => f.Id.ToString(), l => l.EntryId, (file, tagLink) => new { file, tagLink })
.Where(r => r.tagLink.EntryType == FileEntryType.File)
.Join(filesDbContext.Tag, r => r.tagLink.TagId, t => t.Id,
(fileWithTagLink, tag) => new { fileWithTagLink.file, fileWithTagLink.tagLink, tag })
.Where(r => r.tag.Type == tagType);
var tenantId = await _tenantManager.GetCurrentTenantIdAsync();

var initQuery = filesDbContext.Files
.Where(x => x.TenantId == tenantId && x.CurrentVersion)
.Join(filesDbContext.TagLink,
f => new
{
tenantId,
entryId = f.Id.ToString(),
entryType = FileEntryType.File
},
l => new
{
tenantId = l.TenantId,
entryId = l.EntryId,
entryType = l.EntryType
},
(f, l) => new { f, l })
.Join(filesDbContext.Tag,
x => x.l.TagId,
t => t.Id,
(x, t) => new { x.f, x.l, t })
.Where(x => x.t.Type == tagType);

if (tagOwner.HasValue)
{
initQuery = initQuery.Where(x => x.t.Owner == tagOwner.Value);
}

if (tagType == TagType.RecentByLink)
{
query = initQuery .Join(filesDbContext.Security, r => r.tag.Name, s => s.Subject.ToString(),
(fileWithTag, security) => new { fileWithTag, security,
expirationDate = (DateTime)(object)DbFunctionsExtension.JsonValue(nameof(security.Options), "ExpirationDate").Trim('"')})
.Where(r => r.security.Share != FileShare.Restrict && (r.expirationDate == DateTime.MinValue || r.expirationDate > DateTime.UtcNow))
.Select(r => new FileByTagQuery { Entry = r.fileWithTag.file, Tag = r.fileWithTag.tag, TagLink = r.fileWithTag.tagLink, Security = r.security});
query = initQuery.Join(filesDbContext.Security,
x => new
{
tenantId,
entryId = x.f.Id.ToString(),
entryType = FileEntryType.File,
subject = x.t.Name
},
s => new
{
tenantId = s.TenantId,
entryId = s.EntryId,
entryType = s.EntryType,
subject = s.Subject.ToString()
},
(x, s) => new
{
x.f,
x.t,
x.l,
s,
expirationDate = (DateTime)(object)DbFunctionsExtension.JsonValue(nameof(s.Options), "ExpirationDate")
})
.Where(x => x.s.Share != FileShare.Restrict && (x.expirationDate == DateTime.MinValue || x.expirationDate > DateTime.UtcNow))
.Select(x => new FileByTagQuery
{
Entry = x.f,
Tag = x.t,
TagLink = x.l,
Security = x.s
});
}
else
{
query = initQuery.Select(r => new FileByTagQuery { Entry = r.file, Tag = r.tag, TagLink = r.tagLink});
}

if (tagOwner.HasValue)
{
query = query.Where(r => r.Tag.Owner == tagOwner.Value);
query = initQuery.Select(x => new FileByTagQuery
{
Entry = x.f,
Tag = x.t,
TagLink = x.l
});
}

return query;
Expand Down

0 comments on commit cd59791

Please sign in to comment.