Rename WebApi activity filters to ticket filters

This commit is contained in:
Drechsler, Meik
2026-07-23 12:47:28 +02:00
parent 0af8981323
commit 60e2651641
12 changed files with 148 additions and 148 deletions

View File

@@ -91,13 +91,13 @@
<ItemGroup>
<Compile Include="cM42LogEntry.cs" />
<Compile Include="ActivityFilterService.cs" />
<Compile Include="TicketFilterService.cs" />
<Compile Include="F4SDM42DependencyRegistrator.cs" />
<Compile Include="F4SDHelperService.cs" />
<Compile Include="F4SDHelperService.UserId.cs" />
<Compile Include="F4SDM42WebApiController.cs" />
<Compile Include="..\Shared\ActivityFilterCompiler.cs">
<Link>Shared\ActivityFilterCompiler.cs</Link>
<Compile Include="..\Shared\TicketFilterCompiler.cs">
<Link>Shared\TicketFilterCompiler.cs</Link>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="..\SharedAssemblyInfo.cs">

View File

@@ -23,7 +23,7 @@ namespace C4IT.F4SD
int hours,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var method = MethodBase.GetCurrentMethod();
LogMethodBegin(method);
@@ -34,7 +34,7 @@ namespace C4IT.F4SD
return new List<cF4SDTicketSummary>();
var activityFilter = GetActivityFilter(userId, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
activityFilter = await ApplyActivityFiltersAsync(activityFilter, filters);
activityFilter = await ApplyTicketFiltersAsync(activityFilter, filters);
if (string.IsNullOrWhiteSpace(activityFilter))
return new List<cF4SDTicketSummary>();
LogEntry($"Generating ticket list for userId '{userId}'. ASQL filter: {activityFilter}", LogLevels.Debug);
@@ -96,7 +96,7 @@ namespace C4IT.F4SD
IEnumerable<string> keys,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var method = MethodBase.GetCurrentMethod();
LogMethodBegin(method);
@@ -144,7 +144,7 @@ namespace C4IT.F4SD
IEnumerable<string> keys,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, roleGuids);
return await getTicketOverviewCountsByRoles(null, roleIds, keys, queueoption, queues, filters);
@@ -157,7 +157,7 @@ namespace C4IT.F4SD
int count,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var method = MethodBase.GetCurrentMethod();
LogMethodBegin(method);
@@ -220,7 +220,7 @@ namespace C4IT.F4SD
bool useRoleScope,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
if (userId == Guid.Empty)
return new List<TicketOverviewEntry>();
@@ -233,14 +233,14 @@ namespace C4IT.F4SD
Guid userId,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
if (userId == Guid.Empty)
return new List<TicketOverviewEntry>();
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
filter = await ApplyActivityFiltersAsync(filter, filters);
filter = await ApplyTicketFiltersAsync(filter, filters);
if (string.IsNullOrWhiteSpace(filter))
return new List<TicketOverviewEntry>();
@@ -252,15 +252,15 @@ namespace C4IT.F4SD
bool useRoleScope,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var filter = BuildTicketOverviewBaseFilter(queueoption, queues);
if (!useRoleScope)
return await ApplyActivityFiltersAsync(filter + $" AND (Recipient = '{Escape(userId.ToString("D"))}')", filters);
return await ApplyTicketFiltersAsync(filter + $" AND (Recipient = '{Escape(userId.ToString("D"))}')", filters);
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null);
filter = BuildTicketOverviewFilterForRoleIds(roleIds, filter);
return await ApplyActivityFiltersAsync(filter, filters);
return await ApplyTicketFiltersAsync(filter, filters);
}
private async Task<List<Guid>> ResolveTicketOverviewRoleIdsAsync(Guid userId, IEnumerable<Guid> roleGuids)

View File

