From f1daca788ee38cfe9d14fe5ba84937fadcea14c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Thu, 24 Aug 2023 12:32:48 +0200 Subject: [PATCH] Connect to SignalR remote provider --- .../FileTime.App.Core.csproj | 3 +- .../ToolUserCommandHandlerService.cs | 51 ++++++++++++++++++- .../Views/MainWindow.axaml | 1 - .../AdminContentAccessorFactory.cs | 5 +- .../IRemoteContentProvider.cs | 1 + .../RemoteContentProvider.cs | 4 +- .../RemoteItemCreator.cs | 15 +++--- .../RemoteItemDeleter.cs | 12 ++--- .../RemoteItemMover.cs | 12 ++--- 9 files changed, 71 insertions(+), 33 deletions(-) diff --git a/src/AppCommon/FileTime.App.Core/FileTime.App.Core.csproj b/src/AppCommon/FileTime.App.Core/FileTime.App.Core.csproj index c8371a9..8f3dcfc 100644 --- a/src/AppCommon/FileTime.App.Core/FileTime.App.Core.csproj +++ b/src/AppCommon/FileTime.App.Core/FileTime.App.Core.csproj @@ -13,7 +13,7 @@ - + @@ -33,6 +33,7 @@ + diff --git a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ToolUserCommandHandlerService.cs b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ToolUserCommandHandlerService.cs index 1ff7e98..6d1b0c0 100644 --- a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ToolUserCommandHandlerService.cs +++ b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ToolUserCommandHandlerService.cs @@ -9,6 +9,10 @@ using FileTime.Core.Enums; using FileTime.Core.Interactions; using FileTime.Core.Models; using FileTime.Core.Timeline; +using FileTime.Providers.Remote; +using FileTime.Server.Common; +using FileTime.Server.Common.Connections.SignalR; +using InitableService; using Microsoft.Extensions.Logging; namespace FileTime.App.Core.Services.UserCommandHandler; @@ -24,6 +28,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase private readonly IContentAccessorFactory _contentAccessorFactory; private readonly IContainerSizeScanProvider _containerSizeScanProvider; private readonly IProgramsService _programsService; + private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; private IDeclarativeProperty? _currentLocation; private IDeclarativeProperty? _currentSelectedItem; @@ -40,6 +45,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase IContentAccessorFactory contentAccessorFactory, IContainerSizeScanProvider containerSizeScanProvider, IProgramsService programsService, + IServiceProvider serviceProvider, ILogger logger) : base(appState) { _systemClipboardService = systemClipboardService; @@ -51,6 +57,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase _contentAccessorFactory = contentAccessorFactory; _containerSizeScanProvider = containerSizeScanProvider; _programsService = programsService; + _serviceProvider = serviceProvider; _logger = logger; SaveCurrentLocation(l => _currentLocation = l); SaveCurrentSelectedItem(i => _currentSelectedItem = i); @@ -58,6 +65,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase AddCommandHandler(new IUserCommandHandler[] { + new TypeUserCommandHandler(AddRemoteContentProvider), new TypeUserCommandHandler(OpenInDefaultFileExplorer), new TypeUserCommandHandler(CopyNativePath), new TypeUserCommandHandler(CopyBase64), @@ -68,11 +76,50 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase }); } + private async Task AddRemoteContentProvider() + { + var containerNameInput = new TextInputElement("Path"); + var providerName = new TextInputElement("Provider name") + { + Value = "remote_" + Guid.NewGuid().ToString("N") + }; + var inputs = new IInputElement[] {containerNameInput, providerName}; + var result = await _userCommunicationService.ReadInputs(inputs); + + if (!result) return; + + var path = containerNameInput.Value!; + + Func>? connection = null; + if (path.StartsWith("http")) + { + connection = async () => await SignalRConnection.GetOrCreateForAsync(path); + } + + if (connection is null) + { + _userCommunicationService.ShowToastMessage("Unknown path type"); + return; + } + + if (string.IsNullOrWhiteSpace(providerName.Value)) + { + _userCommunicationService.ShowToastMessage("Provider name can not be empty"); + return; + } + + var remoteContentProvider = new RemoteContentProvider( + _timelessContentProvider, + connection, + "local", + providerName.Value); + } + private Task Edit() { - if ( _currentSelectedTab?.CurrentSelectedItem.Value?.BaseItem is not IElement {NativePath: { } filePath}) + if (_currentSelectedTab?.CurrentSelectedItem.Value?.BaseItem is not IElement {NativePath: { } filePath}) return Task.CompletedTask; - + var getNext = false; while (true) { diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml index 968c8de..8ca6ad5 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml @@ -21,7 +21,6 @@ x:DataType="vm:IMainWindowViewModelBase" xmlns="https://github.com/avaloniaui" xmlns:appCoreModels="using:FileTime.App.Core.Models" - xmlns:converters="clr-namespace:FileTime.GuiApp.App.Converters" xmlns:corevm="using:FileTime.App.Core.ViewModels" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity" diff --git a/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs b/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs index 43f0f51..257743a 100644 --- a/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs +++ b/src/Providers/FileTime.Providers.LocalAdmin/AdminContentAccessorFactory.cs @@ -46,7 +46,7 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory } private async Task CreateHelperAsync() - where T : class, IInitable + where T : class, IInitable { await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync(); var connection = await _adminElevationManager.GetRemoteContentProviderAsync(); @@ -54,8 +54,7 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory Debug.Assert(connection != null); var helper = _serviceProvider.GetInitableResolver( - connection, - _adminElevationManager.ProviderName) + connection) .GetRequiredService(); return helper; } diff --git a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs index 240408d..82321b5 100644 --- a/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs +++ b/src/Providers/FileTime.Providers.Remote.Abstractions/IRemoteContentProvider.cs @@ -6,4 +6,5 @@ namespace FileTime.Providers.Remote; public interface IRemoteContentProvider : IContentProvider { Task GetRemoteConnectionAsync(); + string RemoteProviderName { get; } } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs b/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs index 7599e5d..791560d 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs @@ -8,15 +8,17 @@ namespace FileTime.Providers.Remote; public sealed class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider { + public string RemoteProviderName { get; } private readonly Func> _remoteConnectionProvider; public RemoteContentProvider( ITimelessContentProvider timelessContentProvider, Func> remoteConnectionProvider, string remoteName, - string name = "remote") + string name) : base(name, timelessContentProvider) { + RemoteProviderName = remoteName; _remoteConnectionProvider = remoteConnectionProvider; } public async Task GetRemoteConnectionAsync() diff --git a/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs b/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs index 265f1b5..6609db9 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteItemCreator.cs @@ -7,20 +7,17 @@ namespace FileTime.Providers.Remote; public class RemoteItemCreator : ItemCreatorBase, - IInitable + IInitable { private IRemoteContentProvider _remoteContentProvider = null!; - private string _remoteContentProviderId = null!; - public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) - { - _remoteContentProvider = remoteConnection; - _remoteContentProviderId = remoteContentProviderId; - } + public void Init(IRemoteContentProvider remoteConnection) => _remoteContentProvider = remoteConnection; public override async Task CreateContainerAsync(IRemoteContentProvider contentProvider, FullName fullName) - => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateContainerAsync(_remoteContentProviderId, fullName); + => await (await _remoteContentProvider.GetRemoteConnectionAsync()) + .CreateContainerAsync(_remoteContentProvider.RemoteProviderName, fullName); public override async Task CreateElementAsync(IRemoteContentProvider contentProvider, FullName fullName) - => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateElementAsync(_remoteContentProviderId, fullName); + => await (await _remoteContentProvider.GetRemoteConnectionAsync()) + .CreateElementAsync(_remoteContentProvider.RemoteProviderName, 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 0d3c931..3144b4d 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteItemDeleter.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteItemDeleter.cs @@ -4,17 +4,13 @@ using InitableService; namespace FileTime.Providers.Remote; -public class RemoteItemDeleter : IItemDeleter, IInitable +public class RemoteItemDeleter : IItemDeleter, IInitable { private IRemoteContentProvider _remoteContentProvider = null!; - private string _remoteContentProviderId = null!; - public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) - { - _remoteContentProvider = remoteConnection; - _remoteContentProviderId = remoteContentProviderId; - } + public void Init(IRemoteContentProvider remoteConnection) => _remoteContentProvider = remoteConnection; public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName) - => await (await _remoteContentProvider.GetRemoteConnectionAsync()).DeleteItemAsync(_remoteContentProviderId, fullName); + => await (await _remoteContentProvider.GetRemoteConnectionAsync()) + .DeleteItemAsync(_remoteContentProvider.RemoteProviderName, 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 9ead497..3f0c1f5 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteItemMover.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteItemMover.cs @@ -4,17 +4,13 @@ using InitableService; namespace FileTime.Providers.Remote; -public class RemoteItemMover : IItemMover, IInitable +public class RemoteItemMover : IItemMover, IInitable { private IRemoteContentProvider _remoteContentProvider = null!; - private string _remoteContentProviderId = null!; - public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) - { - _remoteContentProvider = remoteConnection; - _remoteContentProviderId = remoteContentProviderId; - } + public void Init(IRemoteContentProvider remoteConnection) => _remoteContentProvider = remoteConnection; public async Task RenameAsync(IRemoteContentProvider contentProvider, FullName fullName, FullName newPath) - => await (await _remoteContentProvider.GetRemoteConnectionAsync()).MoveItemAsync(_remoteContentProviderId, fullName, newPath); + => await (await _remoteContentProvider.GetRemoteConnectionAsync()) + .MoveItemAsync(_remoteContentProvider.RemoteProviderName, fullName, newPath); } \ No newline at end of file