diff --git a/F4SD.Cockpit.Client.Test/Basics/Sevices/TicketOverview/TicketOverviewUpdateServiceTest.cs b/F4SD.Cockpit.Client.Test/Basics/Sevices/TicketOverview/TicketOverviewUpdateServiceTest.cs index d54850e..80d41b6 100644 --- a/F4SD.Cockpit.Client.Test/Basics/Sevices/TicketOverview/TicketOverviewUpdateServiceTest.cs +++ b/F4SD.Cockpit.Client.Test/Basics/Sevices/TicketOverview/TicketOverviewUpdateServiceTest.cs @@ -1,3 +1,4 @@ +using C4IT.FASD.Cockpit.Communication; using FasdDesktopUi.Basics.Services; using FasdDesktopUi.Basics.Services.Models; @@ -117,7 +118,6 @@ public class TicketOverviewUpdateServiceTest var communication = new FakeCommunication(); communication.SetCounts(TileScope.Personal, new Dictionary(StringComparer.OrdinalIgnoreCase) { - ["TicketAndServiceRequestsEnabled"] = 1, ["ServiceRequestsNew"] = 2 }); communication.SetCounts(TileScope.Role, new Dictionary(StringComparer.OrdinalIgnoreCase) @@ -150,10 +150,7 @@ public class TicketOverviewUpdateServiceTest Assert.True(service.TicketAndServiceRequestsEnabled); Assert.Equal(0, availabilityChanges); - communication.SetCounts(TileScope.Personal, new Dictionary(StringComparer.OrdinalIgnoreCase) - { - ["TicketAndServiceRequestsEnabled"] = 0 - }); + communication.SetCapability(TileScope.Personal, false); await service.FetchAsync(TileScope.Personal); Assert.False(service.TicketAndServiceRequestsEnabled); @@ -199,18 +196,27 @@ public class TicketOverviewUpdateServiceTest private sealed class FakeCommunication : ITicketOverviewCommunication { - private Dictionary _personalCounts = new Dictionary(StringComparer.OrdinalIgnoreCase); - private Dictionary _roleCounts = new Dictionary(StringComparer.OrdinalIgnoreCase); + private cF4sdTicketOverviewCountsResult _personalResult = new cF4sdTicketOverviewCountsResult(); + private cF4sdTicketOverviewCountsResult _roleResult = new cF4sdTicketOverviewCountsResult(); public bool IsDemo() { return false; } - public Task> GetTicketOverviewCounts(string[] overviewKeys, bool useRoleScope) + public Task GetTicketOverviewCounts(string[] overviewKeys, bool useRoleScope) { - var source = useRoleScope ? _roleCounts : _personalCounts; - return Task.FromResult(new Dictionary(source, StringComparer.OrdinalIgnoreCase)); + var source = useRoleScope ? _roleResult : _personalResult; + return Task.FromResult(new cF4sdTicketOverviewCountsResult + { + Counts = new Dictionary(source.Counts, StringComparer.OrdinalIgnoreCase), + Capabilities = source.Capabilities == null + ? null + : new cF4sdTicketOverviewCapabilities + { + TicketAndServiceRequestsEnabled = source.Capabilities.TicketAndServiceRequestsEnabled + } + }); } public void RegisterGeneratedTicket(FasdCockpitCommunicationDemo.DemoTicketRecord record) @@ -225,13 +231,22 @@ public class TicketOverviewUpdateServiceTest if (scope == TileScope.Role) { - _roleCounts = copy; + _roleResult.Counts = copy; } else { - _personalCounts = copy; + _personalResult.Counts = copy; } } + + public void SetCapability(TileScope scope, bool enabled) + { + var result = scope == TileScope.Role ? _roleResult : _personalResult; + result.Capabilities = new cF4sdTicketOverviewCapabilities + { + TicketAndServiceRequestsEnabled = enabled + }; + } } private sealed class FakeDispatcher : ITicketOverviewDispatcher diff --git a/FasdCockpitBase/F4SD-Cockpit-Client-Base.csproj b/FasdCockpitBase/F4SD-Cockpit-Client-Base.csproj index aff7835..b402e95 100644 --- a/FasdCockpitBase/F4SD-Cockpit-Client-Base.csproj +++ b/FasdCockpitBase/F4SD-Cockpit-Client-Base.csproj @@ -163,6 +163,7 @@ + @@ -183,4 +184,4 @@ - \ No newline at end of file + diff --git a/FasdCockpitBase/FasdCockpitCommunicationBase.cs b/FasdCockpitBase/FasdCockpitCommunicationBase.cs index f1a47a2..eb4a7c9 100644 --- a/FasdCockpitBase/FasdCockpitCommunicationBase.cs +++ b/FasdCockpitBase/FasdCockpitCommunicationBase.cs @@ -73,7 +73,7 @@ namespace C4IT.FASD.Cockpit.Communication #region Ticketübersicht public abstract Task> GetTicketOverviewRelations(string key, bool useRoleScope, int count); - public abstract Task> GetTicketOverviewCounts(IEnumerable keys, bool useRoleScope); + public abstract Task GetTicketOverviewCounts(IEnumerable keys, bool useRoleScope); #endregion diff --git a/FasdCockpitBase/Models/TicketOverview/TicketOverviewCountsResult.cs b/FasdCockpitBase/Models/TicketOverview/TicketOverviewCountsResult.cs new file mode 100644 index 0000000..5033700 --- /dev/null +++ b/FasdCockpitBase/Models/TicketOverview/TicketOverviewCountsResult.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace C4IT.FASD.Cockpit.Communication +{ + public sealed class cF4sdTicketOverviewCountsResult + { + public Dictionary Counts { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public cF4sdTicketOverviewCapabilities Capabilities { get; set; } = new cF4sdTicketOverviewCapabilities(); + } + + public sealed class cF4sdTicketOverviewCapabilities + { + public bool TicketAndServiceRequestsEnabled { get; set; } = true; + } +} diff --git a/FasdCockpitCommunication/FasdCockpitCommunicationWeb.cs b/FasdCockpitCommunication/FasdCockpitCommunicationWeb.cs index 975f7e3..aa53cff 100644 --- a/FasdCockpitCommunication/FasdCockpitCommunicationWeb.cs +++ b/FasdCockpitCommunication/FasdCockpitCommunicationWeb.cs @@ -1147,7 +1147,7 @@ namespace C4IT.FASD.Cockpit.Communication #region Ticketübersicht - public override async Task> GetTicketOverviewCounts(IEnumerable keys, bool useRoleScope) + public override async Task GetTicketOverviewCounts(IEnumerable keys, bool useRoleScope) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); @@ -1182,13 +1182,13 @@ namespace C4IT.FASD.Cockpit.Communication await CheckConnectionStatus.Invoke(); LogEntry($"Error on requesting ticket overview counts ({scope}). Status: {result.Status}", LogLevels.Warning); - return new Dictionary(StringComparer.OrdinalIgnoreCase); + return new cF4sdTicketOverviewCountsResult(); } if (Debug_apiValues) SaveApiResultValueJson("TicketOverview.GetCounts", result.Result, url); var response = JsonConvert.DeserializeObject(result.Result); - return response?.ToDictionary(normalizedKeys) ?? new Dictionary(StringComparer.OrdinalIgnoreCase); + return response?.ToResult(normalizedKeys) ?? new cF4sdTicketOverviewCountsResult(); } catch (Exception E) { @@ -1204,7 +1204,7 @@ namespace C4IT.FASD.Cockpit.Communication LogMethodEnd(CM); } - return new Dictionary(StringComparer.OrdinalIgnoreCase); + return new cF4sdTicketOverviewCountsResult(); } public override async Task> GetTicketOverviewRelations(string key, bool useRoleScope, int count) diff --git a/FasdCockpitCommunication/TicketOverview/TicketOverviewCountsResponse.cs b/FasdCockpitCommunication/TicketOverview/TicketOverviewCountsResponse.cs index 5dd3c83..ccf0be2 100644 --- a/FasdCockpitCommunication/TicketOverview/TicketOverviewCountsResponse.cs +++ b/FasdCockpitCommunication/TicketOverview/TicketOverviewCountsResponse.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; +using C4IT.FASD.Cockpit.Communication; using Newtonsoft.Json; namespace FasdCockpitCommunication.TicketOverview @@ -10,7 +11,10 @@ namespace FasdCockpitCommunication.TicketOverview [JsonProperty("counts")] public Dictionary Counts { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - public Dictionary ToDictionary(IEnumerable expectedKeys) + [JsonProperty("capabilities")] + public TicketOverviewCapabilitiesResponse Capabilities { get; set; } = new TicketOverviewCapabilitiesResponse(); + + public cF4sdTicketOverviewCountsResult ToResult(IEnumerable expectedKeys) { var comparer = StringComparer.OrdinalIgnoreCase; var output = new Dictionary(comparer); @@ -28,7 +32,7 @@ namespace FasdCockpitCommunication.TicketOverview output[key] = 0; } - return output; + return CreateResult(output); } if (Counts != null) @@ -42,7 +46,25 @@ namespace FasdCockpitCommunication.TicketOverview } } - return output; + return CreateResult(output); + } + + private cF4sdTicketOverviewCountsResult CreateResult(Dictionary counts) + { + return new cF4sdTicketOverviewCountsResult + { + Counts = counts, + Capabilities = new cF4sdTicketOverviewCapabilities + { + TicketAndServiceRequestsEnabled = Capabilities?.TicketAndServiceRequestsEnabled ?? true + } + }; } } + + internal sealed class TicketOverviewCapabilitiesResponse + { + [JsonProperty("ticketAndServiceRequestsEnabled")] + public bool TicketAndServiceRequestsEnabled { get; set; } = true; + } } diff --git a/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs b/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs index 297256f..0177ecf 100644 --- a/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs +++ b/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs @@ -268,7 +268,7 @@ namespace C4IT.FASD.Cockpit.Communication return ticket; } - public override Task> GetTicketOverviewCounts(IEnumerable keys, bool useRoleScope) + public override Task GetTicketOverviewCounts(IEnumerable keys, bool useRoleScope) { var scopeKey = useRoleScope ? "Role" : "Personal"; var comparer = StringComparer.OrdinalIgnoreCase; @@ -286,12 +286,6 @@ namespace C4IT.FASD.Cockpit.Communication if (string.IsNullOrWhiteSpace(key)) continue; - if (string.Equals(key, "TicketAndServiceRequestsEnabled", StringComparison.OrdinalIgnoreCase)) - { - result[key] = 1; - continue; - } - if (TicketOverviewRelations.TryGetValue(key, out var scopeDictionary) && scopeDictionary != null && scopeDictionary.TryGetValue(scopeKey, out var definitions) && @@ -305,7 +299,10 @@ namespace C4IT.FASD.Cockpit.Communication } } - return Task.FromResult(result); + return Task.FromResult(new cF4sdTicketOverviewCountsResult + { + Counts = result + }); } public override async Task> GetTicketOverviewRelations(string key, bool useRoleScope, int count) diff --git a/FasdDesktopUi/Basics/Services/Models/TicketOverviewCommunicationSource.cs b/FasdDesktopUi/Basics/Services/Models/TicketOverviewCommunicationSource.cs index 7bb7bc4..d3aafb3 100644 --- a/FasdDesktopUi/Basics/Services/Models/TicketOverviewCommunicationSource.cs +++ b/FasdDesktopUi/Basics/Services/Models/TicketOverviewCommunicationSource.cs @@ -12,7 +12,7 @@ namespace FasdDesktopUi.Basics.Services.Models { bool IsDemo(); - Task> GetTicketOverviewCounts(string[] overviewKeys, bool useRoleScope); + Task GetTicketOverviewCounts(string[] overviewKeys, bool useRoleScope); #if isDemo void RegisterGeneratedTicket(DemoTicketRecord record); @@ -47,12 +47,15 @@ namespace FasdDesktopUi.Basics.Services.Models return _communication.IsDemo(); } - public async Task> GetTicketOverviewCounts(string[] overviewKeys, bool useRoleScope) + public async Task GetTicketOverviewCounts(string[] overviewKeys, bool useRoleScope) { - var rawCounts = await _communication.GetTicketOverviewCounts(overviewKeys, useRoleScope).ConfigureAwait(false); - return rawCounts == null + var result = await _communication.GetTicketOverviewCounts(overviewKeys, useRoleScope).ConfigureAwait(false) + ?? new cF4sdTicketOverviewCountsResult(); + result.Counts = result.Counts == null ? new Dictionary(StringComparer.OrdinalIgnoreCase) - : new Dictionary(rawCounts, StringComparer.OrdinalIgnoreCase); + : new Dictionary(result.Counts, StringComparer.OrdinalIgnoreCase); + result.Capabilities = result.Capabilities ?? new cF4sdTicketOverviewCapabilities(); + return result; } #if isDemo diff --git a/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs b/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs index 94a5486..2b06bc6 100644 --- a/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs +++ b/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs @@ -24,7 +24,6 @@ namespace FasdDesktopUi.Basics.Services { #region Fields - private const string TicketAndServiceRequestsEnabledKey = "TicketAndServiceRequestsEnabled"; private const bool TicketAndServiceRequestsEnabledDefault = true; private readonly ITicketOverviewCommunicationSource _communicationSource; private static readonly string[] OverviewKeys = new[] @@ -339,12 +338,11 @@ namespace FasdDesktopUi.Basics.Services _isDemo = communication.IsDemo(); - var requestedKeys = scope == TileScope.Personal - ? OverviewKeys.Concat(new[] { TicketAndServiceRequestsEnabledKey }).ToArray() - : OverviewKeys; - var rawCounts = await communication.GetTicketOverviewCounts(requestedKeys, scope == TileScope.Role).ConfigureAwait(false); + var result = await communication.GetTicketOverviewCounts(OverviewKeys, scope == TileScope.Role).ConfigureAwait(false); + var rawCounts = result?.Counts; var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); - var ticketAndServiceRequestsEnabled = TicketAndServiceRequestsEnabledDefault; + var ticketAndServiceRequestsEnabled = + result?.Capabilities?.TicketAndServiceRequestsEnabled ?? TicketAndServiceRequestsEnabledDefault; if (rawCounts != null) { @@ -353,13 +351,6 @@ namespace FasdDesktopUi.Basics.Services if (string.IsNullOrWhiteSpace(kvp.Key)) continue; - if (string.Equals(kvp.Key, TicketAndServiceRequestsEnabledKey, StringComparison.OrdinalIgnoreCase)) - { - if (scope == TileScope.Personal) - ticketAndServiceRequestsEnabled = _isDemo || kvp.Value > 0; - continue; - } - counts[kvp.Key] = Math.Max(0, kvp.Value); } }