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 currentTicketFilters = new AsyncLocal(); 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 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 { TicketFilterCompiler.AssignmentGroupField }, ProviderFields = new List { TicketFilterCompiler.QueueField } }; } } }