Connect to SignalR remote provider
This commit is contained in:
@@ -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" />
|
||||||
|
|||||||
@@ -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,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()
|
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;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user