From 985e8b7923829f99c6c7984702fe4affa0ca51a8 Mon Sep 17 00:00:00 2001 From: Robert Dailey Date: Sat, 19 Jun 2021 18:21:48 -0500 Subject: [PATCH] fixup! fixup! Add initial Blazor Server project --- src/{TrashUpdater.sln => Recyclarr.sln} | 0 ....DotSettings => Recyclarr.sln.DotSettings} | 0 src/Recyclarr/Code/ConfigurationProvider.cs | 50 ++++++++++++++ .../Persisters/IRadarrConfigPersister.cs | 2 +- .../Persisters/RadarrConfigPersister.cs | 2 +- src/Recyclarr/Components/ServerSelector.razor | 66 +++++++++++++++++++ .../Radarr/CustomFormats/CustomFormats.razor | 7 +- .../CustomFormats/CustomFormats.razor.cs | 47 +++---------- src/TrashLib/Cache/ServiceCache.cs | 13 ++-- .../Processors/PersistenceProcessor.cs | 9 +-- 10 files changed, 141 insertions(+), 55 deletions(-) rename src/{TrashUpdater.sln => Recyclarr.sln} (100%) rename src/{TrashUpdater.sln.DotSettings => Recyclarr.sln.DotSettings} (100%) create mode 100644 src/Recyclarr/Code/ConfigurationProvider.cs create mode 100644 src/Recyclarr/Components/ServerSelector.razor diff --git a/src/TrashUpdater.sln b/src/Recyclarr.sln similarity index 100% rename from src/TrashUpdater.sln rename to src/Recyclarr.sln diff --git a/src/TrashUpdater.sln.DotSettings b/src/Recyclarr.sln.DotSettings similarity index 100% rename from src/TrashUpdater.sln.DotSettings rename to src/Recyclarr.sln.DotSettings diff --git a/src/Recyclarr/Code/ConfigurationProvider.cs b/src/Recyclarr/Code/ConfigurationProvider.cs new file mode 100644 index 00000000..7f1e1e42 --- /dev/null +++ b/src/Recyclarr/Code/ConfigurationProvider.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Common.Extensions; +using Recyclarr.Code.Settings.Persisters; +using TrashLib.Config; +using TrashLib.Radarr.Config; + +namespace Recyclarr.Code +{ + public class ConfigurationProvider : IConfigurationProvider + { + public IServiceConfiguration ActiveConfiguration { get; set; } + } + + public interface IConfigurationProvider + where T : IServiceConfiguration + { + public T Active { get; } + public IReadOnlyCollection Configs { get; } + } + + internal sealed class RadarrConfigurationProvider : IConfigurationProvider, IDisposable + { + public void Dispose() + { + } + + private RadarrConfiguration? _active; + + public RadarrConfigurationProvider(IRadarrConfigPersister configPersister) + { + Configs = configPersister.Load().AsReadOnly(); + } + + public IReadOnlyCollection Configs { get; } + + public RadarrConfiguration Active + { + get => _active ?? throw new NullReferenceException("Active configuration has not been set"); + set + { + _active = value; + ActiveChanged?.Invoke(); + } + } + + public event Action? ActiveChanged; + } +} diff --git a/src/Recyclarr/Code/Settings/Persisters/IRadarrConfigPersister.cs b/src/Recyclarr/Code/Settings/Persisters/IRadarrConfigPersister.cs index 74847ccc..979b3d06 100644 --- a/src/Recyclarr/Code/Settings/Persisters/IRadarrConfigPersister.cs +++ b/src/Recyclarr/Code/Settings/Persisters/IRadarrConfigPersister.cs @@ -5,7 +5,7 @@ namespace Recyclarr.Code.Settings.Persisters { public interface IRadarrConfigPersister { - IList Load(); + ICollection Load(); void Save(IEnumerable settings); } } diff --git a/src/Recyclarr/Code/Settings/Persisters/RadarrConfigPersister.cs b/src/Recyclarr/Code/Settings/Persisters/RadarrConfigPersister.cs index 5f5183a5..b469ff3a 100644 --- a/src/Recyclarr/Code/Settings/Persisters/RadarrConfigPersister.cs +++ b/src/Recyclarr/Code/Settings/Persisters/RadarrConfigPersister.cs @@ -14,7 +14,7 @@ namespace Recyclarr.Code.Settings.Persisters private const string Filename = "radarr.json"; - public IList Load() + public ICollection Load() { return _persister.LoadSettings>(Filename); } diff --git a/src/Recyclarr/Components/ServerSelector.razor b/src/Recyclarr/Components/ServerSelector.razor new file mode 100644 index 00000000..14cded50 --- /dev/null +++ b/src/Recyclarr/Components/ServerSelector.razor @@ -0,0 +1,66 @@ +@using TrashLib.Radarr.Config +@using Blazored.LocalStorage +@using Recyclarr.Code.Settings.Persisters +@using TrashLib.Config + + + @foreach (var instance in _configs) + { + @instance.BaseUrl + } + + +@code { + + + private IList _configs = new List(); + private readonly Queue> _afterRenderActions = new(); + private RadarrConfiguration? _selectedConfig; + + [Inject] + public ILocalStorageService LocalStorage { get; set; } = default!; + + [Inject] + public IRadarrConfigPersister SettingsPersister { get; set; } = default!; + + [Parameter] + public string Label { get; set; } = "Select Server"; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + _configs = SettingsPersister.Load(); + + _afterRenderActions.Enqueue(async () => + { + var savedSelection = await LocalStorage.GetItemAsync("selectedInstance"); + var instanceToSelect = _configs.FirstOrDefault(c => c.BaseUrl == savedSelection); + _selectedConfig = instanceToSelect ?? _configs.FirstOrDefault(); + UpdateSelectedCustomFormats(); + }); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + while (_afterRenderActions.TryDequeue(out var action)) + { + await action.Invoke(); + StateHasChanged(); + } + + await base.OnAfterRenderAsync(firstRender); + } + + private RadarrConfiguration? SelectedConfig + { + get => _selectedConfig; + set + { + _selectedConfig = value; + UpdateSelectedCustomFormats(); + _afterRenderActions.Enqueue(async () + => await LocalStorage.SetItemAsync("selectedInstance", _selectedConfig?.BaseUrl)); + } + } +} diff --git a/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor b/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor index 7d4e66f5..8de35b5d 100644 --- a/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor +++ b/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor @@ -12,12 +12,7 @@ Refresh - - @foreach (var instance in _configs) - { - @instance.BaseUrl - } - + @if (_selectedConfig == null) diff --git a/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor.cs b/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor.cs index a0c3c14a..3e6fb8b4 100644 --- a/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor.cs +++ b/src/Recyclarr/Pages/Radarr/CustomFormats/CustomFormats.razor.cs @@ -15,36 +15,18 @@ namespace Recyclarr.Pages.Radarr.CustomFormats [UsedImplicitly] public partial class CustomFormats : IDisposable { - private readonly Queue> _afterRenderActions = new(); private CustomFormatChooser? _cfChooser; - private IList _configs = new List(); private HashSet _currentSelection = new(); - private RadarrConfiguration? _selectedConfig; - - private RadarrConfiguration? SelectedConfig - { - get => _selectedConfig; - set - { - _selectedConfig = value; - UpdateSelectedCustomFormats(); - _afterRenderActions.Enqueue(async () - => await LocalStorage.SetItemAsync("selectedInstance", _selectedConfig?.BaseUrl)); - } - } [CascadingParameter] public CustomFormatAccessLayout? CfAccessor { get; set; } - [Inject] - public IDialogService DialogService { get; set; } = default!; + // [Inject] + // public IDialogService DialogService { get; set; } = default!; [Inject] public IRadarrConfigPersister SettingsPersister { get; set; } = default!; - [Inject] - public ILocalStorageService LocalStorage { get; set; } = default!; - private bool? SelectAllCheckbox { get; set; } = false; private List ChosenCustomFormatIds => _currentSelection.Select(cf => cf.Item.TrashIds.First()).ToList(); private bool IsRefreshDisabled => CfAccessor is not {IsLoaded: true}; @@ -67,13 +49,13 @@ namespace Recyclarr.Pages.Radarr.CustomFormats _configs = SettingsPersister.Load(); - _afterRenderActions.Enqueue(async () => - { - var savedSelection = await LocalStorage.GetItemAsync("selectedInstance"); - var instanceToSelect = _configs.FirstOrDefault(c => c.BaseUrl == savedSelection); - _selectedConfig = instanceToSelect ?? _configs.FirstOrDefault(); - UpdateSelectedCustomFormats(); - }); + // _afterRenderActions.Enqueue(async () => + // { + // var savedSelection = await LocalStorage.GetItemAsync("selectedInstance"); + // var instanceToSelect = _configs.FirstOrDefault(c => c.BaseUrl == savedSelection); + // _selectedConfig = instanceToSelect ?? _configs.FirstOrDefault(); + // UpdateSelectedCustomFormats(); + // }); if (CfAccessor != null) { @@ -81,17 +63,6 @@ namespace Recyclarr.Pages.Radarr.CustomFormats } } - protected override async Task OnAfterRenderAsync(bool firstRender) - { - while (_afterRenderActions.TryDequeue(out var action)) - { - await action.Invoke(); - StateHasChanged(); - } - - await base.OnAfterRenderAsync(firstRender); - } - private void OnReloadCompleted() { _cfChooser?.RequestRefreshList(); diff --git a/src/TrashLib/Cache/ServiceCache.cs b/src/TrashLib/Cache/ServiceCache.cs index 1c6b9718..a2241ed4 100644 --- a/src/TrashLib/Cache/ServiceCache.cs +++ b/src/TrashLib/Cache/ServiceCache.cs @@ -16,18 +16,20 @@ namespace TrashLib.Cache internal class ServiceCache : IServiceCache { private static readonly Regex AllowedObjectNameCharacters = new(@"^[\w-]+$", RegexOptions.Compiled); - private readonly IConfigurationProvider _configProvider; private readonly IFileSystem _fileSystem; private readonly IFNV1a _hash; + private readonly IServerInfo _serverInfo; private readonly ICacheStoragePath _storagePath; - public ServiceCache(IFileSystem fileSystem, ICacheStoragePath storagePath, - IConfigurationProvider configProvider, + public ServiceCache( + IFileSystem fileSystem, + ICacheStoragePath storagePath, + IServerInfo serverInfo, ILogger log) { _fileSystem = fileSystem; _storagePath = storagePath; - _configProvider = configProvider; + _serverInfo = serverInfo; Log = log; _hash = FNV1aFactory.Instance.Create(FNVConfig.GetPredefinedConfig(32)); } @@ -83,7 +85,8 @@ namespace TrashLib.Cache private string BuildServiceGuid() { - return _hash.ComputeHash(Encoding.ASCII.GetBytes(_configProvider.ActiveConfiguration.BaseUrl)) + return _hash + .ComputeHash(Encoding.ASCII.GetBytes(_serverInfo.BaseUrl)) .AsHexString(); } diff --git a/src/TrashLib/Radarr/CustomFormat/Processors/PersistenceProcessor.cs b/src/TrashLib/Radarr/CustomFormat/Processors/PersistenceProcessor.cs index aaae4f7d..2fc825b1 100644 --- a/src/TrashLib/Radarr/CustomFormat/Processors/PersistenceProcessor.cs +++ b/src/TrashLib/Radarr/CustomFormat/Processors/PersistenceProcessor.cs @@ -19,7 +19,7 @@ namespace TrashLib.Radarr.CustomFormat.Processors internal class PersistenceProcessor : IPersistenceProcessor { - private readonly IConfigurationProvider _configProvider; + private readonly IConfigurationProvider _configProvider; private readonly ICustomFormatService _customFormatService; private readonly IQualityProfileService _qualityProfileService; private readonly Func _stepsFactory; @@ -28,7 +28,7 @@ namespace TrashLib.Radarr.CustomFormat.Processors public PersistenceProcessor( ICustomFormatService customFormatService, IQualityProfileService qualityProfileService, - IConfigurationProvider configProvider, + IConfigurationProvider configProvider, Func stepsFactory) { _customFormatService = customFormatService; @@ -52,7 +52,8 @@ namespace TrashLib.Radarr.CustomFormat.Processors _steps = _stepsFactory(); } - public async Task PersistCustomFormats(IReadOnlyCollection guideCfs, + public async Task PersistCustomFormats( + IReadOnlyCollection guideCfs, IEnumerable deletedCfsInCache, IDictionary profileScores) { @@ -64,7 +65,7 @@ namespace TrashLib.Radarr.CustomFormat.Processors _steps.JsonTransactionStep.Process(guideCfs, radarrCfs); // Step 1.1: Optionally record deletions of custom formats in cache but not in the guide - var config = (RadarrConfiguration) _configProvider.ActiveConfiguration; + var config = _configProvider.ActiveConfiguration; if (config.DeleteOldCustomFormats) { _steps.JsonTransactionStep.RecordDeletions(deletedCfsInCache, radarrCfs);