@@ -186,7 +186,7 @@ namespace C4IT.F4SD
}
internal async Task<List<cF4SDTicketSummary>> getTicketListByUser(string userSid, int hours, int queueoption, List<cApiM42TicketQueueInfo> queues, cActivityFilterPolicy filters = null)
internal async Task<List<cF4SDTicketSummary>> getTicketListByUser(string userSid, int hours, int queueoption, List<cApiM42TicketQueueInfo> queues, cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -197,7 +197,7 @@ namespace C4IT.F4SD
var tickets = new List<cF4SDTicketSummary>();
var activityFilter = GetActivityFilter(userSid, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
activityFilter = await ApplyActivityFiltersAsync(activityFilter, filters);
activityFilter = await ApplyTicketFiltersAsync(activityFilter, filters);
if (string.IsNullOrWhiteSpace(activityFilter))
return new List<cF4SDTicketSummary>();
LogEntry($"ASql Filter: {activityFilter}");
@@ -383,7 +383,7 @@ namespace C4IT.F4SD
IEnumerable<string> keys,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -440,7 +440,7 @@ namespace C4IT.F4SD
IEnumerable<string> keys,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -505,7 +505,7 @@ namespace C4IT.F4SD
int count,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -583,7 +583,7 @@ namespace C4IT.F4SD
bool useRoleScope,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -612,7 +612,7 @@ namespace C4IT.F4SD
string sid,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -625,7 +625,7 @@ namespace C4IT.F4SD
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
filter = await ApplyActivityFiltersAsync(filter, filters);
filter = await ApplyTicketFiltersAsync(filter, filters);
if (string.IsNullOrWhiteSpace(filter))
return new List<TicketOverviewEntry>();
@@ -647,7 +647,7 @@ namespace C4IT.F4SD
IEnumerable<Guid> roleIds,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -656,7 +656,7 @@ namespace C4IT.F4SD
await Task.Delay(0);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
filter = await ApplyActivityFiltersAsync(filter, filters);
filter = await ApplyTicketFiltersAsync(filter, filters);
return await LoadTicketOverviewEntriesByFilter(filter);
}
catch (Exception E)
@@ -800,7 +800,7 @@ namespace C4IT.F4SD
bool useRoleScope,
int queueoption,
List<cApiM42TicketQueueInfo> queues,
cActivityFilterPolicy filters = null)
cTicketFilterPolicy filters = null)
{
var filter = BuildTicketOverviewBaseFilter(queueoption, queues);
@@ -808,12 +808,12 @@ namespace C4IT.F4SD
{
var recipientFilter = $"Recipient.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'";
filter += $" AND ({recipientFilter})";
return await ApplyActivityFiltersAsync(filter, filters);
return await ApplyTicketFiltersAsync(filter, filters);
}
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
filter = BuildTicketOverviewFilterForRoleIds(roleIds, filter);
return await ApplyActivityFiltersAsync(filter, filters);
return await ApplyTicketFiltersAsync(filter, filters);
}
private string BuildTicketOverviewBaseFilter(int queueoption, List<cApiM42TicketQueueInfo> queues)

View File

