Backend/e-suite.WorkBench/eSuite.WorkBench/Commands/SelectBranchVersionCommand.cs
2026-01-20 21:50:10 +00:00

129 lines
4.5 KiB
C#

using eSuite.WorkBench.Models;
using eSuite.WorkBench.WpfHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace eSuite.WorkBench.Commands
{
public class SelectBranchVersionCommand : AsyncCommandBase
{
private readonly MainWindowViewModel _mainWindowViewModel;
public SelectBranchVersionCommand(MainWindowViewModel mainWindowViewModel, Action<Exception> onException, EventHandler<FeedbackEventArgs> addFeedbackMessage) : base(onException)
{
FeedbackMessage += addFeedbackMessage;
_mainWindowViewModel = mainWindowViewModel;
}
protected override Task ExecuteAsync(object parameter)
{
var branchVersion = parameter as Branch;
var branchFeature = $"{branchVersion.Parent?.BranchName}-{branchVersion.BranchName}".TrimStart('-');
DoFeedbackMessage($"Selecting {branchFeature}");
if (branchFeature == "master")
{
branchFeature = string.Empty;
}
try
{
_mainWindowViewModel.AvailableProxyTags.SelectedItem = GetBestAvailableVersion(branchFeature, _mainWindowViewModel.AvailableProxyTags);
}
catch (Exception)
{
_mainWindowViewModel.AvailableProxyTags.SelectedItem = string.Empty;
}
try
{
_mainWindowViewModel.AvailableWebUiTags.SelectedItem = GetBestAvailableVersion(branchFeature, _mainWindowViewModel.AvailableWebUiTags);
}
catch (Exception)
{
_mainWindowViewModel.AvailableWebUiTags.SelectedItem = string.Empty;
}
try
{
_mainWindowViewModel.AvailableApiTags.SelectedItem = GetBestAvailableVersion(branchFeature, _mainWindowViewModel.AvailableApiTags);
}
catch (Exception)
{
_mainWindowViewModel.AvailableApiTags.SelectedItem = string.Empty;
}
try
{
_mainWindowViewModel.AvailableDbMigratorTags.SelectedItem = GetBestAvailableVersion(branchFeature, _mainWindowViewModel.AvailableDbMigratorTags);
}
catch (Exception)
{
_mainWindowViewModel.AvailableDbMigratorTags.SelectedItem = string.Empty;
}
try
{
_mainWindowViewModel.AvailableSchedulerTags.SelectedItem = GetBestAvailableVersion(branchFeature, _mainWindowViewModel.AvailableSchedulerTags);
}
catch (Exception)
{
_mainWindowViewModel.AvailableSchedulerTags.SelectedItem = string.Empty;
}
try
{
_mainWindowViewModel.AvailableMessageProcessorTags.SelectedItem = GetBestAvailableVersion(branchFeature, _mainWindowViewModel.AvailableMessageProcessorTags);
}
catch (Exception)
{
_mainWindowViewModel.AvailableMessageProcessorTags.SelectedItem = string.Empty;
}
DoFeedbackMessage($"{branchFeature} selected");
return Task.CompletedTask;
}
private static string GetBestAvailableVersion(string branchFeature, IEnumerable<string> availableTags)
{
List<string> tags;
if (branchFeature == string.Empty)
{
tags = availableTags.Where(x => !x.Contains("-")).ToList();
}
else tags = availableTags.Where(x => x.Contains(branchFeature)).ToList();
if (!tags.Any())
{
tags = availableTags.Where(x => x.Contains("develop")).ToList();
}
tags.Sort((x, y) =>
{
var xNumbers = CalcXNumbers(x);
var yNumbers = CalcXNumbers(y);
if (xNumbers.Count != yNumbers.Count)
return string.CompareOrdinal(x, y);
return xNumbers.Select((t, i) => t.CompareTo(yNumbers[i])).FirstOrDefault(order => order != 0);
} );
return tags.Last();
}
private static readonly Regex Regex = new(@"\d+\.\d+\.\d+.\d+");
private static List<long> CalcXNumbers(string value)
{
var parts = Regex.Match(value).Value.Split('.');
return parts.Select(part => long.Parse(part)).ToList();
}
}
}