using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.IO; using System.Threading.Tasks; using System.Threading; using System.Diagnostics; using Newtonsoft.Json; using FasdCockpitBase.Models; using FasdCockpitCommunicationDemo; using C4IT.FASD.Base; using static C4IT.Logging.cLogManager; using FasdCockpitBase; using C4IT.Logging; namespace C4IT.FASD.Cockpit.Communication { public class cFasdCockpitCommunicationDemo : cFasdCockpitCommunicationBase { private int ticketCounter = 475; private readonly List MockupData = new List(); private readonly Dictionary MockupPickup = new Dictionary(); private readonly Dictionary>> TicketOverviewRelations = new Dictionary>>(StringComparer.OrdinalIgnoreCase); private readonly HashSet _generatedTicketIds = new HashSet(); private readonly object _demoTicketSync = new object(); private const string DemoTicketHasDetailsInfoKey = "Demo.HasTicketDetails"; public cFasdCockpitCommunicationDemo() { if (LoadMockupData(out var loadedData)) MockupData = loadedData; MockupPickup = LoadMockupPickup(); LoadTicketOverviewRelations(); LoadGeneratedTickets(); } public override bool IsDemo() => true; private Dictionary SearchCache = new Dictionary(); private Dictionary LoadMockupPickup() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { var pickupData = new Dictionary(); string executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string path = Path.Combine(executingDirectory, "MockupPickup"); var sampleDataFiles = Directory.GetFiles(path); foreach (var file in sampleDataFiles) { if (string.Equals(Path.GetFileName(file), "TicketOverviewRelations.json", StringComparison.OrdinalIgnoreCase)) continue; try { string jsonText; using (StreamReader streamReader = new StreamReader(file)) { jsonText = streamReader.ReadToEnd(); } var newRawData = JsonConvert.DeserializeObject(jsonText); pickupData[newRawData.Name] = newRawData; } catch (Exception E) { LogException(E); } } return pickupData; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return null; } private void LoadTicketOverviewRelations() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { TicketOverviewRelations.Clear(); string executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string filePath = Path.Combine(executingDirectory, "MockupTicketOverview", "TicketOverviewRelations.json"); if (!File.Exists(filePath)) { LogEntry($"Ticket overview demo data missing at {filePath}", LogLevels.Warning); return; } string jsonText; using (StreamReader streamReader = new StreamReader(filePath)) { jsonText = streamReader.ReadToEnd(); } var rawData = JsonConvert.DeserializeObject>>>(jsonText); if (rawData == null) return; foreach (var tileEntry in rawData) { var scopeDictionary = new Dictionary>(StringComparer.OrdinalIgnoreCase); if (tileEntry.Value != null) { foreach (var scopeEntry in tileEntry.Value) { scopeDictionary[scopeEntry.Key ?? string.Empty] = scopeEntry.Value ?? new List(); } } TicketOverviewRelations[tileEntry.Key] = scopeDictionary; } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } } private void LoadGeneratedTickets() { try { var records = TicketOverviewDataStore.LoadTickets(); foreach (var record in records) { AppendDemoTicket(record); } } catch (Exception E) { LogException(E); } } public void RegisterGeneratedTicket(DemoTicketRecord record) { try { AppendDemoTicket(record); } catch (Exception E) { LogException(E); } } private void AppendDemoTicket(DemoTicketRecord record) { if (record == null) return; lock (_demoTicketSync) { if (!_generatedTicketIds.Add(record.TicketId)) return; var scopeKey = record.UseRoleScope ? "Role" : "Personal"; if (!TicketOverviewRelations.TryGetValue(record.TileKey, out var scopeDictionary)) { scopeDictionary = new Dictionary>(StringComparer.OrdinalIgnoreCase); TicketOverviewRelations[record.TileKey] = scopeDictionary; } if (!scopeDictionary.TryGetValue(scopeKey, out var definitions)) { definitions = new List(); scopeDictionary[scopeKey] = definitions; } if (!definitions.Any(d => d.TicketId == record.TicketId)) { definitions.Add(new TicketOverviewRelationDefinition { TicketId = record.TicketId, UserId = record.UserId, DisplayName = record.DisplayName, Summary = record.Summary, StatusId = record.StatusId, UserDisplayName = record.UserDisplayName, UserAccount = record.UserAccount, UserDomain = record.UserDomain }); } var targetSample = MockupData.FirstOrDefault(data => data.SampleDataId == record.UserId); if (targetSample == null) return; if (targetSample.Tickets.Any(ticket => ticket.Id == record.TicketId)) return; var generatedTicket = ConvertToTicket(record); targetSample.Tickets.Add(generatedTicket); } } private static cF4SDTicket ConvertToTicket(DemoTicketRecord record) { var status = enumTicketStatus.New; if (!string.IsNullOrWhiteSpace(record.StatusId) && Enum.TryParse(record.StatusId, true, out enumTicketStatus parsedStatus)) status = parsedStatus; var detail = record.Detail ?? new DemoTicketDetail(); var createdAt = record.CreatedAt == default ? DateTime.UtcNow : record.CreatedAt; var ticket = new cF4SDTicket { Id = record.TicketId, Name = record.DisplayName, Summary = record.Summary, Status = status, AffectedUser = detail.AffectedUser ?? record.UserDisplayName, Asset = detail.Asset, Category = detail.Category, Classification = detail.Classification, Description = detail.Description, DescriptionHtml = detail.DescriptionHtml, Solution = detail.Solution, SolutionHtml = detail.SolutionHtml, CreationDate = createdAt.ToLocalTime(), CreationDaysSinceNow = Math.Max(0, (int)(DateTime.UtcNow - createdAt).TotalDays), Priority = detail.Priority ?? 0, CreationSource = cF4SDTicket.enumTicketCreationSource.F4SD, DirectLinks = new Dictionary(), JournalItems = new List() }; if (detail.Journal != null) { foreach (var entry in detail.Journal) { var journalCreation = entry?.CreationDate ?? createdAt; ticket.JournalItems.Add(new cF4SDTicket.cTicketJournalItem { Header = entry.Header, Description = entry.Description, DescriptionHtml = entry.DescriptionHtml, IsVisibleForUser = entry.IsVisibleForUser, CreationDate = journalCreation.ToLocalTime(), CreationDaysSinceNow = Math.Max(0, (int)(DateTime.UtcNow - journalCreation).TotalDays) }); } } return ticket; } public override async Task> GetTicketOverviewRelations(string key, bool useRoleScope, int count) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { if (string.IsNullOrWhiteSpace(key)) { await SimulateTicketOverviewLatencyAsync(count); return new List(); } var scopeKey = useRoleScope ? "Role" : "Personal"; if (!TicketOverviewRelations.TryGetValue(key, out var scopeData) || scopeData == null) { await SimulateTicketOverviewLatencyAsync(count); return new List(); } if (!scopeData.TryGetValue(scopeKey, out var definitions) || definitions == null || definitions.Count == 0) { await SimulateTicketOverviewLatencyAsync(count); return new List(); } int requestedCount = count <= 0 ? definitions.Count : Math.Min(count, definitions.Count); await SimulateTicketOverviewLatencyAsync(requestedCount); var relations = new List(requestedCount); foreach (var definition in definitions.Take(requestedCount)) { var relation = new cF4sdApiSearchResultRelation { Type = enumF4sdSearchResultClass.Ticket, DisplayName = definition.DisplayName ?? string.Empty, Name = definition.DisplayName ?? string.Empty, id = definition.TicketId, Status = enumF4sdSearchResultStatus.Active, Infos = new Dictionary { ["Summary"] = definition.Summary ?? string.Empty, ["StatusId"] = definition.StatusId ?? string.Empty, ["UserDisplayName"] = definition.UserDisplayName ?? string.Empty, ["UserAccount"] = definition.UserAccount ?? string.Empty, ["UserDomain"] = definition.UserDomain ?? string.Empty, [DemoTicketHasDetailsInfoKey] = HasTicketDetails(definition.TicketId).ToString() }, Identities = new cF4sdIdentityList { new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = definition.TicketId }, new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = definition.UserId } } }; relations.Add(relation); } return relations; } catch (Exception E) { LogException(E); return new List(); } finally { LogMethodEnd(CM); } } private bool HasTicketDetails(Guid ticketId) { if (ticketId == Guid.Empty) return false; foreach (var sample in MockupData) { var tickets = sample?.Tickets; if (tickets == null) continue; foreach (var ticket in tickets) { if (ticket?.Id == ticketId) return true; } } return false; } private static Task SimulateTicketOverviewLatencyAsync(int count) { int baseMs = 420; int perItem = 100; int capped = Math.Max(0, Math.Min(count, 5)); int delay = Math.Max(240, Math.Min(baseMs + capped * perItem, 2000)); return Task.Delay(delay); } private bool LoadMockupData(out List sampleData) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); sampleData = new List(); try { string executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string path = executingDirectory + @"\MockupData"; var sampleDataFiles = Directory.GetFiles(path); foreach (var file in sampleDataFiles) { try { using (var streamReader = new StreamReader(file)) { string jsonText = streamReader.ReadToEnd(); var newRawData = JsonConvert.DeserializeObject(jsonText); if (newRawData == null || string.IsNullOrWhiteSpace(newRawData.SampleDataName)) { LogEntry($"Skip mockup data '{Path.GetFileName(file)}' because SampleDataName is missing.", LogLevels.Warning); continue; } sampleData.Add(newRawData); } } catch (Exception E) { LogException(E); } } return true; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return false; } public override bool CheckConnectionInfo() => true; public override async Task CheckConnection(Version minServerVersion) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { await Task.CompletedTask; var output = new cCheckConnectionResult() { ConnectionStatus = enumConnectionStatus.connected }; output.ApiConnectionInfo = new cFasdApiConnectionInfo() { ServerVersion = "1.0.0.0", MinCockpitVersion = "0.0.0.0" }; return output; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return null; } public override Task GetUserIdByAccount(string userName, string userDomain) => Task.FromResult(Guid.NewGuid()); public async override Task WinLogon() { await Task.CompletedTask; var _retVal = new cF4sdUserInfo() { Id = Guid.NewGuid(), Name = "Demo", LogonTime = DateTime.UtcNow, AccountType = cF4sdUserInfo.enumAccountType.AdUser, AdAccount = "demo", Roles = new List() { "Cockpit.User", "Cockpit.Admin", "Cockpit.TicketAgent" } }; return _retVal; } public override Task RegisterExternalTokenAsync(cF4SDTokenRegistration Token) => Task.FromResult(null); public override Task GetAdditionalUserInfo(enumAdditionalAuthentication Type) => Task.FromResult(null); public override Task IsAnalyticsModuleActive() => Task.FromResult(false); public override Task CreateUserSession(cF4SDUserSessionParameters sessionParameters) => Task.FromResult(true); public override Task CloseUserSession(Guid sessionId) => Task.CompletedTask; public override Task StartCase(cF4SDCaseParameters caseParameters) => Task.FromResult(true); public override Task UpdateCase(cF4SDCaseStatusParameters caseStatusParameters, List caseTimes) => Task.FromResult(true); public override Task ReportQuickAction(cF4SDQuickActionParameters quickActionParameters) => Task.FromResult(true); public override Task KeepAliveCase(Guid caseId) => Task.FromResult(true); public override Task KeepAliveSession(Guid sessionId) => Task.FromResult(true); public override Task GetConfiguration(enumFasdConfigurationType configType) => Task.FromResult(cFasdBaseConfig.GetConfigByType(configType, ReadOnly: true)); //public override async Task GetSearchResultsDetailed(string searchValue, int charactersToTypeForSearch, CancellationToken cancellationToken) //{ // var CM = MethodBase.GetCurrentMethod(); // LogMethodBegin(CM); // try // { // var output = new cFasdApiSearchResultCollection(); // //if (searchValue.ToCharArray().Length < charactersToTypeForSearch) // // return output; // foreach (var data in MockupData) // { // if (data.SampleDataName.ToLowerInvariant().Contains(searchValue.ToLowerInvariant())) // { // //todo: add a field in demo data // var searchResultClass = enumF4sdSearchResultClass.User; // if (data.SampleDataId.ToString() == "2897b20b-9457-49f0-a078-6cb2ac241ab2") // searchResultClass = enumF4sdSearchResultClass.Computer; // output[data.SampleDataName] = new List() { new cFasdApiSearchResultEntry() { id = data.SampleDataId, Name = data.SampleDataName, Type = searchResultClass } }; // } // } // return output; // } // catch (Exception E) // { // LogException(E); // } // finally // { // LogMethodEnd(CM); // } // await Task.CompletedTask; // return null; //} public override async Task GetSearchResultsStart(string searchValue, CancellationToken cancellationToken) { await Task.CompletedTask; var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { var output = new cFasdApiSearchResultCollection(); //if (searchValue.ToCharArray().Length < charactersToTypeForSearch) // return output; foreach (var data in MockupData) { if (data.SampleDataName.ToLowerInvariant().Contains(searchValue.ToLowerInvariant())) { //todo: add a field in demo data var searchResultClass = enumF4sdSearchResultClass.User; if (data.SampleDataId.ToString() == "2897b20b-9457-49f0-a078-6cb2ac241ab2") searchResultClass = enumF4sdSearchResultClass.Computer; output[data.SampleDataName] = new List() { new cFasdApiSearchResultEntry() { id = data.SampleDataId, Name = data.SampleDataName, DisplayName = data.SampleDataName, Type = searchResultClass } }; } } var newID = Guid.NewGuid(); SearchCache[newID] = output; return newID; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } await Task.CompletedTask; return null; } public override async Task GetSearchResultsResult(Guid taskID, CancellationToken cancellationToken) { await Task.CompletedTask; if (SearchCache.TryGetValue(taskID, out var _result)) { SearchCache.Remove(taskID); return _result; } return null; } public override Task GetSearchResultsStop(Guid taskID, CancellationToken cancellationToken) => Task.CompletedTask; public override async Task GetPhoneSearchResults(cPhoneSearchParameters searchInfo) { var output = new cFasdApiSearchResultCollection(); try { foreach (var data in MockupData) { if (data.SampleDataName.Equals(searchInfo.name, StringComparison.InvariantCultureIgnoreCase)) { var searchResultClass = enumF4sdSearchResultClass.Phone; output[data.SampleDataName] = new List() { new cFasdApiSearchResultEntry() { id = data.SampleDataId, Name = data.SampleDataName, DisplayName = data.SampleDataName, Type = searchResultClass } }; } } await Task.CompletedTask; } catch (Exception E) { LogException(E); } return output; } public override async Task GetComputerSearchResults(string Name, string Domain) { var output = new cFasdApiSearchResultCollection(); try { foreach (var data in MockupData) { var computerName = data.Tables.FirstOrDefault(table => table.Name == "agnt-computer")?.Columns.FirstOrDefault(column => column.ColumnName == "Name")?.Values[0]; if (computerName != null && computerName.ToString().Equals(Name, StringComparison.InvariantCultureIgnoreCase)) { var searchResultClass = enumF4sdSearchResultClass.Computer; output[computerName.ToString()] = new List() { new cFasdApiSearchResultEntry() { id = computerName.ToString().Equals("C4-TT007") ? Guid.Parse("2CC166CF-F1F1-4473-A7CD-0471E088CA3C") : Guid.NewGuid(), Name = data.SampleDataName, DisplayName = computerName.ToString(), Type = searchResultClass } }; } } await Task.CompletedTask; } catch (Exception E) { LogException(E); } return output; } public override async Task GetUserSearchResults(string Name, List SIDs) { var output = new cFasdApiSearchResultCollection(); try { foreach (var data in MockupData) { if (data.SampleDataName.Equals(Name, StringComparison.InvariantCultureIgnoreCase)) { //todo: add a field in demo data var searchResultClass = enumF4sdSearchResultClass.User; output[data.SampleDataName] = new List() { new cFasdApiSearchResultEntry() { id = data.SampleDataId, Name = data.SampleDataName, DisplayName = data.SampleDataName, Type = searchResultClass } }; } } await Task.CompletedTask; } catch (Exception E) { LogException(E); } return output; } public override async Task> GetSearchResultRelations(enumF4sdSearchResultClass resultType, List searchResults) { const string constGuidPeterAnwender = "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b"; const string constGuidCarlos = "6180aa17-ba2d-455a-bf2f-ec4a075c2d64"; const string constGuidCarlKriminell = "a642bf1e-1fc1-4ba1-8db1-a93531da80a5"; const string constGuidFraukeNichtAnwender = "2183284f-ba95-4eb8-ac13-6c2f70857e98"; const string constGuidTimoTicket = "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a"; const string constGuidTimoTicketComputer = "2cc166cf-f1f1-4473-a7cd-0471e088ca3c"; const string constGuidComputer = "2897b20b-9457-49f0-a078-6cb2ac241ab2"; const string constGuidPaulPerschmann = "8c3ca0fb-f18c-4893-ad83-290e6e02f352"; const string constGuidVeraVirtuell = "916db36b-fb6e-4212-81c1-e72acdab77d2"; const string constGuidOlliOffline = "75b68176-4397-49c1-aaee-e023675bcd56"; const string constGuidMischaMobile = "6a3d4e89-a7ad-4a48-95fa-8cde4dd50c80"; var resultIds = searchResults.Select(resultData => resultData.id).ToList(); var output = new List(); switch (resultIds.First().ToString()) { case constGuidOlliOffline: // Olli Offline output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-NB005", DisplayName = "C4-NB005", Infos = new Dictionary() { ["UserAccountType"] = "AD", ["UserAccount"] = "C4-NB005", ["UserDomain"] = "C4IT" }, LastUsed = DateTime.UtcNow.AddDays(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.Parse(constGuidOlliOffline) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.Parse(constGuidOlliOffline), Name = "VM-W11MS02", DisplayName = "VM-W11MS02", LastUsed = DateTime.UtcNow.AddDays(-1), Type = enumF4sdSearchResultClass.VirtualSession, UsingLevel = 1, Status = enumF4sdSearchResultStatus.Inactive, Infos = new Dictionary() { ["Status"] = enumF4sdSearchResultStatus.Inactive.ToString() }, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidOlliOffline) }, new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.VirtualSession, Id = Guid.Parse(constGuidOlliOffline) } } }); break; case constGuidVeraVirtuell: // Vera Virtuell output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-NB005", DisplayName = "C4-NB005", Infos = new Dictionary() { ["UserAccountType"] = "AD", ["UserAccount"] = "C4-NB005", ["UserDomain"] = "C4IT" }, LastUsed = DateTime.UtcNow.AddDays(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.Parse(constGuidVeraVirtuell) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.Parse(constGuidVeraVirtuell), Name = "VM-W11MS03", DisplayName = "VM-W11MS03", LastUsed = DateTime.UtcNow, Type = enumF4sdSearchResultClass.VirtualSession, UsingLevel = 1, Status = enumF4sdSearchResultStatus.Active, Infos = new Dictionary() { ["Status"] = enumF4sdSearchResultStatus.Active.ToString() }, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.VirtualSession, Id = Guid.Parse(constGuidVeraVirtuell) }, new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidVeraVirtuell) } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.Parse(constGuidVeraVirtuell), Name = "VM-W11MS04", DisplayName = "VM-W11MS04", LastUsed = DateTime.UtcNow.AddDays(-2), Type = enumF4sdSearchResultClass.VirtualSession, UsingLevel = 0.2, Status = enumF4sdSearchResultStatus.Inactive, Infos = new Dictionary() { ["Status"] = enumF4sdSearchResultStatus.Inactive.ToString() }, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.VirtualSession, Id = Guid.Parse(constGuidVeraVirtuell) }, new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidVeraVirtuell) } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.Parse(constGuidVeraVirtuell), Name = "VM-W11MS05", DisplayName = "VM-W11MS05", LastUsed = DateTime.UtcNow.AddDays(-5), Type = enumF4sdSearchResultClass.VirtualSession, UsingLevel = 0.14, Status = enumF4sdSearchResultStatus.Inactive, Infos = new Dictionary() { ["Status"] = enumF4sdSearchResultStatus.Inactive.ToString() }, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.VirtualSession, Id = Guid.Parse(constGuidVeraVirtuell) }, new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidVeraVirtuell) } } }); break; case constGuidPeterAnwender: // Peter Anwender output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-AP00007", DisplayName = "C4-AP00007", Infos = new Dictionary() { ["UserAccountType"] = "AD", ["UserAccount"] = "AP007", ["UserDomain"] = "C4IT" }, LastUsed = DateTime.UtcNow.AddSeconds(-31), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidPeterAnwender) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-NB00107", DisplayName = "C4-NB00107", Infos = new Dictionary() { ["UserAccountType"] = "AD", ["UserAccount"] = "AP007", ["UserDomain"] = "C4IT-old" }, LastUsed = DateTime.UtcNow.AddDays(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 0.2, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidPeterAnwender) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-NB00015", DisplayName = "C4-NB00015", Infos = new Dictionary() { ["UserAccountType"] = "Local", ["UserAccount"] = "AP007" }, LastUsed = DateTime.UtcNow.AddHours(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 0.6, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidPeterAnwender) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); break; case constGuidMischaMobile: // Mischa MObile output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-MM007", DisplayName = "C4-MM007", Infos = new Dictionary() { ["UserAccountType"] = "AD", ["UserAccount"] = "AP007", ["UserDomain"] = "C4IT" }, LastUsed = DateTime.UtcNow.AddSeconds(-31), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.Parse(constGuidMischaMobile) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-NB005", DisplayName = "C4-NB005", Infos = new Dictionary() { ["UserAccountType"] = "AD", ["UserAccount"] = "C4-NB005", ["UserDomain"] = "C4IT" }, LastUsed = DateTime.UtcNow.AddDays(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.Parse(constGuidMischaMobile) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "IPad-C7JXH5B69P", DisplayName = "IPad-C7JXH5B69P", LastUsed = DateTime.UtcNow.AddHours(-3), Type = enumF4sdSearchResultClass.MobileDevice, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidMischaMobile) }, new cF4sdIdentityEntry(){ Class = enumFasdInformationClass.MobileDevice, Id = Guid.NewGuid() } } }); break; case constGuidCarlos: // Carlos case constGuidPaulPerschmann: // Paul Perschmann output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "VM-PP00123", DisplayName = "VM-PP00123", LastUsed = DateTime.UtcNow.AddDays(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = resultIds.First() }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "VM-PP00124", DisplayName = "VM-PP00124", LastUsed = DateTime.UtcNow.AddDays(-5), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = resultIds.First() }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "VM-PP00125", DisplayName = "VM-PP00125", LastUsed = DateTime.UtcNow.AddDays(-31), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = resultIds.First() }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "Client-PP1003", DisplayName = "Client-PP1003", LastUsed = DateTime.UtcNow, Type = enumF4sdSearchResultClass.User, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = resultIds.First() }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); break; case constGuidCarlKriminell: output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-CK007", DisplayName = "C4-CK007", LastUsed = DateTime.UtcNow, Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = resultIds.First() }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); break; case constGuidTimoTicket: output.Add(new cF4sdApiSearchResultRelation() { id = Guid.Parse(constGuidTimoTicketComputer), Name = "C4-TT007", DisplayName = "C4-TT007", LastUsed = DateTime.UtcNow.AddSeconds(-31), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.Parse(constGuidTimoTicketComputer) } } }); output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4-NB00015", DisplayName = "C4-NB00015", LastUsed = DateTime.UtcNow.AddHours(-10), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 0.6, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); var demoTickets = await GetDemoTicketData(new cF4sdHealthCardRawDataRequest() { Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); foreach (var demoTicket in demoTickets) { output.Add(new cF4sdApiSearchResultRelation() { id = demoTicket.Id, Name = demoTicket.Name, DisplayName = demoTicket.Name, Infos = new Dictionary() { ["Summary"] = demoTicket.Summary, ["StatusId"] = ((int)demoTicket.Status).ToString(), ["Asset"] = demoTicket.Asset }, Type = enumF4sdSearchResultClass.Ticket, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Ticket, Id = demoTicket.Id } } }); } break; case constGuidTimoTicketComputer: output.Add(new cF4sdApiSearchResultRelation() { id = Guid.Parse(constGuidTimoTicketComputer), Name = "C4-TT007", DisplayName = "C4-TT007", LastUsed = DateTime.UtcNow.AddSeconds(-31), Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.Parse(constGuidTimoTicketComputer) } } }); break; case constGuidFraukeNichtAnwender: // Frauke Nicht Anwender case constGuidComputer: // Computer break; default: output.Add(new cF4sdApiSearchResultRelation() { id = Guid.NewGuid(), Name = "C4IT-007", DisplayName = "C4IT-007", LastUsed = DateTime.UtcNow, Type = enumF4sdSearchResultClass.Computer, UsingLevel = 1, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = resultIds.First() }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); break; } await Task.CompletedTask; output = output.OrderByDescending(relation => relation.LastUsed).ToList(); return output; } public override async Task GetHealthCardData(cF4sdHealthCardRawDataRequest requestData) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); var output = new cF4SDHealthCardRawData(); try { await Task.Delay(250); var selectedData = MockupData.FirstOrDefault(data => requestData.Identities.Any(identity => identity.Id == data.SampleDataId)); if (selectedData is null) return output; output = selectedData.GetHealthCardData(); var ticketRequest = requestData.Identities.FirstOrDefault(data => data.Class is enumFasdInformationClass.Ticket); if (ticketRequest != null) { var selectedTicket = selectedData.Tickets.FirstOrDefault(ticket => ticket.Id == ticketRequest.Id); if (selectedTicket != null) { string ticketStatusString = string.Empty; switch (selectedTicket.Status) { case enumTicketStatus.Unknown: ticketStatusString = "Unbekannt"; break; case enumTicketStatus.New: ticketStatusString = "Neu"; break; case enumTicketStatus.InProgress: ticketStatusString = "Offen"; break; case enumTicketStatus.Closed: ticketStatusString = "Geschlossen"; break; } output.Tables["M42Wpm-Tickets"] = new cF4SDHealthCardRawData.cHealthCardTable() { Name = "M42Wpm-Tickets", InformationClass = enumFasdInformationClass.Ticket, IsStatic = true, Columns = new Dictionary() { ["name"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Name } }, ["Status"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { ticketStatusString } }, ["Priority"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Priority } }, ["AffectedUser"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.AffectedUser } }, ["AssetName"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Asset } }, ["CreationDaysSinceNow"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.CreationDaysSinceNow } }, ["CreationDate"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.CreationDate.ToUniversalTime() } }, ["ClosingDaysSinceNow"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.ClosingDaysSinceNow } }, ["ClosingDate"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.ClosingDate } }, ["Category"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Category } }, ["CreationSource"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.CreationSource.ToString() } }, ["Description"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Description?.ToString() } }, ["DescriptionHtml"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.DescriptionHtml?.ToString() } }, ["Summary"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Summary.ToString() } }, ["Solution"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.Solution?.ToString() } }, ["SolutionHtml"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { Values = new List() { selectedTicket.SolutionHtml?.ToString() } }, } }; output.Tables["M42Wpm-Ticket-History"] = new cF4SDHealthCardRawData.cHealthCardTable() { Name = "M42Wpm-Ticket-History", InformationClass = enumFasdInformationClass.Ticket, IsStatic = false, Columns = new Dictionary() { ["Header"] = new cF4SDHealthCardRawData.cHealthCardTableColumn(), ["IsVisibleForUser"] = new cF4SDHealthCardRawData.cHealthCardTableColumn(), ["CreationDaysSinceNow"] = new cF4SDHealthCardRawData.cHealthCardTableColumn(), ["time"] = new cF4SDHealthCardRawData.cHealthCardTableColumn(), ["Description"] = new cF4SDHealthCardRawData.cHealthCardTableColumn(), ["DescriptionHtml"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() } }; foreach (var journalItem in selectedTicket.JournalItems) { output.Tables["M42Wpm-Ticket-History"].Columns["Header"].Values.Add(journalItem.Header); output.Tables["M42Wpm-Ticket-History"].Columns["IsVisibleForUser"].Values.Add(journalItem.IsVisibleForUser); output.Tables["M42Wpm-Ticket-History"].Columns["CreationDaysSinceNow"].Values.Add(journalItem.CreationDaysSinceNow); output.Tables["M42Wpm-Ticket-History"].Columns["time"].Values.Add(journalItem.CreationDate.ToUniversalTime()); output.Tables["M42Wpm-Ticket-History"].Columns["Description"].Values.Add(journalItem.Description); output.Tables["M42Wpm-Ticket-History"].Columns["DescriptionHtml"].Values.Add(journalItem.DescriptionHtml); } foreach (var directLink in selectedTicket.DirectLinks) { output.Tables["M42Wpm-Tickets"].Columns[directLink.Key] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { ColumnName = directLink.Key, IsIncomplete = false, Values = new List() { directLink.Value } }; } } } output.Tables.Add("sequenceTable", new cF4SDHealthCardRawData.cHealthCardTable() { IsIncomplete = true, IsStatic = false, StartingIndex = 7, Columns = new Dictionary() { ["sequenceColumn"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { ColumnName = "sequenceColumn", Values = new List() { 1, 0 } } } }); output.Tables.Add("sequenceTable2", new cF4SDHealthCardRawData.cHealthCardTable() { IsIncomplete = true, IsStatic = false, StartingIndex = 7, Columns = new Dictionary() { ["sequenceColumn"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { ColumnName = "sequenceColumn", Values = new List() { 8, 1, 0 } } } }); output.Tables.Add("sequenceTable3", new cF4SDHealthCardRawData.cHealthCardTable() { IsIncomplete = false, StartingIndex = 0, IsStatic = true, Columns = new Dictionary() { ["sequenceColumn"] = new cF4SDHealthCardRawData.cHealthCardTableColumn() { ColumnName = "sequenceColumn", Values = new List() { "Static" } } } }); output.Id = Guid.NewGuid(); var task = Task.Run(() => LoadSequenceTables(output.Id)); // get the remaining tables from the mockup pickup data foreach (var _entry in requestData.Tables) { if (output.Tables.ContainsKey(_entry)) continue; if (!MockupPickup.TryGetValue(_entry, out var _table)) continue; output.Tables.Add(_entry, _table); } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } await Task.CompletedTask; var outputString = JsonConvert.SerializeObject(output); var retVal = JsonConvert.DeserializeObject(outputString); return retVal; } private async void LoadSequenceTables(Guid Id) { try { const string tableOne = "sequenceTable"; const string tableTwo = "sequenceTable2"; const string columnName = "sequenceColumn"; await Task.Delay(250); lock (CachedHealthCardRawData) { if (!CachedHealthCardRawData.ContainsKey(Id)) CachedHealthCardRawData[Id] = new cF4SDHealthCardRawData() { Id = Id, Tables = new Dictionary() }; if (CachedHealthCardRawData[Id].Tables is null) CachedHealthCardRawData[Id].Tables = new Dictionary(); if (!CachedHealthCardRawData[Id].Tables.ContainsKey(tableOne)) CachedHealthCardRawData[Id].Tables[tableOne] = new cF4SDHealthCardRawData.cHealthCardTable() { Columns = new Dictionary() }; if (!CachedHealthCardRawData[Id].Tables[tableOne].Columns.ContainsKey(columnName)) CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName] = new cF4SDHealthCardRawData.cHealthCardTableColumn(); CachedHealthCardRawData[Id].Tables[tableOne].StartingIndex = 3; CachedHealthCardRawData[Id].Tables[tableOne].IsIncomplete = true; if (CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName].Values.Count < 3) CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName].Values.AddRange(new List() { 5, 4, 3, 2, 1, 0 }); else CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName].Values.InsertRange(3, new List() { 5, 4, 3, 2, 1, 0 }); } await Task.Delay(250); lock (CachedHealthCardRawData) { if (!CachedHealthCardRawData.ContainsKey(Id)) CachedHealthCardRawData[Id] = new cF4SDHealthCardRawData() { Id = Id, Tables = new Dictionary() }; if (CachedHealthCardRawData[Id].Tables is null) CachedHealthCardRawData[Id].Tables = new Dictionary(); if (!CachedHealthCardRawData[Id].Tables.ContainsKey(tableTwo)) CachedHealthCardRawData[Id].Tables[tableTwo] = new cF4SDHealthCardRawData.cHealthCardTable() { Columns = new Dictionary() }; if (!CachedHealthCardRawData[Id].Tables[tableTwo].Columns.ContainsKey(columnName)) CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName] = new cF4SDHealthCardRawData.cHealthCardTableColumn(); CachedHealthCardRawData[Id].Tables[tableTwo].StartingIndex = 2; CachedHealthCardRawData[Id].Tables[tableTwo].IsIncomplete = true; if (CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName].Values.Count < 2) CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName].Values.AddRange(new List() { 0, 3, 1, 2, 3, 8, 1, 0 }); else CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName].Values.InsertRange(2, new List() { 0, 3, 1, 2, 3, 8, 1, 0 }); } await Task.Delay(500); lock (CachedHealthCardRawData) { const string numericalTable = "agnt-computer-event-numerical"; const string processorColumn = "ProcessorUsage"; if (!CachedHealthCardRawData.ContainsKey(Id)) CachedHealthCardRawData[Id] = new cF4SDHealthCardRawData() { Id = Id, Tables = new Dictionary() }; if (CachedHealthCardRawData[Id].Tables is null) CachedHealthCardRawData[Id].Tables = new Dictionary(); if (!CachedHealthCardRawData[Id].Tables.ContainsKey(numericalTable)) CachedHealthCardRawData[Id].Tables[numericalTable] = new cF4SDHealthCardRawData.cHealthCardTable() { Columns = new Dictionary() }; if (!CachedHealthCardRawData[Id].Tables[numericalTable].Columns.ContainsKey(processorColumn)) CachedHealthCardRawData[Id].Tables[numericalTable].Columns[processorColumn] = new cF4SDHealthCardRawData.cHealthCardTableColumn(); CachedHealthCardRawData[Id].Tables[numericalTable].IsIncomplete = false; CachedHealthCardRawData[Id].Tables[numericalTable].Columns[processorColumn].IsIncomplete = false; CachedHealthCardRawData[Id].Tables[numericalTable].Columns[processorColumn].Values = new List() { 12.0, 20.0, 18.0, 15.0, 18.0, 19.0, 20.0, 26.0, 17.0, 11.0, 18.0, 16.0, 16.0, 14.0, 15.0 }; } await Task.Delay(250); lock (CachedHealthCardRawData) { if (!CachedHealthCardRawData.ContainsKey(Id)) CachedHealthCardRawData[Id] = new cF4SDHealthCardRawData() { Id = Id, Tables = new Dictionary() }; if (CachedHealthCardRawData[Id].Tables is null) CachedHealthCardRawData[Id].Tables = new Dictionary(); if (!CachedHealthCardRawData[Id].Tables.ContainsKey(tableOne)) CachedHealthCardRawData[Id].Tables[tableOne] = new cF4SDHealthCardRawData.cHealthCardTable() { Columns = new Dictionary() }; if (!CachedHealthCardRawData[Id].Tables[tableOne].Columns.ContainsKey(columnName)) CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName] = new cF4SDHealthCardRawData.cHealthCardTableColumn(); CachedHealthCardRawData[Id].Tables[tableOne].StartingIndex = 0; CachedHealthCardRawData[Id].Tables[tableOne].IsIncomplete = false; if (CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName].Values.Count < 0) CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName].Values.AddRange(new List() { 8, 7, 6 }); else CachedHealthCardRawData[Id].Tables[tableOne].Columns[columnName].Values.InsertRange(0, new List() { 8, 7, 6 }); if (!CachedHealthCardRawData[Id].Tables.ContainsKey(tableTwo)) CachedHealthCardRawData[Id].Tables[tableTwo] = new cF4SDHealthCardRawData.cHealthCardTable() { Columns = new Dictionary() }; if (!CachedHealthCardRawData[Id].Tables[tableTwo].Columns.ContainsKey(columnName)) CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName] = new cF4SDHealthCardRawData.cHealthCardTableColumn(); CachedHealthCardRawData[Id].Tables[tableTwo].StartingIndex = 1; CachedHealthCardRawData[Id].Tables[tableTwo].IsIncomplete = false; if (CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName].Values.Count < 1) CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName].Values.AddRange(new List() { 1 }); else CachedHealthCardRawData[Id].Tables[tableTwo].Columns[columnName].Values.InsertRange(1, new List() { 1 }); } } catch (Exception E) { LogException(E); } } public override async Task GetHealthCardData(Guid healthCardId) { cF4SDHealthCardRawData output = null; try { await Task.Delay(50); lock (CachedHealthCardRawData) { if (CachedHealthCardRawData.TryGetValue(healthCardId, out output)) { CachedHealthCardRawData.Remove(healthCardId); return output; } } return null; } catch (Exception E) { LogException(E); } finally { } await Task.CompletedTask; return output; } public override async Task> GetDetailsData(cF4sdHealthCardRawDataRequest requestData) { var output = new List(); try { var selectedData = MockupData.FirstOrDefault(data => requestData.Identities.Any(identity => identity.Id == data.SampleDataId)); output = selectedData.DetailsTables; } catch (Exception E) { LogException(E); } await Task.CompletedTask; return output; } private SortedList FilterColumData(string search, string ColName, cF4SDHealthCardRawData.cHealthCardTable table) { var retVal = new SortedList(); if (table.Columns.TryGetValue(ColName, out var column)) { for (int i = 0; i < column.Values.Count; i++) { if (column.Values[i].ToString().ToLowerInvariant().Contains(search.ToLowerInvariant())) retVal.Add(i, null); } } return retVal; } private SortedList FilterTableData(string search, cF4SDHealthCardRawData.cHealthCardTable table) { var retVal = FilterColumData(search, "DisplayName", table); var l2 = FilterColumData(search, "Name", table); foreach (var row in l2.Keys) retVal[row] = null; return retVal; } public override async Task GetPagedDataCount(cF4sdHealthSelectionDataRequest requestData) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { await Task.CompletedTask; if (!MockupPickup.TryGetValue(requestData.Table, out var _result)) return 0; if (_result?.Columns == null || _result.Columns.Count <= 0) return 0; var _vals = _result.Columns.First().Value.Values; if (_vals == null) return 0; int retVal = 0; if (string.IsNullOrEmpty(requestData.Search)) retVal = _vals.Count; else { var l = FilterTableData(requestData.Search, _result); retVal = l.Count; } return retVal; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return 0; } public override async Task GetPagedData(cF4sdHealthSelectionDataRequest requestData) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { await Task.CompletedTask; if (!MockupPickup.TryGetValue(requestData.Table, out var _result)) return null; var _s = JsonConvert.SerializeObject(_result); var _resultCopy = JsonConvert.DeserializeObject(_s); if (_resultCopy.Columns == null) return null; if (!string.IsNullOrEmpty(requestData.Search)) { var colIndexes = FilterTableData(requestData.Search, _result); foreach (var _entry in _resultCopy.Columns.Values) { var _values = new List(colIndexes.Count); foreach (var _index in colIndexes.Keys) { if (_index <= _entry.Values.Count) _values.Add(_entry.Values[_index]); } _entry.Values = _values; } } foreach (var _entry in _resultCopy.Columns.Values) { if (_entry.Values == null) continue; var c = _entry.Values.Count; var c2 = (requestData.Page + 1) * requestData.PageSize; if (c2 > c) c2 = c; int n = c2 - requestData.Page * requestData.PageSize; var newValues = new List(); for (int i = requestData.Page * requestData.PageSize; i < c2; i++) newValues.Add(_entry.Values[i]); _entry.Values = newValues; } return _resultCopy; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return null; } private cF4SDTicket GetTicketFromWriteParameter(cF4SDWriteParameters writeParams) { cF4SDTicket output = null; try { output = new cF4SDTicket() { Id = writeParams.id, DirectLinks = new Dictionary(), JournalItems = new List() }; if (writeParams.Values.TryGetValue("Summary", out var summary)) output.Summary = summary.ToString(); if (writeParams.Values.TryGetValue("Description", out var description)) output.Description = description.ToString(); if (writeParams.Values.TryGetValue("DescriptionHtml", out var descriptionHtml)) output.DescriptionHtml = descriptionHtml.ToString(); if (writeParams.Values.TryGetValue("AffectedUser", out var affectedUser)) output.AffectedUser = affectedUser.ToString(); if (writeParams.Values.TryGetValue("Asset", out var asset)) output.Asset = asset.ToString(); if (writeParams.Values.TryGetValue("Category", out var category)) output.Category = category.ToString(); if (writeParams.Values.TryGetValue("Classification", out var classification)) output.Classification = classification.ToString(); if (writeParams.Values.TryGetValue("CreationSource", out var creationSourceObj)) if (Enum.TryParse(creationSourceObj.ToString(), out cF4SDTicket.enumTicketCreationSource creationSource)) output.CreationSource = creationSource; if (writeParams.Values.TryGetValue("Status", out var statusObj)) { if (Enum.TryParse(statusObj.ToString(), out enumTicketStatus ticketStatus)) output.Status = ticketStatus; else if (statusObj is enumTicketStatus ticketStatusEnum) output.Status = ticketStatusEnum; } if (writeParams.Values.TryGetValue("Priority", out var priorityObj)) if (int.TryParse(priorityObj.ToString(), out int priority)) output.Priority = priority; if (writeParams.Values.TryGetValue("ClosingDate", out var closingDateObj)) { if (closingDateObj is DateTime closingDate) { output.ClosingDate = closingDate.ToLocalTime(); output.ClosingDaysSinceNow = (DateTime.UtcNow - closingDate).Days; } } if (writeParams.Values.TryGetValue("Solution", out var solution)) output.Solution = solution.ToString(); if (writeParams.Values.TryGetValue("SolutionHtml", out var solutionHtml)) output.SolutionHtml = solutionHtml.ToString(); } catch (Exception E) { LogException(E); } return output; } private bool AddDemoTicketFromWriteParameter(cF4SDWriteParameters dataParameter) { try { var ticketFromParameter = GetTicketFromWriteParameter(dataParameter); if (ticketFromParameter is null) return false; var selectedTicket = MockupData .FirstOrDefault(data => data.Tickets.Any(ticket => ticket.Id == dataParameter.id))?.Tickets .FirstOrDefault(ticket => ticket.Id == dataParameter.id); if (selectedTicket != null) { selectedTicket = ticketFromParameter; return true; } if (!dataParameter.Values.TryGetValue("UserId", out var userId)) return false; var selectedSampleData = MockupData.FirstOrDefault(data => data.SampleDataId.Equals(userId)); if (selectedSampleData is null) return false; if (dataParameter.Values.TryGetValue("TicketId", out var ticketIdValue)) if (ticketIdValue is Guid ticketId) ticketFromParameter.Id = ticketId; ticketFromParameter.Name = "INC00" + ticketCounter++; ticketFromParameter.CreationDate = DateTime.UtcNow; ticketFromParameter.CreationDaysSinceNow = 0; selectedSampleData.Tickets.Add(ticketFromParameter); } catch (Exception E) { LogException(E); } return false; } private cF4SDTicket.cTicketJournalItem GetJournalItemFromWriteParameter(cF4SDWriteParameters writeParams) { cF4SDTicket.cTicketJournalItem output = null; try { output = new cF4SDTicket.cTicketJournalItem(); if (writeParams.Values.TryGetValue("Header", out var header)) output.Header = header.ToString(); if (writeParams.Values.TryGetValue("IsVisibleForUser", out var isVisibleForUserValue)) if (isVisibleForUserValue is bool isVisibleForUser) output.IsVisibleForUser = isVisibleForUser; if (writeParams.Values.TryGetValue("time", out var timeValue)) { if (timeValue is DateTime time) { output.CreationDate = time; output.CreationDaysSinceNow = (DateTime.UtcNow - time).Days; } } if (writeParams.Values.TryGetValue("Description", out var description)) output.Description = description.ToString(); if (writeParams.Values.TryGetValue("DescriptionHtml", out var descriptionHtml)) output.DescriptionHtml = descriptionHtml.ToString(); } catch (Exception E) { LogException(E); } return output; } private bool AddDemoJournalItemFromWriteParameter(cF4SDWriteParameters dataParameter) { try { var selectedTicket = MockupData .FirstOrDefault(data => data.Tickets.Any(ticket => ticket.Id == dataParameter.id))?.Tickets .FirstOrDefault(ticket => ticket.Id == dataParameter.id); if (selectedTicket is null) { if (!dataParameter.Values.TryGetValue("TicketId", out var ticketIdValue)) return false; selectedTicket = MockupData .FirstOrDefault(data => data.Tickets.Any(ticket => ticket.Id == dataParameter.id))?.Tickets .FirstOrDefault(ticket => ticket.Id.Equals(ticketIdValue)); } if (selectedTicket is null) return false; var journalItemFromParam = GetJournalItemFromWriteParameter(dataParameter); if (journalItemFromParam is null) return false; selectedTicket.JournalItems.Add(journalItemFromParam); return true; } catch (Exception E) { LogException(E); } return false; } public override Task UpdateHealthcardTableData(cF4SDWriteParameters dataParameter) { try { if (dataParameter.TableName == "M42Wpm-Tickets") return Task.FromResult(AddDemoTicketFromWriteParameter(dataParameter)); else if (dataParameter.TableName == "M42Wpm-Tickets-History") return Task.FromResult(AddDemoJournalItemFromWriteParameter(dataParameter)); } catch (Exception E) { LogException(E); } return Task.FromResult(false); } public override Task Matrix42TicketFinalization(cApiM42Ticket ticketData) => Task.FromResult(true); private async Task> GetDemoTicketData(cF4sdHealthCardRawDataRequest requestData) { await Task.CompletedTask; var output = new List(); try { var selectedData = MockupData.FirstOrDefault(data => requestData.Identities.Any(identity => identity.Id == data.SampleDataId)); if (selectedData is null) return output; output = selectedData.Tickets ?? output; } catch (Exception E) { LogException(E); } return output; } public async Task> GetTicketSummaries(cF4sdHealthCardRawDataRequest requestData) { var output = new List(); try { var demoTickets = await GetDemoTicketData(requestData); foreach (var ticket in demoTickets) { output.Add(new cF4SDTicketSummary() { Id = ticket.Id, Name = ticket.Name, Status = ticket.Status, Summary = ticket.Summary }); } } catch (Exception E) { LogException(E); } return output; } public override Task>> GetQuickActionHistory(string QuickActionName, int OrgId, int DeviceId, int? UserId) => Task.FromResult(new List>()); public override async Task GetAgentApiAccessInfo() { cCockpitConfiguration.Instance = new cCockpitConfiguration(); cCockpitConfiguration.Instance.agentApiConfiguration = new cAgentApiConfiguration() { ApiUrl = "", ClientId = "", ClientSecret = "", LogonUrl = "", OrganizationCode = 0 }; await Task.CompletedTask; return true; } public override async Task GetCockpitConfiguration() { cCockpitConfiguration.Instance = new cCockpitConfiguration(); cCockpitConfiguration.Instance.agentApiConfiguration = new cAgentApiConfiguration() { ApiUrl = "", ClientId = "", ClientSecret = "", LogonUrl = "", OrganizationCode = 0 }; cCockpitConfiguration.Instance.m42ServerConfiguration = new cM42ServerConfiguration() { Server = "" }; await Task.CompletedTask; return true; } public override Task GetAgentOnlineStatus(int AgentDeviceId, int? AgentUserId = null) => Task.FromResult(true); public override Task GetQuickActionOfAgent(int ScriptId) => Task.FromResult(new cF4sdAgentScript() { Id = ScriptId, Name = "AgentScript", Type = enumAgentScriptType.user, UserPermissionRequired = false }); public override Task> GetQuickActionsOfAgent() => Task.FromResult(new List()); public override Task ActualizeAgentData(int AgentDeviceId, int? AgentUserId = null) => Task.FromResult(Guid.NewGuid()); public override async Task GetActualizeAgentDataStatus(Guid actualizeId, enumFasdInformationClass informationClass) { await Task.Delay(2500); return enumActualizeStatus.successfull; } public override async Task TryActivateDirectConnection(int DeviceId) { await Task.Delay(5000); return Guid.NewGuid(); } public override Task StopDirectConnection(Guid connectionId) => Task.CompletedTask; public override Task IsDirectConnectionUp(Guid connectionId) => Task.FromResult(true); public override Task DirectConnectionExtendDuration(Guid connectonId, int timeOutInMilliseconds) => Task.FromResult(true); public override Task RunAgentScript(cF4sdQuickActionRemote Script, int OrgCode, int DeviceId, int? DeviceAccountId, string Parameters) => Task.FromResult(new cF4sdAgentScriptInformation() { RevisionId = int.MinValue }); public override Task GetAgentRevision(int RevisionId, int OrgId) => Task.FromResult(null); public override Task GetAgentQuickActionStatus(int TaskId) => Task.FromResult(enumQuickActionStatus.Finished); public override Task CancelAgentTask(int TaskId) => Task.CompletedTask; public override Task> GetQuickActionsOfServer() => Task.FromResult>(null); public override Task StartGatheringRelations(IEnumerable relatedTo, CancellationToken token) => Task.FromResult(new cF4sdStagedSearchResultRelationTaskId() { Id = relatedTo.FirstOrDefault().id, PendingInformationClasses = new HashSet() { enumFasdInformationClass.User, enumFasdInformationClass.Computer, enumFasdInformationClass.Ticket, enumFasdInformationClass.VirtualSession, enumFasdInformationClass.MobileDevice } }); public override async Task GetStagedRelations(Guid id, CancellationToken token) { await Task.Delay(1500); List relations = await GetSearchResultRelations(enumF4sdSearchResultClass.User, new List() { new cFasdApiSearchResultEntry() { id = id } }); return new cF4sdStagedSearchResultRelations() { Relations = relations }; } private async Task DoLocalQuickActionAsync(string ActionPrefix, string ActionNaming) { MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } try { if (cF4SDCockpitXmlConfig.Instance?.QuickActionConfig?.F4SDQuickActions?.QuickActions == null) return; ActionPrefix = ActionPrefix.ToLowerInvariant(); foreach (var _quickAction in cF4SDCockpitXmlConfig.Instance.QuickActionConfig.F4SDQuickActions.QuickActions.Values) { if (!(_quickAction is cFasdQuickActionLocalScript _localAction)) continue; if (!_localAction.Name.ToLowerInvariant().StartsWith(ActionPrefix)) continue; Debug.WriteLine($"Starting Demo {ActionNaming} Quick Action {_localAction.Name}."); await cExternalToolExecutor.StartLocalActionAsync(_localAction, null, null); } } catch (Exception E) { LogException(E); } finally { if (CM != null) LogMethodEnd(CM); } } public override async Task InitializeAfterOnlineAsync() { await DoLocalQuickActionAsync("DemoInitialization", "Initialization"); } public override async Task TerminateAsync() { await DoLocalQuickActionAsync("DemoTermination", "Termination"); } public override Uri GetMediaContentUri(string ContentRelPath) { MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } try { var _path = Assembly.GetExecutingAssembly().Location; _path = System.IO.Path.GetDirectoryName(_path); var _mediaUriBuilder = new UriBuilder(_path + "\\"); var _mediaUri = new Uri(_mediaUriBuilder.Uri, ContentRelPath); return _mediaUri; } catch (Exception E) { LogException(E); } finally { if (CM != null) LogMethodEnd(CM); } return null; } } }