From 8c7c45e1b029a7c1fd733fd54a1101904b2f69a7 Mon Sep 17 00:00:00 2001 From: Meik Date: Tue, 10 Mar 2026 09:26:29 +0100 Subject: [PATCH] fix: remove direct msgraph dependency from diagnostics --- LiamWorkflowDiagnostics/MainWindow.xaml.cs | 112 ++++++++++++++++----- 1 file changed, 87 insertions(+), 25 deletions(-) diff --git a/LiamWorkflowDiagnostics/MainWindow.xaml.cs b/LiamWorkflowDiagnostics/MainWindow.xaml.cs index 377cb4a..8021643 100644 --- a/LiamWorkflowDiagnostics/MainWindow.xaml.cs +++ b/LiamWorkflowDiagnostics/MainWindow.xaml.cs @@ -11,7 +11,6 @@ using System.IO; using C4IT.LIAM; using C4IT.Logging; using C4IT.Matrix42.ServerInfo; -using C4IT.MsGraph; using C4IT_IAM_Engine; using LiamWorkflowActivities; using LiamAD; @@ -22,6 +21,15 @@ namespace LiamWorkflowDiagnostics { public partial class MainWindow : Window { + private const int MsTeamsVisibilityPrivate = 0; + private const int MsTeamsVisibilityPublic = 1; + private const int MsTeamsVisibilityHiddenMembership = 2; + private const int MsTeamsCloneAppsFlag = 1; + private const int MsTeamsCloneTabsFlag = 2; + private const int MsTeamsCloneSettingsFlag = 4; + private const int MsTeamsCloneChannelsFlag = 8; + private const int MsTeamsCloneMembersFlag = 16; + private readonly ObservableCollection _logEntries = new ObservableCollection(); private ProviderTestSession _session; private readonly string _settingsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LiamWorkflowDiagnostics.settings.json"); @@ -79,9 +87,15 @@ namespace LiamWorkflowDiagnostics AdGroupTypeComboBox.ItemsSource = Enum.GetValues(typeof(ADServiceGroupCreator.ADGroupType)) .Cast(); AdGroupTypeComboBox.SelectedItem = ADServiceGroupCreator.ADGroupType.Distribution; - MsTeamsVisibilityComboBox.ItemsSource = Enum.GetValues(typeof(cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType)) - .Cast(); - MsTeamsVisibilityComboBox.SelectedItem = cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType.Private; + MsTeamsVisibilityComboBox.ItemsSource = new[] + { + new MsTeamsVisibilityOption(MsTeamsVisibilityPrivate, "Private"), + new MsTeamsVisibilityOption(MsTeamsVisibilityPublic, "Public"), + new MsTeamsVisibilityOption(MsTeamsVisibilityHiddenMembership, "HiddenMembership") + }; + MsTeamsVisibilityComboBox.DisplayMemberPath = nameof(MsTeamsVisibilityOption.Label); + MsTeamsVisibilityComboBox.SelectedValuePath = nameof(MsTeamsVisibilityOption.Value); + MsTeamsVisibilityComboBox.SelectedValue = MsTeamsVisibilityPrivate; MsTeamsCloneSettingsCheckBox.IsChecked = true; MsTeamsCloneChannelsCheckBox.IsChecked = true; @@ -299,8 +313,9 @@ namespace LiamWorkflowDiagnostics AdScopeComboBox.SelectedItem = (eLiamAccessRoleScopes)settings.AdScope; if (Enum.IsDefined(typeof(ADServiceGroupCreator.ADGroupType), settings.AdGroupType)) AdGroupTypeComboBox.SelectedItem = (ADServiceGroupCreator.ADGroupType)settings.AdGroupType; - if (Enum.IsDefined(typeof(cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType), settings.MsTeamsVisibility)) - MsTeamsVisibilityComboBox.SelectedItem = (cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType)settings.MsTeamsVisibility; + MsTeamsVisibilityComboBox.SelectedValue = IsValidMsTeamsVisibility(settings.MsTeamsVisibility) + ? settings.MsTeamsVisibility + : MsTeamsVisibilityPrivate; } private void SaveSettings() @@ -357,7 +372,7 @@ namespace LiamWorkflowDiagnostics MsTeamsSourceTeamId = MsTeamsSourceTeamIdTextBox.Text ?? string.Empty, MsTeamsNewName = MsTeamsNewNameTextBox.Text ?? string.Empty, MsTeamsDescription = MsTeamsDescriptionTextBox.Text ?? string.Empty, - MsTeamsVisibility = MsTeamsVisibilityComboBox.SelectedItem is cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType visibility ? (int)visibility : (int)cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType.Private, + MsTeamsVisibility = GetSelectedMsTeamsVisibility(), MsTeamsCloneApps = MsTeamsCloneAppsCheckBox.IsChecked ?? false, MsTeamsCloneTabs = MsTeamsCloneTabsCheckBox.IsChecked ?? false, MsTeamsCloneSettings = MsTeamsCloneSettingsCheckBox.IsChecked ?? true, @@ -589,15 +604,13 @@ namespace LiamWorkflowDiagnostics var provider = EnsureInitializedProvider("MsTeams"); var sourceTeamId = GetRequiredText(MsTeamsSourceTeamIdTextBox.Text, "Source Team ID"); var newTeamName = GetRequiredText(MsTeamsNewNameTextBox.Text, "New Team Name"); - var visibility = MsTeamsVisibilityComboBox.SelectedItem is cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType selectedVisibility - ? selectedVisibility - : cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType.Private; + var visibility = GetSelectedMsTeamsVisibility(); var result = await provider.cloneTeam( sourceTeamId, newTeamName, NormalizeOptionalText(MsTeamsDescriptionTextBox.Text), - (int)visibility, + visibility, GetSelectedCloneParts(), string.Join(";", ParseIdentifierList(MsTeamsAdditionalMembersTextBox.Text, "Additional Members")), string.Join(";", ParseIdentifierList(MsTeamsAdditionalOwnersTextBox.Text, "Additional Owners"))); @@ -811,18 +824,18 @@ namespace LiamWorkflowDiagnostics private int GetSelectedCloneParts() { - var parts = cMsGraphSharepoint.CloneTeamRequest.ClonableTeamParts.None; + var parts = 0; if (MsTeamsCloneAppsCheckBox.IsChecked ?? false) - parts |= cMsGraphSharepoint.CloneTeamRequest.ClonableTeamParts.Apps; + parts |= MsTeamsCloneAppsFlag; if (MsTeamsCloneTabsCheckBox.IsChecked ?? false) - parts |= cMsGraphSharepoint.CloneTeamRequest.ClonableTeamParts.Tabs; + parts |= MsTeamsCloneTabsFlag; if (MsTeamsCloneSettingsCheckBox.IsChecked ?? false) - parts |= cMsGraphSharepoint.CloneTeamRequest.ClonableTeamParts.Settings; + parts |= MsTeamsCloneSettingsFlag; if (MsTeamsCloneChannelsCheckBox.IsChecked ?? false) - parts |= cMsGraphSharepoint.CloneTeamRequest.ClonableTeamParts.Channels; + parts |= MsTeamsCloneChannelsFlag; if (MsTeamsCloneMembersCheckBox.IsChecked ?? false) - parts |= cMsGraphSharepoint.CloneTeamRequest.ClonableTeamParts.Members; - return (int)parts; + parts |= MsTeamsCloneMembersFlag; + return parts; } private object MapResultToken(ResultToken token) @@ -857,21 +870,57 @@ namespace LiamWorkflowDiagnostics .ToList(); } - private object MapMsGraphResult(cMsGraphResultBase result) + private object MapMsGraphResult(object result) { if (result == null) return null; + var resultType = result.GetType(); return new { - Id = result.ID, - result.DisplayName, - result.ODataId, - result.Context, - Result = result.Result + Id = ReadPropertyValue(result, resultType, "ID"), + DisplayName = ReadPropertyValue(result, resultType, "DisplayName"), + ODataId = ReadPropertyValue(result, resultType, "ODataId"), + Context = ReadPropertyValue(result, resultType, "Context"), + Result = ReadPropertyValue(result, resultType, "Result") }; } + private int GetSelectedMsTeamsVisibility() + { + var selectedValue = MsTeamsVisibilityComboBox.SelectedValue; + if (selectedValue is int intValue && IsValidMsTeamsVisibility(intValue)) + return intValue; + + if (selectedValue != null && int.TryParse(selectedValue.ToString(), out var parsedValue) && IsValidMsTeamsVisibility(parsedValue)) + return parsedValue; + + return MsTeamsVisibilityPrivate; + } + + private bool IsValidMsTeamsVisibility(int value) + { + return value == MsTeamsVisibilityPrivate + || value == MsTeamsVisibilityPublic + || value == MsTeamsVisibilityHiddenMembership; + } + + private T ReadPropertyValue(object instance, Type instanceType, string propertyName) + { + var property = instanceType.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public); + if (property == null) + return default(T); + + var value = property.GetValue(instance); + if (value == null) + return default(T); + + if (value is T typedValue) + return typedValue; + + return default(T); + } + private cLiamProviderData ParseProviderDataFromInput(string input) { if (string.IsNullOrWhiteSpace(input)) @@ -1386,7 +1435,7 @@ namespace LiamWorkflowDiagnostics public string MsTeamsSourceTeamId { get; set; } = string.Empty; public string MsTeamsNewName { get; set; } = string.Empty; public string MsTeamsDescription { get; set; } = string.Empty; - public int MsTeamsVisibility { get; set; } = (int)cMsGraphSharepoint.CloneTeamRequest.TeamVisibilityType.Private; + public int MsTeamsVisibility { get; set; } = MsTeamsVisibilityPrivate; public bool MsTeamsCloneApps { get; set; } = false; public bool MsTeamsCloneTabs { get; set; } = false; public bool MsTeamsCloneSettings { get; set; } = true; @@ -1403,5 +1452,18 @@ namespace LiamWorkflowDiagnostics public string ExchangeDistributionDisplayName { get; set; } = string.Empty; public string ExchangeDistributionPrimarySmtp { get; set; } = string.Empty; } + + private sealed class MsTeamsVisibilityOption + { + public MsTeamsVisibilityOption(int value, string label) + { + Value = value; + Label = label; + } + + public int Value { get; } + + public string Label { get; } + } } }