From c2668d727039b9d75d1bec1d702d4ff95fdc9e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Thu, 24 Aug 2023 10:37:04 +0200 Subject: [PATCH] Refactor AdminContentProvider --- .../AddRemoteContentProviderCommand.cs | 16 ++++++++++ ...faultIdentifiableCommandHandlerRegister.cs | 1 + .../LocalItemCreator.cs | 12 ++++---- .../LocalItemDeleter.cs | 9 +++--- .../LocalItemMover.cs | 9 +++--- ...e.Providers.LocalAdmin.Abstractions.csproj | 2 +- .../IAdminContentAccessorFactory.cs | 8 ++--- .../IAdminContentProvider.cs | 8 ----- .../IAdminElevationManager.cs | 4 +-- .../AdminContentAccessorFactory.cs | 22 +++++++------- .../AdminContentProvider.cs | 29 ------------------- .../AdminElevationManager.cs | 28 +++++++++++++----- .../FileTime.Providers.LocalAdmin.csproj | 1 + .../FileTime.Providers.LocalAdmin/Startup.cs | 1 - .../IRemoteContentProvider.cs | 3 +- .../IRemoteContentWriter.cs | 12 -------- .../IRemoteItemCreator.cs | 12 -------- .../IRemoteItemDeleter.cs | 10 ------- .../IRemoteItemMover.cs | 10 ------- .../FileTime.Providers.Remote.csproj | 1 + .../RemoteContentProvider.cs | 9 +++++- .../RemoteContentWriter.cs | 17 ++++++----- .../RemoteItemCreator.cs | 22 +++++++------- .../RemoteItemDeleter.cs | 19 +++++++----- .../RemoteItemMover.cs | 17 ++++++----- .../FileTime.Providers.Remote/Startup.cs | 8 ++--- .../DummyAdminElevationManager.cs | 3 +- 27 files changed, 132 insertions(+), 161 deletions(-) create mode 100644 src/AppCommon/FileTime.App.Core.Abstraction/UserCommand/AddRemoteContentProviderCommand.cs delete mode 100644 src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentProvider.cs delete mode 100644 src/Providers/FileTime.Providers.LocalAdmin/AdminContentProvider.cs delete mode 100644 src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentWriter.cs delete mode 100644 src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemCreator.cs delete mode 100644 src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemDeleter.cs delete mode 100644 src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemMover.cs diff --git a/src/AppCommon/FileTime.App.Core.Abstraction/UserCommand/AddRemoteContentProviderCommand.cs b/src/AppCommon/FileTime.App.Core.Abstraction/UserCommand/AddRemoteContentProviderCommand.cs new file mode 100644 index 0000000..58388f1 --- /dev/null +++ b/src/AppCommon/FileTime.App.Core.Abstraction/UserCommand/AddRemoteContentProviderCommand.cs @@ -0,0 +1,16 @@ +namespace FileTime.App.Core.UserCommand; + +public class AddRemoteContentProviderCommand : IIdentifiableUserCommand +{ + public const string CommandName = "add_remote_content_provider"; + + public static AddRemoteContentProviderCommand Instance { get; } = new(); + + private AddRemoteContentProviderCommand() + { + + } + + public string UserCommandID => CommandName; + public string Title => "Add Remote Content Provider"; +} \ No newline at end of file diff --git a/src/AppCommon/FileTime.App.Core/StartupServices/DefaultIdentifiableCommandHandlerRegister.cs b/src/AppCommon/FileTime.App.Core/StartupServices/DefaultIdentifiableCommandHandlerRegister.cs index 8fb3576..cbd5f05 100644 --- a/src/AppCommon/FileTime.App.Core/StartupServices/DefaultIdentifiableCommandHandlerRegister.cs +++ b/src/AppCommon/FileTime.App.Core/StartupServices/DefaultIdentifiableCommandHandlerRegister.cs @@ -11,6 +11,7 @@ public class DefaultIdentifiableCommandHandlerRegister : IStartupHandler { _userCommandHandlerService = userCommandHandlerService; + AddUserCommand(AddRemoteContentProviderCommand.Instance); AddUserCommand(CloseTabCommand.Instance); AddUserCommand(CopyCommand.Instance); AddUserCommand(CopyBase64Command.Instance); diff --git a/src/Providers/FileTime.Providers.Local/LocalItemCreator.cs b/src/Providers/FileTime.Providers.Local/LocalItemCreator.cs index 49a8f63..b3637fd 100644 --- a/src/Providers/FileTime.Providers.Local/LocalItemCreator.cs +++ b/src/Providers/FileTime.Providers.Local/LocalItemCreator.cs @@ -8,16 +8,16 @@ namespace FileTime.Providers.Local; public class LocalItemCreator : ItemCreatorBase { private readonly IAdminContentAccessorFactory _adminContentAccessorFactory; - private readonly IAdminContentProvider _adminContentProvider; + private readonly IAdminElevationManager _adminElevationManager; private readonly ILogger _logger; public LocalItemCreator( IAdminContentAccessorFactory adminContentAccessorFactory, - IAdminContentProvider adminContentProvider, + IAdminElevationManager adminElevationManager, ILogger logger) { _adminContentAccessorFactory = adminContentAccessorFactory; - _adminContentProvider = adminContentProvider; + _adminElevationManager = adminElevationManager; _logger = logger; } @@ -46,7 +46,8 @@ public class LocalItemCreator : ItemCreatorBase } var adminItemCreator = await _adminContentAccessorFactory.CreateAdminItemCreatorAsync(); - await adminItemCreator.CreateContainerAsync(_adminContentProvider, fullName); + var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync(); + await adminItemCreator.CreateContainerAsync(remoteContentProvider, fullName); } } @@ -80,7 +81,8 @@ public class LocalItemCreator : ItemCreatorBase } var adminItemCreator = await _adminContentAccessorFactory.CreateAdminItemCreatorAsync(); - await adminItemCreator.CreateElementAsync(_adminContentProvider, fullName); + var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync(); + await adminItemCreator.CreateElementAsync(remoteContentProvider, fullName); } } } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Local/LocalItemDeleter.cs b/src/Providers/FileTime.Providers.Local/LocalItemDeleter.cs index 8a88d2e..205b874 100644 --- a/src/Providers/FileTime.Providers.Local/LocalItemDeleter.cs +++ b/src/Providers/FileTime.Providers.Local/LocalItemDeleter.cs @@ -8,16 +8,16 @@ namespace FileTime.Providers.Local; public class LocalItemDeleter : IItemDeleter { private readonly IAdminContentAccessorFactory _adminContentAccessorFactory; - private readonly IAdminContentProvider _adminContentProvider; + private readonly IAdminElevationManager _adminElevationManager; private readonly ILogger _logger; public LocalItemDeleter( IAdminContentAccessorFactory adminContentAccessorFactory, - IAdminContentProvider adminContentProvider, + IAdminElevationManager adminElevationManager, ILogger logger) { _adminContentAccessorFactory = adminContentAccessorFactory; - _adminContentProvider = adminContentProvider; + _adminElevationManager = adminElevationManager; _logger = logger; } @@ -59,7 +59,8 @@ public class LocalItemDeleter : IItemDeleter } var adminItemDeleter = await _adminContentAccessorFactory.CreateAdminItemDeleterAsync(); - await adminItemDeleter.DeleteAsync(_adminContentProvider, fullName); + var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync(); + await adminItemDeleter.DeleteAsync(remoteContentProvider, fullName); } } } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Local/LocalItemMover.cs b/src/Providers/FileTime.Providers.Local/LocalItemMover.cs index 457083e..d7b9da4 100644 --- a/src/Providers/FileTime.Providers.Local/LocalItemMover.cs +++ b/src/Providers/FileTime.Providers.Local/LocalItemMover.cs @@ -8,16 +8,16 @@ namespace FileTime.Providers.Local; public class LocalItemMover : IItemMover { private readonly IAdminContentAccessorFactory _adminContentAccessorFactory; - private readonly IAdminContentProvider _adminContentProvider; + private readonly IAdminElevationManager _adminElevationManager; private readonly ILogger _logger; public LocalItemMover( IAdminContentAccessorFactory adminContentAccessorFactory, - IAdminContentProvider adminContentProvider, + IAdminElevationManager adminElevationManager, ILogger logger) { _adminContentAccessorFactory = adminContentAccessorFactory; - _adminContentProvider = adminContentProvider; + _adminElevationManager = adminElevationManager; _logger = logger; } @@ -60,7 +60,8 @@ public class LocalItemMover : IItemMover } var adminItemMover = await _adminContentAccessorFactory.CreateAdminItemMoverAsync(); - await adminItemMover.RenameAsync(_adminContentProvider, fullName, newPath); + var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync(); + await adminItemMover.RenameAsync(remoteContentProvider, fullName, newPath); } } } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/FileTime.Providers.LocalAdmin.Abstractions.csproj b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/FileTime.Providers.LocalAdmin.Abstractions.csproj index 51adeda..43bc7e8 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/FileTime.Providers.LocalAdmin.Abstractions.csproj +++ b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/FileTime.Providers.LocalAdmin.Abstractions.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentAccessorFactory.cs b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentAccessorFactory.cs index 664c5a6..8b2aad6 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentAccessorFactory.cs +++ b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentAccessorFactory.cs @@ -6,8 +6,8 @@ namespace FileTime.Providers.LocalAdmin; public interface IAdminContentAccessorFactory { bool IsAdminModeSupported { get; } - Task CreateAdminItemCreatorAsync(); - Task CreateAdminItemDeleterAsync(); - Task CreateAdminItemMoverAsync(); - Task CreateContentWriterAsync(NativePath nativePath); + Task CreateAdminItemCreatorAsync(); + Task CreateAdminItemDeleterAsync(); + Task CreateAdminItemMoverAsync(); + Task CreateContentWriterAsync(NativePath nativePath); } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentProvider.cs b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentProvider.cs deleted file mode 100644 index 43d848e..0000000 --- a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminContentProvider.cs +++ /dev/null @@ -1,8 +0,0 @@ -using FileTime.Core.ContentAccess; - -namespace FileTime.Providers.LocalAdmin; - -public interface IAdminContentProvider : IContentProvider -{ - -} \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminElevationManager.cs b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminElevationManager.cs index be1c805..5ef02a0 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminElevationManager.cs +++ b/src/Providers/FileTime.Providers.LocalAdmin.Abstractions/IAdminElevationManager.cs @@ -1,4 +1,4 @@ -using FileTime.Server.Common; +using FileTime.Providers.Remote; namespace FileTime.Providers.LocalAdmin; @@ -6,7 +6,7 @@ public interface IAdminElevationManager { bool IsAdminModeSupported { get; } bool IsAdminInstanceRunning { get; } - Task CreateConnectionAsync(); + Task GetRemoteContentProviderAsync(); string ProviderName { get; } Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null); } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs b/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs index 9bae09b..43f0f51 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs +++ b/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs @@ -22,34 +22,34 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory public bool IsAdminModeSupported => _adminElevationManager.IsAdminModeSupported; - public async Task CreateAdminItemCreatorAsync() - => await CreateHelperAsync(); + public async Task CreateAdminItemCreatorAsync() + => await CreateHelperAsync(); - public async Task CreateAdminItemDeleterAsync() - => await CreateHelperAsync(); + public async Task CreateAdminItemDeleterAsync() + => await CreateHelperAsync(); - public async Task CreateAdminItemMoverAsync() - => await CreateHelperAsync(); + public async Task CreateAdminItemMoverAsync() + => await CreateHelperAsync(); - public async Task CreateContentWriterAsync(NativePath nativePath) + public async Task CreateContentWriterAsync(NativePath nativePath) { await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync(); - var connection = await _adminElevationManager.CreateConnectionAsync(); + var connection = await _adminElevationManager.GetRemoteContentProviderAsync(); var contentWriter = _serviceProvider.GetInitableResolver( connection, _adminElevationManager.ProviderName, nativePath, Guid.NewGuid() - ).GetRequiredService(); + ).GetRequiredService(); return contentWriter; } private async Task CreateHelperAsync() - where T : class, IInitable + where T : class, IInitable { await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync(); - var connection = await _adminElevationManager.CreateConnectionAsync(); + var connection = await _adminElevationManager.GetRemoteContentProviderAsync(); Debug.Assert(connection != null); diff --git a/src/Providers/FileTime.Providers.LocalAdmin/AdminContentProvider.cs b/src/Providers/FileTime.Providers.LocalAdmin/AdminContentProvider.cs deleted file mode 100644 index 708bf1c..0000000 --- a/src/Providers/FileTime.Providers.LocalAdmin/AdminContentProvider.cs +++ /dev/null @@ -1,29 +0,0 @@ -using FileTime.Core.Enums; -using FileTime.Core.Models; -using FileTime.Core.Timeline; -using FileTime.Providers.Remote; - -namespace FileTime.Providers.LocalAdmin; - -//TODO: this should be a RemoteContentProvider if there will be one -public class AdminContentProvider : RemoteContentProvider, IAdminContentProvider -{ - public AdminContentProvider(ITimelessContentProvider timelessContentProvider) : base(timelessContentProvider, "local", "localAdmin") - { - } - - public override Task GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, AbsolutePathType forceResolvePathType = AbsolutePathType.Unknown, ItemInitializationSettings itemInitializationSettings = default) - => throw new NotImplementedException(); - - public override NativePath GetNativePath(FullName fullName) - => throw new NotImplementedException(); - - public override FullName GetFullName(NativePath nativePath) - => throw new NotImplementedException(); - - public override Task GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default) - => throw new NotImplementedException(); - - public override bool CanHandlePath(NativePath path) - => throw new NotImplementedException(); -} \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.LocalAdmin/AdminElevationManager.cs b/src/Providers/FileTime.Providers.LocalAdmin/AdminElevationManager.cs index d61ca43..a3a4e3e 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin/AdminElevationManager.cs +++ b/src/Providers/FileTime.Providers.LocalAdmin/AdminElevationManager.cs @@ -3,8 +3,9 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using FileTime.App.Core.Services; using FileTime.Core.Interactions; +using FileTime.Core.Timeline; using FileTime.Providers.Local; -using FileTime.Server.Common; +using FileTime.Providers.Remote; using FileTime.Server.Common.Connections.SignalR; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -20,12 +21,14 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan private readonly SemaphoreSlim _lock = new(1, 1); private readonly IUserCommunicationService _dialogService; + private readonly ITimelessContentProvider _timelessContentProvider; private readonly ILogger _logger; private readonly IOptionsMonitor _configuration; private readonly IServiceProvider _serviceProvider; private ConnectionInfo? _connectionInfo; private bool _isAdminInstanceRunning; private Process? _adminProcess; + private RemoteContentProvider? _remoteContentProvider; public bool IsAdminModeSupported => true; private bool StartProcess => _configuration.CurrentValue.StartProcess ?? true; @@ -40,12 +43,14 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan public AdminElevationManager( IUserCommunicationService dialogService, + ITimelessContentProvider timelessContentProvider, ILogger logger, IOptionsMonitor configuration, IServiceProvider serviceProvider ) { _dialogService = dialogService; + _timelessContentProvider = timelessContentProvider; _logger = logger; _configuration = configuration; _serviceProvider = serviceProvider; @@ -126,16 +131,25 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan } } - public async Task CreateConnectionAsync() + //Note: this does not have to return a task + public Task GetRemoteContentProviderAsync() { - ArgumentNullException.ThrowIfNull(_connectionInfo); try { + if (_remoteContentProvider != null) return Task.FromResult((IRemoteContentProvider)_remoteContentProvider); + + ArgumentNullException.ThrowIfNull(_connectionInfo); //TODO: use other connections too (if there will be any) ArgumentNullException.ThrowIfNull(_connectionInfo.SignalRBaseUrl); - var connection = await SignalRConnection.GetOrCreateForAsync(_connectionInfo.SignalRBaseUrl); - return connection; + _remoteContentProvider = new RemoteContentProvider( + _timelessContentProvider, + async () => await SignalRConnection.GetOrCreateForAsync(_connectionInfo.SignalRBaseUrl), + "local", + "localAdminRemote" + ); + + return Task.FromResult((IRemoteContentProvider)_remoteContentProvider); } catch (Exception ex) { @@ -181,8 +195,8 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan try { _logger.LogInformation("Stopping admin process"); - var connection = await CreateConnectionAsync(); - await connection.Exit(); + var connection = await GetRemoteContentProviderAsync(); + await (await connection.GetRemoteConnectionAsync()).Exit(); _logger.LogInformation("Admin process stopped successfully"); } catch (Exception ex) diff --git a/src/Providers/FileTime.Providers.LocalAdmin/FileTime.Providers.LocalAdmin.csproj b/src/Providers/FileTime.Providers.LocalAdmin/FileTime.Providers.LocalAdmin.csproj index 49fc866..466cfbb 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin/FileTime.Providers.LocalAdmin.csproj +++ b/src/Providers/FileTime.Providers.LocalAdmin/FileTime.Providers.LocalAdmin.csproj @@ -11,6 +11,7 @@ + diff --git a/src/Providers/FileTime.Providers.LocalAdmin/Startup.cs b/src/Providers/FileTime.Providers.LocalAdmin/Startup.cs index dfadfb0..4867c1d 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin/Startup.cs +++ b/src/Providers/FileTime.Providers.LocalAdmin/Startup.cs @@ -11,7 +11,6 @@ public static class Startup { services.AddOptions().Bind(configuration.GetSection(AdminElevationConfiguration.SectionName)); services.TryAddSingleton(); - services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(sp => sp.GetRequiredService()); services.AddSingleton(sp => sp.GetRequiredService()); diff --git a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs index 5a71a49..240408d 100644 --- a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs +++ b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs @@ -1,8 +1,9 @@ using FileTime.Core.ContentAccess; +using FileTime.Server.Common; namespace FileTime.Providers.Remote; public interface IRemoteContentProvider : IContentProvider { - + Task GetRemoteConnectionAsync(); } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentWriter.cs b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentWriter.cs deleted file mode 100644 index 3df1127..0000000 --- a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentWriter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FileTime.Core.ContentAccess; -using FileTime.Core.Models; -using FileTime.Server.Common; -using InitableService; - -namespace FileTime.Providers.Remote; - -public interface IRemoteContentWriter : - IContentWriter, - IInitable -{ -} \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemCreator.cs b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemCreator.cs deleted file mode 100644 index 6e12712..0000000 --- a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemCreator.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FileTime.Core.ContentAccess; -using FileTime.Server.Common; -using InitableService; - -namespace FileTime.Providers.Remote; - -public interface IRemoteItemCreator : - IItemCreator, - IInitable -{ - -} \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemDeleter.cs b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemDeleter.cs deleted file mode 100644 index f6518bd..0000000 --- a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemDeleter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FileTime.Core.ContentAccess; -using FileTime.Server.Common; -using InitableService; - -namespace FileTime.Providers.Remote; - -public interface IRemoteItemDeleter : IItemDeleter, IInitable -{ - -} \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemMover.cs b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemMover.cs deleted file mode 100644 index f3c1913..0000000 --- a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteItemMover.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FileTime.Core.ContentAccess; -using FileTime.Server.Common; -using InitableService; - -namespace FileTime.Providers.Remote; - -public interface IRemoteItemMover : IItemMover, IInitable -{ - -} \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/FileTime.Providers.Remote.csproj b/src/Providers/FileTime.Providers.Remote/FileTime.Providers.Remote.csproj index 58f684b..38703c0 100644 --- a/src/Providers/FileTime.Providers.Remote/FileTime.Providers.Remote.csproj +++ b/src/Providers/FileTime.Providers.Remote/FileTime.Providers.Remote.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs b/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs index 635dac2..7599e5d 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs @@ -2,18 +2,25 @@ using FileTime.Core.Enums; using FileTime.Core.Models; using FileTime.Core.Timeline; +using FileTime.Server.Common; namespace FileTime.Providers.Remote; -public class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider +public sealed class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider { + private readonly Func> _remoteConnectionProvider; + public RemoteContentProvider( ITimelessContentProvider timelessContentProvider, + Func> remoteConnectionProvider, string remoteName, string name = "remote") : base(name, timelessContentProvider) { + _remoteConnectionProvider = remoteConnectionProvider; } + public async Task GetRemoteConnectionAsync() + => await _remoteConnectionProvider(); //TODO implement public override Task GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, AbsolutePathType forceResolvePathType = AbsolutePathType.Unknown, ItemInitializationSettings itemInitializationSettings = default) => throw new NotImplementedException(); diff --git a/src/Providers/FileTime.Providers.Remote/RemoteContentWriter.cs b/src/Providers/FileTime.Providers.Remote/RemoteContentWriter.cs index 27a0fc5..40be0d5 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteContentWriter.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteContentWriter.cs @@ -1,24 +1,25 @@ using FileTime.Core.ContentAccess; using FileTime.Core.Models; using FileTime.Server.Common; +using InitableService; namespace FileTime.Providers.Remote; -public class RemoteContentWriter : IRemoteContentWriter +public class RemoteContentWriter : IContentWriter, IInitable { - private IRemoteConnection _remoteConnection = null!; + private IRemoteContentProvider _remoteContentProvider = null!; private string _remoteContentProviderId = null!; private NativePath _nativePath = null!; private string _transactionId = null!; private bool _isRemoteWriterInitialized; public void Init( - IRemoteConnection remoteConnection, + IRemoteContentProvider remoteContentProvider, string remoteContentProviderId, NativePath nativePath, Guid transactionId) { - _remoteConnection = remoteConnection; + _remoteContentProvider = remoteContentProvider; _remoteContentProviderId = remoteContentProviderId; _nativePath = nativePath; _transactionId = transactionId.ToString(); @@ -27,7 +28,7 @@ public class RemoteContentWriter : IRemoteContentWriter public void Dispose() { if (!_isRemoteWriterInitialized) return; - _remoteConnection.CloseWriterAsync(_transactionId); + Task.Run(async () => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CloseWriterAsync(_transactionId)); } public int PreferredBufferSize => 10 * 1024 * 1024; @@ -35,13 +36,13 @@ public class RemoteContentWriter : IRemoteContentWriter public async Task WriteBytesAsync(byte[] data, int? index = null, CancellationToken cancellationToken = default) { if (!_isRemoteWriterInitialized) await InitializeRemoteWriter(_nativePath); - await _remoteConnection.WriteBytesAsync(_transactionId, data, index, cancellationToken); + await (await _remoteContentProvider.GetRemoteConnectionAsync()).WriteBytesAsync(_transactionId, data, index, cancellationToken); } public async Task FlushAsync(CancellationToken cancellationToken = default) { if (!_isRemoteWriterInitialized) return; - await _remoteConnection.FlushWriterAsync(_transactionId, cancellationToken); + await (await _remoteContentProvider.GetRemoteConnectionAsync()).FlushWriterAsync(_transactionId, cancellationToken); } public Stream AsStream() => new ContentAccessStream(this); @@ -49,6 +50,6 @@ public class RemoteContentWriter : IRemoteContentWriter private async Task InitializeRemoteWriter(NativePath nativePath) { _isRemoteWriterInitialized = true; - await _remoteConnection.InitializeRemoteWriter(_remoteContentProviderId, _transactionId, nativePath); + await (await _remoteContentProvider.GetRemoteConnectionAsync()).InitializeRemoteWriter(_remoteContentProviderId, _transactionId, nativePath); } } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs b/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs index 9e6c724..265f1b5 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs @@ -1,24 +1,26 @@ using FileTime.Core.ContentAccess; using FileTime.Core.Models; using FileTime.Server.Common; +using InitableService; namespace FileTime.Providers.Remote; -public class RemoteItemCreator : - ItemCreatorBase, - IRemoteItemCreator +public class RemoteItemCreator : + ItemCreatorBase, + IInitable { - private IRemoteConnection _remoteConnection = null!; + private IRemoteContentProvider _remoteContentProvider = null!; private string _remoteContentProviderId = null!; - public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId) + + public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) { - _remoteConnection = remoteConnection; + _remoteContentProvider = remoteConnection; _remoteContentProviderId = remoteContentProviderId; } - public override async Task CreateContainerAsync(IRemoteContentProvider contentProvider, FullName fullName) - => await _remoteConnection.CreateContainerAsync(_remoteContentProviderId, fullName); + public override async Task CreateContainerAsync(IRemoteContentProvider contentProvider, FullName fullName) + => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateContainerAsync(_remoteContentProviderId, fullName); - public override async Task CreateElementAsync(IRemoteContentProvider contentProvider, FullName fullName) - => await _remoteConnection.CreateElementAsync(_remoteContentProviderId, fullName); + public override async Task CreateElementAsync(IRemoteContentProvider contentProvider, FullName fullName) + => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateElementAsync(_remoteContentProviderId, fullName); } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/RemoteItemDeleter.cs b/src/Providers/FileTime.Providers.Remote/RemoteItemDeleter.cs index cd91e4c..0d3c931 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteItemDeleter.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteItemDeleter.cs @@ -1,17 +1,20 @@ -using FileTime.Core.Models; -using FileTime.Server.Common; +using FileTime.Core.ContentAccess; +using FileTime.Core.Models; +using InitableService; namespace FileTime.Providers.Remote; -public class RemoteItemDeleter : IRemoteItemDeleter +public class RemoteItemDeleter : IItemDeleter, IInitable { - private IRemoteConnection _remoteConnection = null!; + private IRemoteContentProvider _remoteContentProvider = null!; private string _remoteContentProviderId = null!; - public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId) + + public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) { - _remoteConnection = remoteConnection; + _remoteContentProvider = remoteConnection; _remoteContentProviderId = remoteContentProviderId; } - public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName) - => await _remoteConnection.DeleteItemAsync(_remoteContentProviderId, fullName); + + public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName) + => await (await _remoteContentProvider.GetRemoteConnectionAsync()).DeleteItemAsync(_remoteContentProviderId, fullName); } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/RemoteItemMover.cs b/src/Providers/FileTime.Providers.Remote/RemoteItemMover.cs index 768e2c2..9ead497 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteItemMover.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteItemMover.cs @@ -1,19 +1,20 @@ -using FileTime.Core.Models; -using FileTime.Server.Common; +using FileTime.Core.ContentAccess; +using FileTime.Core.Models; +using InitableService; namespace FileTime.Providers.Remote; -public class RemoteItemMover : IRemoteItemMover +public class RemoteItemMover : IItemMover, IInitable { - - private IRemoteConnection _remoteConnection = null!; + private IRemoteContentProvider _remoteContentProvider = null!; private string _remoteContentProviderId = null!; - public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId) + + public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) { - _remoteConnection = remoteConnection; + _remoteContentProvider = remoteConnection; _remoteContentProviderId = remoteContentProviderId; } public async Task RenameAsync(IRemoteContentProvider contentProvider, FullName fullName, FullName newPath) - => await _remoteConnection.MoveItemAsync(_remoteContentProviderId, fullName, newPath); + => await (await _remoteContentProvider.GetRemoteConnectionAsync()).MoveItemAsync(_remoteContentProviderId, fullName, newPath); } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/Startup.cs b/src/Providers/FileTime.Providers.Remote/Startup.cs index 9e77315..e812ef3 100644 --- a/src/Providers/FileTime.Providers.Remote/Startup.cs +++ b/src/Providers/FileTime.Providers.Remote/Startup.cs @@ -8,10 +8,10 @@ public static class Startup public static IServiceCollection AddRemoteProviderServices(this IServiceCollection serviceCollection) { serviceCollection.TryAddSingleton(); - serviceCollection.TryAddTransient(); - serviceCollection.TryAddTransient(); - serviceCollection.TryAddTransient(); - serviceCollection.TryAddTransient(); + serviceCollection.TryAddTransient(); + serviceCollection.TryAddTransient(); + serviceCollection.TryAddTransient(); + serviceCollection.TryAddTransient(); return serviceCollection; } } \ No newline at end of file diff --git a/src/Server/FileTime.Server.App/DummyAdminElevationManager.cs b/src/Server/FileTime.Server.App/DummyAdminElevationManager.cs index c7c2ddf..f4f8af7 100644 --- a/src/Server/FileTime.Server.App/DummyAdminElevationManager.cs +++ b/src/Server/FileTime.Server.App/DummyAdminElevationManager.cs @@ -1,4 +1,5 @@ using FileTime.Providers.LocalAdmin; +using FileTime.Providers.Remote; using FileTime.Server.Common; namespace FileTime.Server.App; @@ -6,7 +7,7 @@ namespace FileTime.Server.App; public class DummyAdminElevationManager : IAdminElevationManager { public bool IsAdminInstanceRunning => throw new NotImplementedException(); - public Task CreateConnectionAsync() => throw new NotImplementedException(); + public Task GetRemoteContentProviderAsync() => throw new NotImplementedException(); public string ProviderName => throw new NotImplementedException(); public Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null) => throw new NotImplementedException();