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>
<PackageReference Include="Humanizer.Core" Version="2.14.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="morelinq" Version="3.4.2" />
<PackageReference Include="MvvmGen" Version="1.2.1" />
@@ -33,6 +33,7 @@
<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.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="..\FileTime.App.CommandPalette.Abstractions\FileTime.App.CommandPalette.Abstractions.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.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<ToolUserCommandHandlerService> _logger;
private IDeclarativeProperty<IContainer?>? _currentLocation;
private IDeclarativeProperty<IItemViewModel?>? _currentSelectedItem;
@@ -40,6 +45,7 @@ public class ToolUserCommandHandlerService : UserCommandHandlerServiceBase
IContentAccessorFactory contentAccessorFactory,
IContainerSizeScanProvider containerSizeScanProvider,
IProgramsService programsService,
IServiceProvider serviceProvider,
ILogger<ToolUserCommandHandlerService> 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<AddRemoteContentProviderCommand>(AddRemoteContentProvider),
new TypeUserCommandHandler<OpenInDefaultFileExplorerCommand>(OpenInDefaultFileExplorer),
new TypeUserCommandHandler<CopyNativePathCommand>(CopyNativePath),
new TypeUserCommandHandler<CopyBase64Command>(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<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()
{
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)
{

View File

@@ -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"

View File

@@ -46,7 +46,7 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory
}
private async Task<T> CreateHelperAsync<T>()
where T : class, IInitable<IRemoteContentProvider, string>
where T : class, IInitable<IRemoteContentProvider>
{
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<T>();
return helper;
}

View File

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

View File

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

View File

@@ -7,20 +7,17 @@ namespace FileTime.Providers.Remote;
public class RemoteItemCreator :
ItemCreatorBase<IRemoteContentProvider>,
IInitable<IRemoteContentProvider, string>
IInitable<IRemoteContentProvider>
{
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);
}

View File

@@ -4,17 +4,13 @@ using InitableService;
namespace FileTime.Providers.Remote;
public class RemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
public class RemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteContentProvider>
{
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);
}

View File

@@ -4,17 +4,13 @@ using InitableService;
namespace FileTime.Providers.Remote;
public class RemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
public class RemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteContentProvider>
{
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);
}