64 lines
2.0 KiB
C#
64 lines
2.0 KiB
C#
using System.Collections.Generic;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
using C4IT.FASD.Base;
|
|
using C4IT.Logging;
|
|
|
|
using static C4IT.Logging.cLogManager;
|
|
|
|
namespace C4IT.F4SD
|
|
{
|
|
public partial class F4SDHelperService
|
|
{
|
|
private static readonly AsyncLocal<cActivityFilterPolicy> currentActivityFilters =
|
|
new AsyncLocal<cActivityFilterPolicy>();
|
|
|
|
private sealed class ActivityFilterScope : IDisposable
|
|
{
|
|
private readonly cActivityFilterPolicy previous;
|
|
|
|
public ActivityFilterScope(cActivityFilterPolicy filters)
|
|
{
|
|
previous = currentActivityFilters.Value;
|
|
currentActivityFilters.Value = filters;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
currentActivityFilters.Value = previous;
|
|
}
|
|
}
|
|
|
|
internal IDisposable BeginActivityFilterScope(cActivityFilterPolicy filters)
|
|
{
|
|
return new ActivityFilterScope(filters);
|
|
}
|
|
|
|
internal async Task<string> ApplyActivityFiltersAsync(string baseFilter, cActivityFilterPolicy policy)
|
|
{
|
|
var result = await ActivityFilterCompiler.CompileAsync(policy ?? currentActivityFilters.Value, null);
|
|
if (!result.Success)
|
|
{
|
|
LogEntry($"Activity filter rejected (fail closed): {result.Error}", LogLevels.Error);
|
|
return null;
|
|
}
|
|
|
|
return string.IsNullOrWhiteSpace(result.Clause)
|
|
? baseFilter
|
|
: $"({baseFilter}) AND ({result.Clause})";
|
|
}
|
|
|
|
internal cTicketActivityFilterCapabilities GetActivityFilterCapabilities()
|
|
{
|
|
return new cTicketActivityFilterCapabilities
|
|
{
|
|
Provider = ActivityFilterCompiler.ProviderName,
|
|
CommonFields = new List<string> { ActivityFilterCompiler.AssignmentGroupField },
|
|
ProviderFields = new List<string> { ActivityFilterCompiler.QueueField }
|
|
};
|
|
}
|
|
}
|
|
}
|