Connect to SignalR remote provider

This commit is contained in:
2023-08-24 12:32:48 +02:00
parent 72e3d08f5f
commit f1daca788e
9 changed files with 71 additions and 33 deletions

View File

@@ -13,7 +13,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Humanizer.Core" Version="2.14.1" /> <PackageReference Include="Humanizer.Core" Version="2.14.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="morelinq" Version="3.4.2" /> <PackageReference Include="morelinq" Version="3.4.2" />
<PackageReference Include="MvvmGen" Version="1.2.1" /> <PackageReference Include="MvvmGen" Version="1.2.1" />
@@ -33,6 +33,7 @@
<ProjectReference Include="..\..\Library\ObservableComputations.Extensions\ObservableComputations.Extensions.csproj" /> <ProjectReference Include="..\..\Library\ObservableComputations.Extensions\ObservableComputations.Extensions.csproj" />
<ProjectReference Include="..\..\Providers\FileTime.Providers.Local.Abstractions\FileTime.Providers.Local.Abstractions.csproj" /> <ProjectReference Include="..\..\Providers\FileTime.Providers.Local.Abstractions\FileTime.Providers.Local.Abstractions.csproj" />
<ProjectReference Include="..\..\Providers\FileTime.Providers.LocalAdmin.Abstractions\FileTime.Providers.LocalAdmin.Abstractions.csproj" /> <ProjectReference Include="..\..\Providers\FileTime.Providers.LocalAdmin.Abstractions\FileTime.Providers.LocalAdmin.Abstractions.csproj" />
<ProjectReference Include="..\..\Server\FileTime.Server.Common\FileTime.Server.Common.csproj" />
<ProjectReference Include="..\..\Tools\FileTime.Tools\FileTime.Tools.csproj" /> <ProjectReference Include="..\..\Tools\FileTime.Tools\FileTime.Tools.csproj" />
<ProjectReference Include="..\FileTime.App.CommandPalette.Abstractions\FileTime.App.CommandPalette.Abstractions.csproj" /> <ProjectReference Include="..\FileTime.App.CommandPalette.Abstractions\FileTime.App.CommandPalette.Abstractions.csproj" />
<ProjectReference Include="..\FileTime.App.CommandPalette\FileTime.App.CommandPalette.csproj" /> <ProjectReference Include="..\FileTime.App.CommandPalette\FileTime.App.CommandPalette.csproj" />

View File

