using Recyclarr.Cli.Pipelines.ReleaseProfile.Models; using Recyclarr.Cli.Pipelines.Tags; using Recyclarr.Common.Extensions; using Recyclarr.ServarrApi.Dto; namespace Recyclarr.Cli.Pipelines.ReleaseProfile.PipelinePhases; public class ReleaseProfileTransactionPhase { private readonly ServiceTagCache _tagCache; public ReleaseProfileTransactionPhase(ServiceTagCache tagCache) { _tagCache = tagCache; } public ReleaseProfileTransactionData Execute( IReadOnlyList configProfiles, IList serviceData) { var created = new List(); var updated = new List(); foreach (var configProfile in configProfiles) { var title = $"[Trash] {configProfile.Profile.Name}"; var matchingServiceProfile = serviceData.FirstOrDefault(x => x.Name.EqualsIgnoreCase(title)); if (matchingServiceProfile is not null) { SetupProfileRequestObject(matchingServiceProfile, configProfile); updated.Add(matchingServiceProfile); } else { var profileToUpdate = new SonarrReleaseProfile {Name = title, Enabled = true}; SetupProfileRequestObject(profileToUpdate, configProfile); created.Add(profileToUpdate); } } var deleted = DeleteOldManagedProfiles(serviceData, configProfiles); return new ReleaseProfileTransactionData(updated, created, deleted); } private static IReadOnlyList DeleteOldManagedProfiles( IList serviceData, IReadOnlyList configProfiles) { var profiles = configProfiles.Select(x => x.Profile).ToList(); return serviceData .Where(sonarrProfile => { return sonarrProfile.Name.StartsWithIgnoreCase("[Trash]") && !profiles.Exists(profile => sonarrProfile.Name.EndsWithIgnoreCase(profile.Name)); }) .ToList(); } private void SetupProfileRequestObject(SonarrReleaseProfile profileToUpdate, ProcessedReleaseProfileData profile) { profileToUpdate.Preferred = profile.Profile.Preferred .SelectMany(x => x.Terms.Select(termData => new SonarrPreferredTerm(x.Score, termData.Term))) .ToList(); profileToUpdate.Ignored = profile.Profile.Ignored.Select(x => x.Term).ToList(); profileToUpdate.Required = profile.Profile.Required.Select(x => x.Term).ToList(); profileToUpdate.IncludePreferredWhenRenaming = profile.Profile.IncludePreferredWhenRenaming; profileToUpdate.Tags = profile.Tags .Select(x => _tagCache.GetTagIdByName(x)) .NotNull() .ToList(); } }