@@ -155,7 +155,7 @@ namespace C4IT.F4SD
}
[Route("v2/getTicketList"), HttpPost]
public async Task<List<cF4SDTicketSummary>> getTicketListV2([FromBody] cTicketActivityListRequest request)
public async Task<List<cF4SDTicketSummary>> getTicketListV2([FromBody] cTicketListFilterRequest request)
{
if (request?.UserId != Guid.Empty)
return await _f4stHelperService.getTicketListByUser(
@@ -388,10 +388,10 @@ namespace C4IT.F4SD
request?.Filters) ?? new List<F4SDHelperService.TicketOverviewRelationDto>();
}
[Route("v2/getActivityFilterCapabilities"), HttpGet]
public cTicketActivityFilterCapabilities getActivityFilterCapabilitiesV2()
[Route("v2/getTicketFilterCapabilities"), HttpGet]
public cTicketFilterCapabilities getTicketFilterCapabilitiesV2()
{
return _f4stHelperService.GetActivityFilterCapabilities();
return _f4stHelperService.GetTicketFilterCapabilities();
}
/*
[Route("updateActivitySolution/{objectId}"), HttpPost]

View File

@@ -25,12 +25,12 @@ namespace C4IT.F4SD
private static readonly Dictionary<string, WorkspaceRoleCacheEntry> workspaceRoleCache =
new Dictionary<string, WorkspaceRoleCacheEntry>(StringComparer.OrdinalIgnoreCase);
internal async Task<string> ApplyActivityFiltersAsync(string baseFilter, cActivityFilterPolicy policy)
internal async Task<string> ApplyTicketFiltersAsync(string baseFilter, cTicketFilterPolicy policy)
{
var result = await ActivityFilterCompiler.CompileAsync(policy, ResolveWorkspaceRolesAsync);
var result = await TicketFilterCompiler.CompileAsync(policy, ResolveWorkspaceRolesAsync);
if (!result.Success)
{
LogEntry($"Activity filter rejected (fail closed): {result.Error}", LogLevels.Error);
LogEntry($"Ticket filter rejected (fail closed): {result.Error}", LogLevels.Error);
return null;
}
@@ -39,22 +39,22 @@ namespace C4IT.F4SD
: $"({baseFilter}) AND ({result.Clause})";
}
internal cTicketActivityFilterCapabilities GetActivityFilterCapabilities()
internal cTicketFilterCapabilities GetTicketFilterCapabilities()
{
var capabilities = new cTicketActivityFilterCapabilities
var capabilities = new cTicketFilterCapabilities
{
Provider = ActivityFilterCompiler.ProviderName,
CommonFields = new List<string> { ActivityFilterCompiler.AssignmentGroupField },
ProviderFields = new List<string> { ActivityFilterCompiler.QueueField }
Provider = TicketFilterCompiler.ProviderName,
CommonFields = new List<string> { TicketFilterCompiler.AssignmentGroupField },
ProviderFields = new List<string> { TicketFilterCompiler.QueueField }
};
if (SPSDataEngineSchemaReader.ClassGetIDFromName("ESMWorkspaceClassBase") != Guid.Empty)
capabilities.ProviderFields.Add(ActivityFilterCompiler.WorkspaceField);
capabilities.ProviderFields.Add(TicketFilterCompiler.WorkspaceField);
return capabilities;
}
private async Task<ActivityFilterResolution> ResolveWorkspaceRolesAsync(cActivityFilter filter)
private async Task<TicketFilterResolution> ResolveWorkspaceRolesAsync(cTicketFilter filter)
{
await Task.Delay(0);
var workspaceClassId = SPSDataEngineSchemaReader.ClassGetIDFromName("ESMWorkspaceClassBase");
@@ -62,7 +62,7 @@ namespace C4IT.F4SD
return WorkspaceFailure("ESMWorkspaceClassBase is not available.");
var roleIds = new HashSet<Guid>();
foreach (var value in filter?.Values ?? new List<cActivityFilterValue>())
foreach (var value in filter?.Values ?? new List<cTicketFilterValue>())
{
var key = !string.IsNullOrWhiteSpace(value?.ID)
? "id:" + value.ID.Trim()
@@ -125,7 +125,7 @@ namespace C4IT.F4SD
roleIds.UnionWith(resolved);
}
return new ActivityFilterResolution
return new TicketFilterResolution
{
Success = true,
RoleIds = roleIds.ToList()
@@ -167,9 +167,9 @@ namespace C4IT.F4SD
}
}
private static ActivityFilterResolution WorkspaceFailure(string error)
private static TicketFilterResolution WorkspaceFailure(string error)
{
return new ActivityFilterResolution
return new TicketFilterResolution
{
Success = false,
Error = error

View File

@@ -1,63 +0,0 @@
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<cActivityFilterPolicy> currentActivityFilters =
new AsyncLocal<cActivityFilterPolicy>();
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<string> 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<string> { ActivityFilterCompiler.AssignmentGroupField },
ProviderFields = new List<string> { ActivityFilterCompiler.QueueField }
};
}
}
}

View File

@@ -54,10 +54,10 @@
<ItemGroup>
<Compile Include="cM42LogEntry.cs" />
<Compile Include="ActivityFilterService.cs" />
<Compile Include="TicketFilterService.cs" />
<Compile Include="F4SDHelperService.cs" />
<Compile Include="F4SDM42WebApiController.cs" />
<Compile Include="..\..\Shared\ActivityFilterCompiler.cs"><Link>Shared\ActivityFilterCompiler.cs</Link></Compile>
<Compile Include="..\..\Shared\TicketFilterCompiler.cs"><Link>Shared\TicketFilterCompiler.cs</Link></Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="..\..\SharedAssemblyInfo.cs"><Link>Properties\SharedAssemblyInfo.cs</Link></Compile>
</ItemGroup>

View File

@@ -166,7 +166,7 @@ namespace C4IT.F4SD
var tickets = new List<cF4SDTicketSummary>();
var activityFilter = GetActivityFilter(userSid, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
activityFilter = await ApplyActivityFiltersAsync(activityFilter, null);
activityFilter = await ApplyTicketFiltersAsync(activityFilter, null);
if (string.IsNullOrWhiteSpace(activityFilter))
return new List<cF4SDTicketSummary>();
LogEntry($"ASql Filter: {activityFilter}");
@@ -282,7 +282,7 @@ namespace C4IT.F4SD
var tickets = new List<cF4SDTicketSummary>();
var activityFilter = GetActivityFilter(userId, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
activityFilter = await ApplyActivityFiltersAsync(activityFilter, null);
activityFilter = await ApplyTicketFiltersAsync(activityFilter, null);
if (string.IsNullOrWhiteSpace(activityFilter))
return new List<cF4SDTicketSummary>();
LogEntry($"ASql Filter: {activityFilter}");
@@ -988,7 +988,7 @@ namespace C4IT.F4SD
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
filter = await ApplyActivityFiltersAsync(filter, null);
filter = await ApplyTicketFiltersAsync(filter, null);
if (string.IsNullOrWhiteSpace(filter))
return new List<TicketOverviewEntry>();
@@ -1022,7 +1022,7 @@ namespace C4IT.F4SD
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
filter = await ApplyActivityFiltersAsync(filter, null);
filter = await ApplyTicketFiltersAsync(filter, null);
if (string.IsNullOrWhiteSpace(filter))
return new List<TicketOverviewEntry>();
@@ -1052,7 +1052,7 @@ namespace C4IT.F4SD
await Task.Delay(0);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
filter = await ApplyActivityFiltersAsync(filter, null);
filter = await ApplyTicketFiltersAsync(filter, null);
return await LoadTicketOverviewEntriesByFilter(filter);
}
catch (Exception E)
@@ -1204,12 +1204,12 @@ namespace C4IT.F4SD
{
var recipientFilter = $"Recipient.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'";
filter += $" AND ({recipientFilter})";
return await ApplyActivityFiltersAsync(filter, null);
return await ApplyTicketFiltersAsync(filter, null);
}
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
filter = BuildTicketOverviewFilterForRoleIds(roleIds, filter);
return await ApplyActivityFiltersAsync(filter, null);
return await ApplyTicketFiltersAsync(filter, null);
}
private async Task<string> BuildTicketOverviewFilterAsync(
@@ -1224,12 +1224,12 @@ namespace C4IT.F4SD
{
var recipientFilter = $"Recipient = '{Escape(userId.ToString("D"))}'";
filter += $" AND ({recipientFilter})";
return await ApplyActivityFiltersAsync(filter, null);
return await ApplyTicketFiltersAsync(filter, null);
}
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null);
filter = BuildTicketOverviewFilterForRoleIds(roleIds, filter);
return await ApplyActivityFiltersAsync(filter, null);
return await ApplyTicketFiltersAsync(filter, null);
}
private string BuildTicketOverviewBaseFilter(int queueoption, List<cApiM42TicketQueueInfo> queues)

View File

@@ -139,9 +139,9 @@ namespace C4IT.F4SD
}
[Route("v2/getTicketList"), HttpPost]
public async Task<List<cF4SDTicketSummary>> getTicketListV2([FromBody] cTicketActivityListRequest request)
public async Task<List<cF4SDTicketSummary>> getTicketListV2([FromBody] cTicketListFilterRequest request)
{
using (_f4stHelperService.BeginActivityFilterScope(request?.Filters))
using (_f4stHelperService.BeginTicketFilterScope(request?.Filters))
{
if (request?.UserId != Guid.Empty)
return await _f4stHelperService.getTicketListByUser(
@@ -217,7 +217,7 @@ namespace C4IT.F4SD
public async Task<F4SDHelperService.TicketOverviewCountsResult> getTicketOverviewCountsV2(
[FromBody] cTicketOverviewFilterRequest request)
{
using (_f4stHelperService.BeginActivityFilterScope(request?.Filters))
using (_f4stHelperService.BeginTicketFilterScope(request?.Filters))
{
if (request?.UserId != Guid.Empty)
return await _f4stHelperService.getTicketOverviewCounts(
@@ -316,7 +316,7 @@ namespace C4IT.F4SD
public async Task<List<F4SDHelperService.TicketOverviewRelationDto>> getTicketOverviewRelationsV2(
[FromBody] cTicketOverviewFilterRequest request)
{
using (_f4stHelperService.BeginActivityFilterScope(request?.Filters))
using (_f4stHelperService.BeginTicketFilterScope(request?.Filters))
{
if (request?.UserId != Guid.Empty)
return await _f4stHelperService.getTicketOverviewRelations(
@@ -337,10 +337,10 @@ namespace C4IT.F4SD
}
}
[Route("v2/getActivityFilterCapabilities"), HttpGet]
public cTicketActivityFilterCapabilities getActivityFilterCapabilitiesV2()
[Route("v2/getTicketFilterCapabilities"), HttpGet]
public cTicketFilterCapabilities getTicketFilterCapabilitiesV2()
{
return _f4stHelperService.GetActivityFilterCapabilities();
return _f4stHelperService.GetTicketFilterCapabilities();
}

View File

@@ -0,0 +1,63 @@
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 }
};
}
}
}

View File

@@ -7,40 +7,40 @@ using C4IT.FASD.Base;
namespace C4IT.F4SD
{
internal sealed class ActivityFilterResolution
internal sealed class TicketFilterResolution
{
public bool Success { get; set; }
public string Error { get; set; }
public List<Guid> RoleIds { get; set; } = new List<Guid>();
}
internal sealed class ActivityFilterCompilationResult
internal sealed class TicketFilterCompilationResult
{
public bool Success { get; set; }
public string Clause { get; set; }
public string Error { get; set; }
}
internal static class ActivityFilterCompiler
internal static class TicketFilterCompiler
{
internal const string ProviderName = "Matrix42";
internal const string AssignmentGroupField = "AssignmentGroup";
internal const string QueueField = "Queue";
internal const string WorkspaceField = "Workspace";
internal static async Task<ActivityFilterCompilationResult> CompileAsync(
cActivityFilterPolicy policy,
Func<cActivityFilter, Task<ActivityFilterResolution>> workspaceResolver)
internal static async Task<TicketFilterCompilationResult> CompileAsync(
cTicketFilterPolicy policy,
Func<cTicketFilter, Task<TicketFilterResolution>> workspaceResolver)
{
var clauses = new List<string>();
foreach (var filter in policy?.Filters ?? new List<cActivityFilter>())
foreach (var filter in policy?.Filters ?? new List<cTicketFilter>())
{
if (filter == null || !filter.Enabled)
continue;
var providerSpecific = !string.IsNullOrWhiteSpace(filter.Provider);
if (providerSpecific && !string.Equals(filter.Provider, ProviderName, StringComparison.OrdinalIgnoreCase))
return Fail($"Unsupported activity filter provider '{filter.Provider}'.");
return Fail($"Unsupported ticket filter provider '{filter.Provider}'.");
var field = filter.Field?.Trim();
string emptyClause;
@@ -70,37 +70,37 @@ namespace C4IT.F4SD
}
else
{
return Fail($"Unsupported activity filter field '{filter.Provider}:{field}'.");
return Fail($"Unsupported ticket filter field '{filter.Provider}:{field}'.");
}
if (filter.EmptyHandling == enumActivityFilterEmptyHandling.only)
if (filter.EmptyHandling == enumTicketFilterEmptyHandling.only)
{
clauses.Add($"({emptyClause})");
continue;
}
if (string.IsNullOrWhiteSpace(valueClause))
return Fail($"Activity filter '{filter.Provider}:{field}' has no valid values.");
return Fail($"Ticket filter '{filter.Provider}:{field}' has no valid values.");
var matchClause = filter.Match == enumActivityFilterMatch.exclude
var matchClause = filter.Match == enumTicketFilterMatch.exclude
? $"NOT ({valueClause})"
: $"({valueClause})";
clauses.Add(filter.EmptyHandling == enumActivityFilterEmptyHandling.include
clauses.Add(filter.EmptyHandling == enumTicketFilterEmptyHandling.include
? $"(({emptyClause}) OR ({matchClause}))"
: $"((NOT ({emptyClause})) AND ({matchClause}))");
}
return new ActivityFilterCompilationResult
return new TicketFilterCompilationResult
{
Success = true,
Clause = string.Join(" AND ", clauses)
};
}
private static string BuildValueClause(string idField, string nameField, IEnumerable<cActivityFilterValue> values)
private static string BuildValueClause(string idField, string nameField, IEnumerable<cTicketFilterValue> values)
{
var items = (values ?? Enumerable.Empty<cActivityFilterValue>())
var items = (values ?? Enumerable.Empty<cTicketFilterValue>())
.Where(value => value != null)
.ToList();
var ids = items
@@ -139,9 +139,9 @@ namespace C4IT.F4SD
return $"'{(value ?? string.Empty).Replace("'", "''")}'";
}
private static ActivityFilterCompilationResult Fail(string error)
private static TicketFilterCompilationResult Fail(string error)
{
return new ActivityFilterCompilationResult
return new TicketFilterCompilationResult
{
Success = false,
Error = error

View File

@@ -1036,17 +1036,17 @@
]
},
{
"name": "06 Activity Filter APIs v2",
"name": "06 Ticket Filter APIs v2",
"item": [
{
"name": "get activity filter capabilities",
"name": "get ticket filter capabilities",
"request": {
"method": "GET",
"header": [{ "key": "Accept", "value": "application/json" }],
"url": {
"raw": "{{baseUrl}}/api/c4itf4sdwebapi/v2/getActivityFilterCapabilities",
"raw": "{{baseUrl}}/api/c4itf4sdwebapi/v2/getTicketFilterCapabilities",
"host": ["{{baseUrl}}"],
"path": ["api", "c4itf4sdwebapi", "v2", "getActivityFilterCapabilities"]
"path": ["api", "c4itf4sdwebapi", "v2", "getTicketFilterCapabilities"]
}
}
},