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<cTicketFilterPolicy> currentTicketFilters =
|
|
new AsyncLocal<cTicketFilterPolicy>();
|
|
|
|
private sealed class TicketFilterScope : IDisposable
|
|
{
|
|
private readonly cTicketFilterPolicy previous;
|
|
|
|
public TicketFilterScope(cTicketFilterPolicy filters)
|
|
{
|
|
previous = currentTicketFilters.Value;
|
|
currentTicketFilters.Value = filters;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
currentTicketFilters.Value = previous;
|
|
}
|
|
}
|
|
|
|
internal IDisposable BeginTicketFilterScope(cTicketFilterPolicy filters)
|
|
{
|
|
return new TicketFilterScope(filters);
|
|
}
|
|
|
|
internal async Task<string> ApplyTicketFiltersAsync(string baseFilter, cTicketFilterPolicy policy)
|
|
{
|
|
var result = await TicketFilterCompiler.CompileAsync(policy ?? currentTicketFilters.Value, null);
|
|
if (!result.Success)
|
|
{
|
|
LogEntry($"Ticket filter rejected (fail closed): {result.Error}", LogLevels.Error);
|
|
return null;
|
|
}
|
|
|
|
return string.IsNullOrWhiteSpace(result.Clause)
|
|
? baseFilter
|
|
: $"({baseFilter}) AND ({result.Clause})";
|
|
}
|
|
|
|
internal cTicketFilterCapabilities GetTicketFilterCapabilities()
|
|
{
|
|
return new cTicketFilterCapabilities
|
|
{
|
|
Provider = TicketFilterCompiler.ProviderName,
|
|
CommonFields = new List<string> { TicketFilterCompiler.AssignmentGroupField },
|
|
ProviderFields = new List<string> { TicketFilterCompiler.QueueField }
|
|
};
|
|
}
|
|
}
|
|
}
|