Files
C4IT-F4SD-M42WebApi/Legacy/F4SDM42WebApi/TicketFilterService.cs
2026-07-23 12:47:28 +02:00

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 }
};
}
}
}