@@ -9,6 +9,10 @@ using FileTime.Core.Enums;
using FileTime.Core.Interactions; using FileTime.Core.Interactions;
using FileTime.Core.Models; using FileTime.Core.Models;
using FileTime.Core.Timeline; using FileTime.Core.Timeline;
using FileTime.Providers.Remote;
using FileTime.Server.Common;
using FileTime.Server.Common.Connections.SignalR;
using InitableService;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace FileTime.App.Core.Services.UserCommandHandler; namespace FileTime.App.Core.Services.UserCommandHandler;
@@ -24,6 +28,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase
private readonly IContentAccessorFactory _contentAccessorFactory; private readonly IContentAccessorFactory _contentAccessorFactory;
private readonly IContainerSizeScanProvider _containerSizeScanProvider; private readonly IContainerSizeScanProvider _containerSizeScanProvider;
private readonly IProgramsService _programsService; private readonly IProgramsService _programsService;
private readonly IServiceProvider _serviceProvider;
private readonly ILogger<ToolUserCommandHandlerService> _logger; private readonly ILogger<ToolUserCommandHandlerService> _logger;
private IDeclarativeProperty<IContainer?>? _currentLocation; private IDeclarativeProperty<IContainer?>? _currentLocation;
private IDeclarativeProperty<IItemViewModel?>? _currentSelectedItem; private IDeclarativeProperty<IItemViewModel?>? _currentSelectedItem;
@@ -40,6 +45,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase
IContentAccessorFactory contentAccessorFactory, IContentAccessorFactory contentAccessorFactory,
IContainerSizeScanProvider containerSizeScanProvider, IContainerSizeScanProvider containerSizeScanProvider,
IProgramsService programsService, IProgramsService programsService,
IServiceProvider serviceProvider,
ILogger<ToolUserCommandHandlerService> logger) : base(appState) ILogger<ToolUserCommandHandlerService> logger) : base(appState)
{ {
_systemClipboardService = systemClipboardService; _systemClipboardService = systemClipboardService;
@@ -51,6 +57,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase
_contentAccessorFactory = contentAccessorFactory; _contentAccessorFactory = contentAccessorFactory;
_containerSizeScanProvider = containerSizeScanProvider; _containerSizeScanProvider = containerSizeScanProvider;
_programsService = programsService; _programsService = programsService;
_serviceProvider = serviceProvider;
_logger = logger; _logger = logger;
SaveCurrentLocation(l => _currentLocation = l); SaveCurrentLocation(l => _currentLocation = l);
SaveCurrentSelectedItem(i => _currentSelectedItem = i); SaveCurrentSelectedItem(i => _currentSelectedItem = i);
@@ -58,6 +65,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase
AddCommandHandler(new IUserCommandHandler[] AddCommandHandler(new IUserCommandHandler[]
{ {
new TypeUserCommandHandler<AddRemoteContentProviderCommand>(AddRemoteContentProvider),
new TypeUserCommandHandler<OpenInDefaultFileExplorerCommand>(OpenInDefaultFileExplorer), new TypeUserCommandHandler<OpenInDefaultFileExplorerCommand>(OpenInDefaultFileExplorer),
new TypeUserCommandHandler<CopyNativePathCommand>(CopyNativePath), new TypeUserCommandHandler<CopyNativePathCommand>(CopyNativePath),
new TypeUserCommandHandler<CopyBase64Command>(CopyBase64), new TypeUserCommandHandler<CopyBase64Command>(CopyBase64),
@@ -68,9 +76,48 @@ 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<Task<IRemoteConnection>>? 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() 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; return Task.CompletedTask;
var getNext = false; var getNext = false;

View File

@@ -21,7 +21,6 @@
x:DataType="vm:IMainWindowViewModelBase" x:DataType="vm:IMainWindowViewModelBase"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:appCoreModels="using:FileTime.App.Core.Models" xmlns:appCoreModels="using:FileTime.App.Core.Models"
xmlns:converters="clr-namespace:FileTime.GuiApp.App.Converters"
xmlns:corevm="using:FileTime.App.Core.ViewModels" xmlns:corevm="using:FileTime.App.Core.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity" xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"

View File

@@ -46,7 +46,7 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory
} }
private async Task<T> CreateHelperAsync<T>() private async Task<T> CreateHelperAsync<T>()
where T : class, IInitable<IRemoteContentProvider, string> where T : class, IInitable<IRemoteContentProvider>
{ {
await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync(); await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync();
var connection = await _adminElevationManager.GetRemoteContentProviderAsync(); var connection = await _adminElevationManager.GetRemoteContentProviderAsync();
@@ -54,8 +54,7 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory
Debug.Assert(connection != null); Debug.Assert(connection != null);
var helper = _serviceProvider.GetInitableResolver( var helper = _serviceProvider.GetInitableResolver(
connection, connection)
_adminElevationManager.ProviderName)
.GetRequiredService<T>(); .GetRequiredService<T>();
return helper; return helper;
} }

View File

@@ -6,4 +6,5 @@ namespace FileTime.Providers.Remote;
public interface IRemoteContentProvider : IContentProvider public interface IRemoteContentProvider : IContentProvider
{ {
Task<IRemoteConnection> GetRemoteConnectionAsync(); Task<IRemoteConnection> GetRemoteConnectionAsync();
string RemoteProviderName { get; }
} }

View File

@@ -8,15 +8,17 @@ namespace FileTime.Providers.Remote;
public sealed class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider public sealed class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider
{ {
public string RemoteProviderName { get; }
private readonly Func<Task<IRemoteConnection>> _remoteConnectionProvider; private readonly Func<Task<IRemoteConnection>> _remoteConnectionProvider;
public RemoteContentProvider( public RemoteContentProvider(
ITimelessContentProvider timelessContentProvider, ITimelessContentProvider timelessContentProvider,
Func<Task<IRemoteConnection>> remoteConnectionProvider, Func<Task<IRemoteConnection>> remoteConnectionProvider,
string remoteName, string remoteName,
string name = "remote") string name)
: base(name, timelessContentProvider) : base(name, timelessContentProvider)
{ {
RemoteProviderName = remoteName;
_remoteConnectionProvider = remoteConnectionProvider; _remoteConnectionProvider = remoteConnectionProvider;
} }
public async Task<IRemoteConnection> GetRemoteConnectionAsync() public async Task<IRemoteConnection> GetRemoteConnectionAsync()

View File

@@ -7,20 +7,17 @@ namespace FileTime.Providers.Remote;
public class RemoteItemCreator : public class RemoteItemCreator :
ItemCreatorBase<IRemoteContentProvider>, ItemCreatorBase<IRemoteContentProvider>,
IInitable<IRemoteContentProvider, string> IInitable<IRemoteContentProvider>
{ {
private IRemoteContentProvider _remoteContentProvider = null!; private IRemoteContentProvider _remoteContentProvider = null!;
private string _remoteContentProviderId = null!;
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) public void Init(IRemoteContentProvider remoteConnection) => _remoteContentProvider = remoteConnection;
{
_remoteContentProvider = remoteConnection;
_remoteContentProviderId = remoteContentProviderId;
}
public override async Task CreateContainerAsync(IRemoteContentProvider contentProvider, FullName fullName) 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) public override async Task CreateElementAsync(IRemoteContentProvider contentProvider, FullName fullName)
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateElementAsync(_remoteContentProviderId, fullName); => await (await _remoteContentProvider.GetRemoteConnectionAsync())
.CreateElementAsync(_remoteContentProvider.RemoteProviderName, fullName);
} }

View File

@@ -4,17 +4,13 @@ using InitableService;
namespace FileTime.Providers.Remote; namespace FileTime.Providers.Remote;
public class RemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string> public class RemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteContentProvider>
{ {
private IRemoteContentProvider _remoteContentProvider = null!; private IRemoteContentProvider _remoteContentProvider = null!;
private string _remoteContentProviderId = null!;
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) public void Init(IRemoteContentProvider remoteConnection) => _remoteContentProvider = remoteConnection;
{
_remoteContentProvider = remoteConnection;
_remoteContentProviderId = remoteContentProviderId;
}
public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName) public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName)
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).DeleteItemAsync(_remoteContentProviderId, fullName); => await (await _remoteContentProvider.GetRemoteConnectionAsync())
.DeleteItemAsync(_remoteContentProvider.RemoteProviderName, fullName);
} }

View File

@@ -4,17 +4,13 @@ using InitableService;
namespace FileTime.Providers.Remote; namespace FileTime.Providers.Remote;
public class RemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string> public class RemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteContentProvider>
{ {
private IRemoteContentProvider _remoteContentProvider = null!; private IRemoteContentProvider _remoteContentProvider = null!;
private string _remoteContentProviderId = null!;
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId) public void Init(IRemoteContentProvider remoteConnection) => _remoteContentProvider = remoteConnection;
{
_remoteContentProvider = remoteConnection;
_remoteContentProviderId = remoteContentProviderId;
}
public async Task RenameAsync(IRemoteContentProvider contentProvider, FullName fullName, FullName newPath) 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);
} }