using sh.actions.package_cleanup.Models; namespace sh.actions.package_cleanup.Service; public class PackageService(IGiteaPackageService packageService) : IPackageService { public async Task> GetFilteredPackages() { var packages = (await packageService.GetPackagesByOwnerAsync()).ToList(); return packages; } public List FilterPackagesToDelete(List packages) { var versionMap = packages.ToDictionary(p => p.Version, p => SoftwareVersion.Parse(p.Version)); var versionsToKeep = new HashSet(); foreach (var package in packages .Where(p => string.IsNullOrEmpty(versionMap[p.Version].Suffix)) .GroupBy(p => versionMap[p.Version].ToString()) .Select(g => g.OrderBy(p => p.Version.Length).First())) { versionsToKeep.Add(package.Version); } var latestVersion = packages.FirstOrDefault(p => versionMap[p.Version].IsLatest); if (latestVersion != null) { versionsToKeep.Add(latestVersion.Version); } var suffixedVersionsToKeep = packages .Where(p => !string.IsNullOrEmpty(versionMap[p.Version].Suffix) && !(versionMap[p.Version].Major == 0 && versionMap[p.Version].Minor == 0 && versionMap[p.Version].Patch == 0)) .GroupBy(p => (versionMap[p.Version].Suffix, versionMap[p.Version].Major, versionMap[p.Version].Minor)) .SelectMany(g => g .OrderByDescending(p => versionMap[p.Version].Patch) .ThenByDescending(p => versionMap[p.Version].Build) .Take(2) .GroupBy(p => versionMap[p.Version].ToString()) .Select(group => group.OrderBy(p => p.Version.Length).First())); foreach (var package in suffixedVersionsToKeep) { versionsToKeep.Add(package.Version); } return packages.Where(p => !versionsToKeep.Contains(p.Version)).ToList(); } }