Add provider-aware activity filter API
This commit is contained in:
179
F4SDM42WebApi/ActivityFilterService.cs
Normal file
179
F4SDM42WebApi/ActivityFilterService.cs
Normal file
@@ -0,0 +1,179 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using C4IT.FASD.Base;
|
||||
using C4IT.Logging;
|
||||
|
||||
using update4u.SPS.DataLayer;
|
||||
|
||||
using static C4IT.Logging.cLogManager;
|
||||
|
||||
namespace C4IT.F4SD
|
||||
{
|
||||
public partial class F4SDHelperService
|
||||
{
|
||||
private sealed class WorkspaceRoleCacheEntry
|
||||
{
|
||||
public DateTime ExpiresAtUtc { get; set; }
|
||||
public List<Guid> RoleIds { get; set; }
|
||||
}
|
||||
|
||||
private static readonly object workspaceRoleCacheLock = new object();
|
||||
private static readonly Dictionary<string, WorkspaceRoleCacheEntry> workspaceRoleCache =
|
||||
new Dictionary<string, WorkspaceRoleCacheEntry>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
internal async Task<string> ApplyActivityFiltersAsync(string baseFilter, cActivityFilterPolicy policy)
|
||||
{
|
||||
var result = await ActivityFilterCompiler.CompileAsync(policy, ResolveWorkspaceRolesAsync);
|
||||
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()
|
||||
{
|
||||
var capabilities = new cTicketActivityFilterCapabilities
|
||||
{
|
||||
Provider = ActivityFilterCompiler.ProviderName,
|
||||
CommonFields = new List<string> { ActivityFilterCompiler.AssignmentGroupField },
|
||||
ProviderFields = new List<string> { ActivityFilterCompiler.QueueField }
|
||||
};
|
||||
|
||||
if (SPSDataEngineSchemaReader.ClassGetIDFromName("ESMWorkspaceClassBase") != Guid.Empty)
|
||||
capabilities.ProviderFields.Add(ActivityFilterCompiler.WorkspaceField);
|
||||
|
||||
return capabilities;
|
||||
}
|
||||
|
||||
private async Task<ActivityFilterResolution> ResolveWorkspaceRolesAsync(cActivityFilter filter)
|
||||
{
|
||||
await Task.Delay(0);
|
||||
var workspaceClassId = SPSDataEngineSchemaReader.ClassGetIDFromName("ESMWorkspaceClassBase");
|
||||
if (workspaceClassId == Guid.Empty)
|
||||
return WorkspaceFailure("ESMWorkspaceClassBase is not available.");
|
||||
|
||||
var roleIds = new HashSet<Guid>();
|
||||
foreach (var value in filter?.Values ?? new List<cActivityFilterValue>())
|
||||
{
|
||||
var key = !string.IsNullOrWhiteSpace(value?.ID)
|
||||
? "id:" + value.ID.Trim()
|
||||
: "name:" + value?.Name?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(key) || key.EndsWith(":", StringComparison.Ordinal))
|
||||
return WorkspaceFailure("A Workspace filter value has neither ID nor Name.");
|
||||
|
||||
if (TryGetCachedWorkspaceRoles(key, out var cached))
|
||||
{
|
||||
roleIds.UnionWith(cached);
|
||||
continue;
|
||||
}
|
||||
|
||||
DataTable table;
|
||||
try
|
||||
{
|
||||
table = LoadWorkspaceRoles(
|
||||
workspaceClassId,
|
||||
!string.IsNullOrWhiteSpace(value.ID)
|
||||
? $"ID = '{Escape(value.ID.Trim())}'"
|
||||
: $"Title = '{Escape(value.Name.Trim())}'");
|
||||
|
||||
// IDs are stable and therefore preferred. The name is kept as a
|
||||
// portable fallback for configurations imported into another ESM.
|
||||
if ((table?.Rows == null || table.Rows.Count == 0)
|
||||
&& !string.IsNullOrWhiteSpace(value.ID)
|
||||
&& !string.IsNullOrWhiteSpace(value.Name))
|
||||
{
|
||||
table = LoadWorkspaceRoles(
|
||||
workspaceClassId,
|
||||
$"Title = '{Escape(value.Name.Trim())}'");
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
LogException(exception);
|
||||
return WorkspaceFailure($"Workspace relation ESMWorkspaceClassBase.Roles could not be loaded for '{key}'.");
|
||||
}
|
||||
|
||||
if (table?.Rows == null || table.Rows.Count == 0)
|
||||
return WorkspaceFailure($"Workspace '{key}' was not found or has no resolvable Roles relation.");
|
||||
|
||||
var workspaceIds = table.Rows.Cast<DataRow>()
|
||||
.Select(row => getGuidFromObject(row["WorkspaceID"]))
|
||||
.Where(id => id != Guid.Empty)
|
||||
.Distinct()
|
||||
.ToList();
|
||||
if (workspaceIds.Count != 1)
|
||||
return WorkspaceFailure($"Workspace '{key}' is not unique.");
|
||||
|
||||
var resolved = table.Rows.Cast<DataRow>()
|
||||
.Select(row => getGuidFromObject(row["RoleID"]))
|
||||
.Where(id => id != Guid.Empty)
|
||||
.Distinct()
|
||||
.ToList();
|
||||
if (resolved.Count == 0)
|
||||
return WorkspaceFailure($"Workspace '{key}' contains no roles.");
|
||||
|
||||
SetCachedWorkspaceRoles(key, resolved);
|
||||
roleIds.UnionWith(resolved);
|
||||
}
|
||||
|
||||
return new ActivityFilterResolution
|
||||
{
|
||||
Success = true,
|
||||
RoleIds = roleIds.ToList()
|
||||
};
|
||||
}
|
||||
|
||||
private static DataTable LoadWorkspaceRoles(Guid workspaceClassId, string where)
|
||||
{
|
||||
return FragmentRequestBase.SimpleLoad(
|
||||
workspaceClassId,
|
||||
"ID as WorkspaceID, Title as WorkspaceTitle, Roles.T(SPSSecurityClassRole).ID as RoleID",
|
||||
where);
|
||||
}
|
||||
|
||||
private static bool TryGetCachedWorkspaceRoles(string key, out List<Guid> roleIds)
|
||||
{
|
||||
lock (workspaceRoleCacheLock)
|
||||
{
|
||||
if (workspaceRoleCache.TryGetValue(key, out var entry) && entry.ExpiresAtUtc > DateTime.UtcNow)
|
||||
{
|
||||
roleIds = new List<Guid>(entry.RoleIds);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
roleIds = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void SetCachedWorkspaceRoles(string key, List<Guid> roleIds)
|
||||
{
|
||||
lock (workspaceRoleCacheLock)
|
||||
{
|
||||
workspaceRoleCache[key] = new WorkspaceRoleCacheEntry
|
||||
{
|
||||
ExpiresAtUtc = DateTime.UtcNow.AddMinutes(5),
|
||||
RoleIds = new List<Guid>(roleIds)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static ActivityFilterResolution WorkspaceFailure(string error)
|
||||
{
|
||||
return new ActivityFilterResolution
|
||||
{
|
||||
Success = false,
|
||||
Error = error
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,12 +90,16 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="cM42LogEntry.cs" />
|
||||
<Compile Include="F4SDM42DependencyRegistrator.cs" />
|
||||
<Compile Include="cM42LogEntry.cs" />
|
||||
<Compile Include="ActivityFilterService.cs" />
|
||||
<Compile Include="F4SDM42DependencyRegistrator.cs" />
|
||||
<Compile Include="F4SDHelperService.cs" />
|
||||
<Compile Include="F4SDHelperService.UserId.cs" />
|
||||
<Compile Include="F4SDM42WebApiController.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="F4SDM42WebApiController.cs" />
|
||||
<Compile Include="..\Shared\ActivityFilterCompiler.cs">
|
||||
<Link>Shared\ActivityFilterCompiler.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="..\SharedAssemblyInfo.cs">
|
||||
<Link>Properties\SharedAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
|
||||
@@ -22,7 +22,8 @@ namespace C4IT.F4SD
|
||||
Guid userId,
|
||||
int hours,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var method = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(method);
|
||||
@@ -33,6 +34,9 @@ namespace C4IT.F4SD
|
||||
return new List<cF4SDTicketSummary>();
|
||||
|
||||
var activityFilter = GetActivityFilter(userId, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
|
||||
activityFilter = await ApplyActivityFiltersAsync(activityFilter, filters);
|
||||
if (string.IsNullOrWhiteSpace(activityFilter))
|
||||
return new List<cF4SDTicketSummary>();
|
||||
LogEntry($"Generating ticket list for userId '{userId}'. ASQL filter: {activityFilter}", LogLevels.Debug);
|
||||
|
||||
var activityTable = FragmentRequestBase.SimpleLoad(
|
||||
@@ -91,7 +95,8 @@ namespace C4IT.F4SD
|
||||
string scope,
|
||||
IEnumerable<string> keys,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var method = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(method);
|
||||
@@ -106,10 +111,10 @@ namespace C4IT.F4SD
|
||||
if (normalizedKeys.Count == 0)
|
||||
normalizedKeys.AddRange(TicketOverviewKeys);
|
||||
|
||||
var entries = await LoadTicketOverviewEntries(userId, useRoleScope, queueoption, queues);
|
||||
var entries = await LoadTicketOverviewEntries(userId, useRoleScope, queueoption, queues, filters);
|
||||
List<TicketOverviewEntry> unassignedEntries = null;
|
||||
if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey))
|
||||
unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(userId, queueoption, queues);
|
||||
unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(userId, queueoption, queues, filters);
|
||||
|
||||
var counts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (var key in normalizedKeys)
|
||||
@@ -138,10 +143,11 @@ namespace C4IT.F4SD
|
||||
IEnumerable<Guid> roleGuids,
|
||||
IEnumerable<string> keys,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, roleGuids);
|
||||
return await getTicketOverviewCountsByRoles(null, roleIds, keys, queueoption, queues);
|
||||
return await getTicketOverviewCountsByRoles(null, roleIds, keys, queueoption, queues, filters);
|
||||
}
|
||||
|
||||
internal async Task<List<TicketOverviewRelationDto>> getTicketOverviewRelations(
|
||||
@@ -150,7 +156,8 @@ namespace C4IT.F4SD
|
||||
string key,
|
||||
int count,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var method = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(method);
|
||||
@@ -161,8 +168,8 @@ namespace C4IT.F4SD
|
||||
|
||||
var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase);
|
||||
var entries = !useRoleScope && IsUnassignedOverviewKey(key)
|
||||
? await LoadTicketOverviewUnassignedEntriesForPersonalScope(userId, queueoption, queues)
|
||||
: await LoadTicketOverviewEntries(userId, useRoleScope, queueoption, queues);
|
||||
? await LoadTicketOverviewUnassignedEntriesForPersonalScope(userId, queueoption, queues, filters)
|
||||
: await LoadTicketOverviewEntries(userId, useRoleScope, queueoption, queues, filters);
|
||||
|
||||
var filtered = entries
|
||||
.Where(entry => MatchesTicketOverviewKey(entry, key))
|
||||
@@ -212,25 +219,28 @@ namespace C4IT.F4SD
|
||||
Guid userId,
|
||||
bool useRoleScope,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
if (userId == Guid.Empty)
|
||||
return new List<TicketOverviewEntry>();
|
||||
|
||||
var filter = await BuildTicketOverviewFilterAsync(userId, useRoleScope, queueoption, queues);
|
||||
var filter = await BuildTicketOverviewFilterAsync(userId, useRoleScope, queueoption, queues, filters);
|
||||
return await LoadTicketOverviewEntriesByFilter(filter);
|
||||
}
|
||||
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewUnassignedEntriesForPersonalScope(
|
||||
Guid userId,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy 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);
|
||||
if (string.IsNullOrWhiteSpace(filter))
|
||||
return new List<TicketOverviewEntry>();
|
||||
|
||||
@@ -241,14 +251,16 @@ namespace C4IT.F4SD
|
||||
Guid userId,
|
||||
bool useRoleScope,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var filter = BuildTicketOverviewBaseFilter(queueoption, queues);
|
||||
if (!useRoleScope)
|
||||
return filter + $" AND (Recipient = '{Escape(userId.ToString("D"))}')";
|
||||
return await ApplyActivityFiltersAsync(filter + $" AND (Recipient = '{Escape(userId.ToString("D"))}')", filters);
|
||||
|
||||
var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null);
|
||||
return BuildTicketOverviewFilterForRoleIds(roleIds, filter);
|
||||
filter = BuildTicketOverviewFilterForRoleIds(roleIds, filter);
|
||||
return await ApplyActivityFiltersAsync(filter, filters);
|
||||
}
|
||||
|
||||
private async Task<List<Guid>> ResolveTicketOverviewRoleIdsAsync(Guid userId, IEnumerable<Guid> roleGuids)
|
||||
|
||||
@@ -186,7 +186,7 @@ namespace C4IT.F4SD
|
||||
}
|
||||
|
||||
|
||||
internal async Task<List<cF4SDTicketSummary>> getTicketListByUser(string userSid, int hours, int queueoption, List<cApiM42TicketQueueInfo> queues)
|
||||
internal async Task<List<cF4SDTicketSummary>> getTicketListByUser(string userSid, int hours, int queueoption, List<cApiM42TicketQueueInfo> queues, cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -196,7 +196,10 @@ namespace C4IT.F4SD
|
||||
await Task.Delay(0);
|
||||
|
||||
var tickets = new List<cF4SDTicketSummary>();
|
||||
var activityFilter = GetActivityFilter(userSid, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
|
||||
var activityFilter = GetActivityFilter(userSid, hours, ticketAndServiceRequestEnabled(), queueoption, queues);
|
||||
activityFilter = await ApplyActivityFiltersAsync(activityFilter, filters);
|
||||
if (string.IsNullOrWhiteSpace(activityFilter))
|
||||
return new List<cF4SDTicketSummary>();
|
||||
LogEntry($"ASql Filter: {activityFilter}");
|
||||
|
||||
var activityTable = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID,
|
||||
@@ -374,12 +377,13 @@ namespace C4IT.F4SD
|
||||
public string ActivityType { get; set; }
|
||||
}
|
||||
|
||||
internal async Task<TicketOverviewCountsResult> getTicketOverviewCounts(
|
||||
string sid,
|
||||
string scope,
|
||||
IEnumerable<string> keys,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
internal async Task<TicketOverviewCountsResult> getTicketOverviewCounts(
|
||||
string sid,
|
||||
string scope,
|
||||
IEnumerable<string> keys,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -396,11 +400,11 @@ namespace C4IT.F4SD
|
||||
normalizedKeys.AddRange(TicketOverviewKeys);
|
||||
}
|
||||
|
||||
var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues);
|
||||
var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues, filters);
|
||||
List<TicketOverviewEntry> unassignedEntries = null;
|
||||
if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey))
|
||||
{
|
||||
unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues);
|
||||
unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues, filters);
|
||||
}
|
||||
|
||||
var counts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
|
||||
@@ -430,12 +434,13 @@ namespace C4IT.F4SD
|
||||
}
|
||||
}
|
||||
|
||||
internal async Task<TicketOverviewCountsByRoleResult> getTicketOverviewCountsByRoles(
|
||||
string sid,
|
||||
IEnumerable<Guid> roleGuids,
|
||||
IEnumerable<string> keys,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
internal async Task<TicketOverviewCountsByRoleResult> getTicketOverviewCountsByRoles(
|
||||
string sid,
|
||||
IEnumerable<Guid> roleGuids,
|
||||
IEnumerable<string> keys,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -455,7 +460,7 @@ namespace C4IT.F4SD
|
||||
if (roleIds.Count == 0)
|
||||
return new TicketOverviewCountsByRoleResult();
|
||||
|
||||
var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds, queueoption, queues);
|
||||
var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds, queueoption, queues, filters);
|
||||
var entriesByRole = entries
|
||||
.GroupBy(entry => entry.RecipientRoleId)
|
||||
.ToDictionary(group => group.Key, group => group.ToList());
|
||||
@@ -493,13 +498,14 @@ namespace C4IT.F4SD
|
||||
}
|
||||
}
|
||||
|
||||
internal async Task<List<TicketOverviewRelationDto>> getTicketOverviewRelations(
|
||||
string sid,
|
||||
string scope,
|
||||
string key,
|
||||
int count,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
internal async Task<List<TicketOverviewRelationDto>> getTicketOverviewRelations(
|
||||
string sid,
|
||||
string scope,
|
||||
string key,
|
||||
int count,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -512,11 +518,11 @@ namespace C4IT.F4SD
|
||||
List<TicketOverviewEntry> entries;
|
||||
if (!useRoleScope && IsUnassignedOverviewKey(key))
|
||||
{
|
||||
entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues);
|
||||
entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues, filters);
|
||||
}
|
||||
else
|
||||
{
|
||||
entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues);
|
||||
entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues, filters);
|
||||
}
|
||||
|
||||
var filtered = entries
|
||||
@@ -572,11 +578,12 @@ namespace C4IT.F4SD
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewEntries(
|
||||
string sid,
|
||||
bool useRoleScope,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewEntries(
|
||||
string sid,
|
||||
bool useRoleScope,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -587,7 +594,7 @@ namespace C4IT.F4SD
|
||||
if (string.IsNullOrWhiteSpace(sid))
|
||||
return new List<TicketOverviewEntry>();
|
||||
|
||||
var filter = await BuildTicketOverviewFilterAsync(sid, useRoleScope, queueoption, queues);
|
||||
var filter = await BuildTicketOverviewFilterAsync(sid, useRoleScope, queueoption, queues, filters);
|
||||
return await LoadTicketOverviewEntriesByFilter(filter);
|
||||
}
|
||||
catch (Exception E)
|
||||
@@ -601,10 +608,11 @@ namespace C4IT.F4SD
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewUnassignedEntriesForPersonalScope(
|
||||
string sid,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewUnassignedEntriesForPersonalScope(
|
||||
string sid,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -616,7 +624,8 @@ namespace C4IT.F4SD
|
||||
return new List<TicketOverviewEntry>();
|
||||
|
||||
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
|
||||
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
|
||||
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
|
||||
filter = await ApplyActivityFiltersAsync(filter, filters);
|
||||
if (string.IsNullOrWhiteSpace(filter))
|
||||
return new List<TicketOverviewEntry>();
|
||||
|
||||
@@ -634,10 +643,11 @@ namespace C4IT.F4SD
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewEntriesByRoleIds(
|
||||
IEnumerable<Guid> roleIds,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewEntriesByRoleIds(
|
||||
IEnumerable<Guid> roleIds,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
@@ -645,7 +655,8 @@ namespace C4IT.F4SD
|
||||
{
|
||||
await Task.Delay(0);
|
||||
|
||||
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
|
||||
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
|
||||
filter = await ApplyActivityFiltersAsync(filter, filters);
|
||||
return await LoadTicketOverviewEntriesByFilter(filter);
|
||||
}
|
||||
catch (Exception E)
|
||||
@@ -784,23 +795,25 @@ namespace C4IT.F4SD
|
||||
return null;
|
||||
}
|
||||
|
||||
private async Task<string> BuildTicketOverviewFilterAsync(
|
||||
string sid,
|
||||
bool useRoleScope,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues)
|
||||
private async Task<string> BuildTicketOverviewFilterAsync(
|
||||
string sid,
|
||||
bool useRoleScope,
|
||||
int queueoption,
|
||||
List<cApiM42TicketQueueInfo> queues,
|
||||
cActivityFilterPolicy filters = null)
|
||||
{
|
||||
var filter = BuildTicketOverviewBaseFilter(queueoption, queues);
|
||||
|
||||
if (!useRoleScope)
|
||||
{
|
||||
var recipientFilter = $"Recipient.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'";
|
||||
filter += $" AND ({recipientFilter})";
|
||||
return filter;
|
||||
filter += $" AND ({recipientFilter})";
|
||||
return await ApplyActivityFiltersAsync(filter, filters);
|
||||
}
|
||||
|
||||
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
|
||||
return BuildTicketOverviewFilterForRoleIds(roleIds, filter);
|
||||
filter = BuildTicketOverviewFilterForRoleIds(roleIds, filter);
|
||||
return await ApplyActivityFiltersAsync(filter, filters);
|
||||
}
|
||||
|
||||
private string BuildTicketOverviewBaseFilter(int queueoption, List<cApiM42TicketQueueInfo> queues)
|
||||
|
||||
@@ -154,6 +154,25 @@ namespace C4IT.F4SD
|
||||
ParseQueues(queues)) ?? new List<cF4SDTicketSummary>();
|
||||
}
|
||||
|
||||
[Route("v2/getTicketList"), HttpPost]
|
||||
public async Task<List<cF4SDTicketSummary>> getTicketListV2([FromBody] cTicketActivityListRequest request)
|
||||
{
|
||||
if (request?.UserId != Guid.Empty)
|
||||
return await _f4stHelperService.getTicketListByUser(
|
||||
request.UserId,
|
||||
request.Hours,
|
||||
0,
|
||||
new List<cApiM42TicketQueueInfo>(),
|
||||
request.Filters) ?? new List<cF4SDTicketSummary>();
|
||||
|
||||
return await _f4stHelperService.getTicketListByUser(
|
||||
request?.Sid ?? string.Empty,
|
||||
request?.Hours ?? 0,
|
||||
0,
|
||||
new List<cApiM42TicketQueueInfo>(),
|
||||
request?.Filters) ?? new List<cF4SDTicketSummary>();
|
||||
}
|
||||
|
||||
|
||||
[Route("getTicketDetails"), HttpGet]
|
||||
public async Task<cF4SDTicket> getTicketDetails([FromUri] Guid objectId)
|
||||
@@ -227,6 +246,28 @@ namespace C4IT.F4SD
|
||||
ParseQueues(queues)) ?? new F4SDHelperService.TicketOverviewCountsResult();
|
||||
}
|
||||
|
||||
[Route("v2/getTicketOverviewCounts"), HttpPost]
|
||||
public async Task<F4SDHelperService.TicketOverviewCountsResult> getTicketOverviewCountsV2(
|
||||
[FromBody] cTicketOverviewFilterRequest request)
|
||||
{
|
||||
if (request?.UserId != Guid.Empty)
|
||||
return await _f4stHelperService.getTicketOverviewCounts(
|
||||
request.UserId,
|
||||
request.Scope,
|
||||
request.Keys,
|
||||
0,
|
||||
new List<cApiM42TicketQueueInfo>(),
|
||||
request.Filters) ?? new F4SDHelperService.TicketOverviewCountsResult();
|
||||
|
||||
return await _f4stHelperService.getTicketOverviewCounts(
|
||||
request?.Sid ?? string.Empty,
|
||||
request?.Scope ?? "personal",
|
||||
request?.Keys ?? new List<string>(),
|
||||
0,
|
||||
new List<cApiM42TicketQueueInfo>(),
|
||||
request?.Filters) ?? new F4SDHelperService.TicketOverviewCountsResult();
|
||||
}
|
||||
|
||||
[Obsolete("Use getTicketOverviewCountsByRolesForUser with a Matrix42 user ID.")]
|
||||
[Route("getTicketOverviewCountsByRoles"), HttpPost]
|
||||
public async Task<F4SDHelperService.TicketOverviewCountsByRoleResult> getTicketOverviewCountsByRoles([FromBody] TicketOverviewCountsByRolesRequest request)
|
||||
@@ -322,6 +363,36 @@ namespace C4IT.F4SD
|
||||
queueoption,
|
||||
ParseQueues(queues)) ?? new List<F4SDHelperService.TicketOverviewRelationDto>();
|
||||
}
|
||||
|
||||
[Route("v2/getTicketOverviewRelations"), HttpPost]
|
||||
public async Task<List<F4SDHelperService.TicketOverviewRelationDto>> getTicketOverviewRelationsV2(
|
||||
[FromBody] cTicketOverviewFilterRequest request)
|
||||
{
|
||||
if (request?.UserId != Guid.Empty)
|
||||
return await _f4stHelperService.getTicketOverviewRelations(
|
||||
request.UserId,
|
||||
request.Scope,
|
||||
request.Key,
|
||||
request.Count,
|
||||
0,
|
||||
new List<cApiM42TicketQueueInfo>(),
|
||||
request.Filters) ?? new List<F4SDHelperService.TicketOverviewRelationDto>();
|
||||
|
||||
return await _f4stHelperService.getTicketOverviewRelations(
|
||||
request?.Sid ?? string.Empty,
|
||||
request?.Scope ?? "personal",
|
||||
request?.Key ?? string.Empty,
|
||||
request?.Count ?? 0,
|
||||
0,
|
||||
new List<cApiM42TicketQueueInfo>(),
|
||||
request?.Filters) ?? new List<F4SDHelperService.TicketOverviewRelationDto>();
|
||||
}
|
||||
|
||||
[Route("v2/getActivityFilterCapabilities"), HttpGet]
|
||||
public cTicketActivityFilterCapabilities getActivityFilterCapabilitiesV2()
|
||||
{
|
||||
return _f4stHelperService.GetActivityFilterCapabilities();
|
||||
}
|
||||
/*
|
||||
[Route("updateActivitySolution/{objectId}"), HttpPost]
|
||||
public async Task<HttpResponseMessage> updateActivitySolution(Guid objectId, [FromBody] string SolutionHtml)
|
||||
|
||||
Reference in New Issue
Block a user