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