Rename activity filter configuration to ticket filters

This commit is contained in:
Drechsler, Meik
2026-07-23 12:46:46 +02:00
parent 275d884bfe
commit 52e74deb57
9 changed files with 64 additions and 60 deletions

View File

@@ -413,8 +413,8 @@ namespace C4IT.DataHistoryProvider
GlobalConfig = new cF4sdGlobalConfig(regPath: null);
if (GlobalParametersConfigFile.Parameters != null)
GlobalConfig.Load(CentralParameters: GlobalParametersConfigFile.Parameters);
GlobalConfig.TicketConfiguration.ActivityFilters =
GlobalParametersConfigFile.ActivityFilters ?? new cActivityFilterPolicy();
GlobalConfig.TicketConfiguration.TicketFilters =
GlobalParametersConfigFile.TicketFilters ?? new cTicketFilterPolicy();
}
return true;
@@ -508,7 +508,7 @@ namespace C4IT.DataHistoryProvider
// load the global parameters
if (!RefreshGlobalConfigurationParameters())
return false;
InfrastructureConfig.RemoveLegacyActivityFilterConfiguration();
InfrastructureConfig.RemoveLegacyTicketFilterConfiguration();
mainDbConnection = InfrastructureConfig.HistoryDB.Connection;

View File

@@ -694,18 +694,18 @@ namespace C4IT.DataHistoryProvider
var objSid = new SecurityIdentifier(UserId.sid, 0);
var strSid = objSid.ToString();
var _wc = await GetWebClient(requestInfo, Token);
var request = new cTicketActivityListRequest
var request = new cTicketListFilterRequest
{
Sid = strSid,
Hours = Collector.InfrastructureConfig.M42Wpm.ClosedTicketHistory,
Filters = GetActivityFilters()
Filters = GetTicketFilters()
};
var res = await PostJsonAsync(_wc, constUrlGetTicketsV2, request, Token);
if (res?.StatusCode == HttpStatusCode.NotFound)
{
if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues))
{
LogEntry("The activity filter policy requires the v2 ticket API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
LogEntry("The ticket filter policy requires the v2 ticket API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
return null;
}
var strUrl = string.Format(
@@ -1111,17 +1111,17 @@ namespace C4IT.DataHistoryProvider
return (int)Collector.InfrastructureConfig.M42Wpm.ActivityQueueFilterOption;
}
private cActivityFilterPolicy GetActivityFilters()
private cTicketFilterPolicy GetTicketFilters()
{
return Collector?.GetGlobalConfig()?.TicketConfiguration?.ActivityFilters
?? new cActivityFilterPolicy();
return Collector?.GetGlobalConfig()?.TicketConfiguration?.TicketFilters
?? new cTicketFilterPolicy();
}
private bool TryGetLegacyQueueFilter(out int queueOption, out string encodedQueues)
{
queueOption = 0;
encodedQueues = null;
var activeFilters = (GetActivityFilters()?.Filters ?? new List<cActivityFilter>())
var activeFilters = (GetTicketFilters()?.Filters ?? new List<cTicketFilter>())
.Where(entry => entry?.Enabled == true)
.ToList();
if (activeFilters.Count == 0)
@@ -1129,17 +1129,17 @@ namespace C4IT.DataHistoryProvider
if (activeFilters.Count != 1)
return false;
var activityFilter = activeFilters[0];
if (!string.Equals(activityFilter.Provider, "Matrix42", StringComparison.OrdinalIgnoreCase)
|| !string.Equals(activityFilter.Field, "Queue", StringComparison.OrdinalIgnoreCase)
|| activityFilter.Match != enumActivityFilterMatch.include
|| activityFilter.EmptyHandling == enumActivityFilterEmptyHandling.only)
var ticketFilter = activeFilters[0];
if (!string.Equals(ticketFilter.Provider, "Matrix42", StringComparison.OrdinalIgnoreCase)
|| !string.Equals(ticketFilter.Field, "Queue", StringComparison.OrdinalIgnoreCase)
|| ticketFilter.Match != enumTicketFilterMatch.include
|| ticketFilter.EmptyHandling == enumTicketFilterEmptyHandling.only)
{
return false;
}
queueOption = activityFilter.EmptyHandling == enumActivityFilterEmptyHandling.include ? 1 : 2;
var values = (activityFilter.Values ?? new List<cActivityFilterValue>())
queueOption = ticketFilter.EmptyHandling == enumTicketFilterEmptyHandling.include ? 1 : 2;
var values = (ticketFilter.Values ?? new List<cTicketFilterValue>())
.Where(value => value != null)
.Select(value =>
{
@@ -1227,14 +1227,14 @@ namespace C4IT.DataHistoryProvider
Sid = sid,
Scope = scope,
Keys = requestedKeys?.ToList() ?? new List<string>(),
Filters = GetActivityFilters()
Filters = GetTicketFilters()
};
var res = await PostJsonAsync(wc, constUrlGetTicketOverviewCountsV2, request, token);
if (res?.StatusCode == HttpStatusCode.NotFound)
{
if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues))
{
LogEntry("The activity filter policy requires the v2 overview API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
LogEntry("The ticket filter policy requires the v2 overview API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
return new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
}
var urlBuilder = new StringBuilder(constUrlGetTicketOverviewCounts);
@@ -1358,14 +1358,14 @@ namespace C4IT.DataHistoryProvider
Scope = scope,
Key = key,
Count = Math.Max(0, count),
Filters = GetActivityFilters()
Filters = GetTicketFilters()
};
var res = await PostJsonAsync(wc, constUrlGetTicketOverviewRelationsV2, request, Token);
if (res?.StatusCode == HttpStatusCode.NotFound)
{
if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues))
{
LogEntry("The activity filter policy requires the v2 relation API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
LogEntry("The ticket filter policy requires the v2 relation API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
return new List<cF4sdApiSearchResultRelation>();
}
var urlBuilder = new StringBuilder(constUrlGetTicketOverviewRelations);

View File

@@ -25,7 +25,7 @@ namespace C4IT.DataHistoryProvider
private const string constConfigRootElement = "F4SD-Global-Configuration";
public cConfigHelperParameterList Parameters { get; private set; } = null;
public cActivityFilterPolicy ActivityFilters { get; private set; } = new cActivityFilterPolicy();
public cTicketFilterPolicy TicketFilters { get; private set; } = new cTicketFilterPolicy();
private cDataHistoryConfigInfrastructure InfrastructureConfig = null;
@@ -111,8 +111,8 @@ namespace C4IT.DataHistoryProvider
if (_ticketProcessingEntry != null)
_result.Items[_ticketProcessingEntry.Name] = _ticketProcessingEntry;
continue;
case "ActivityFilters":
ActivityFilters = getActivityFilters(_item, Parser);
case "TicketFilters":
TicketFilters = getTicketFilters(_item, Parser);
continue;
}
@@ -166,20 +166,20 @@ namespace C4IT.DataHistoryProvider
return _result;
}
private static cActivityFilterPolicy getActivityFilters(XmlElement node, cXmlParser parser)
private static cTicketFilterPolicy getTicketFilters(XmlElement node, cXmlParser parser)
{
var result = new cActivityFilterPolicy();
var result = new cTicketFilterPolicy();
foreach (XmlElement filterNode in node.SelectNodes("Filter").OfType<XmlElement>())
{
parser.EnterElement(filterNode.Name);
try
{
if (!Enum.TryParse(filterNode.GetAttribute("Match"), true, out enumActivityFilterMatch match))
match = enumActivityFilterMatch.exclude;
if (!Enum.TryParse(filterNode.GetAttribute("EmptyHandling"), true, out enumActivityFilterEmptyHandling emptyHandling))
emptyHandling = enumActivityFilterEmptyHandling.include;
if (!Enum.TryParse(filterNode.GetAttribute("Match"), true, out enumTicketFilterMatch match))
match = enumTicketFilterMatch.exclude;
if (!Enum.TryParse(filterNode.GetAttribute("EmptyHandling"), true, out enumTicketFilterEmptyHandling emptyHandling))
emptyHandling = enumTicketFilterEmptyHandling.include;
var filter = new cActivityFilter
var filter = new cTicketFilter
{
Provider = filterNode.GetAttribute("Provider"),
Field = filterNode.GetAttribute("Field"),
@@ -190,7 +190,7 @@ namespace C4IT.DataHistoryProvider
foreach (XmlElement valueNode in filterNode.SelectNodes("Value").OfType<XmlElement>())
{
filter.Values.Add(new cActivityFilterValue
filter.Values.Add(new cTicketFilterValue
{
ID = valueNode.GetAttribute("ID"),
Name = valueNode.GetAttribute("Name")
@@ -208,7 +208,7 @@ namespace C4IT.DataHistoryProvider
return result;
}
private string getDefaultActivityFiltersXml()
private string getDefaultTicketFiltersXml()
{
var queueOption = InfrastructureConfig?.M42Wpm?.ActivityQueueFilterOption
?? enumActivityQueueFilterOptions.showAll;
@@ -216,11 +216,11 @@ namespace C4IT.DataHistoryProvider
?? new List<cApiM42TicketQueueInfo>();
var enableQueueFilter = queueOption != enumActivityQueueFilterOptions.showAll && queues.Count > 0;
var emptyHandling = queueOption == enumActivityQueueFilterOptions.onlyListedQueues
? enumActivityFilterEmptyHandling.exclude
: enumActivityFilterEmptyHandling.include;
? enumTicketFilterEmptyHandling.exclude
: enumTicketFilterEmptyHandling.include;
var xml = new StringBuilder();
xml.Append("<ActivityFilters>");
xml.Append("<TicketFilters>");
xml.AppendFormat(
"<Filter Provider=\"Matrix42\" Field=\"Queue\" Enabled=\"{0}\" Match=\"include\" EmptyHandling=\"{1}\">",
enableQueueFilter.ToString().ToLowerInvariant(),
@@ -243,7 +243,7 @@ namespace C4IT.DataHistoryProvider
xml.Append("<Value ID=\"1676de08-27f3-550c-b410-5610e807aa02\" Name=\"HR Service Management\" />");
xml.Append("<Value ID=\"ed7dde08-199e-c27b-b410-562b64037aa1\" Name=\"Gebäudemanagement\" />");
xml.Append("</Filter>");
xml.Append("</ActivityFilters>");
xml.Append("</TicketFilters>");
return xml.ToString();
}
@@ -582,12 +582,16 @@ namespace C4IT.DataHistoryProvider
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "ActivityFilters"
, getDefaultActivityFiltersXml()
, "TicketFilters"
, getDefaultTicketFiltersXml()
);
RetVal |= DoXmlRemoveElement(XmlRoot
, "TicketConfiguration"
, "OpenActivitiesExternally"
RetVal |= DoXmlRemoveElement(XmlRoot
, "TicketConfiguration"
, "ActivityFilters"
);
RetVal |= DoXmlRemoveElement(XmlRoot
, "TicketConfiguration"
, "OpenActivitiesExternally"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"

View File

@@ -121,9 +121,9 @@ namespace C4IT.DataHistoryProvider
return false;
}
internal bool RemoveLegacyActivityFilterConfiguration()
internal bool RemoveLegacyTicketFilterConfiguration()
{
// Queue filtering moved to the provider-neutral global ActivityFilters policy.
// Queue filtering moved to the provider-neutral global TicketFilters policy.
// This intentionally runs only after the global configuration was loaded:
// DoXmlUpdates runs before InstantiateProperties and would otherwise erase
// the values before the one-time migration can read them.