Refactor AdminContentProvider

This commit is contained in:
2023-08-24 10:37:04 +02:00
parent 5c62419f65
commit c2668d7270
27 changed files with 132 additions and 161 deletions

View File

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

View File

@@ -11,6 +11,7 @@ public class DefaultIdentifiableCommandHandlerRegister : IStartupHandler
{
_userCommandHandlerService = userCommandHandlerService;
AddUserCommand(AddRemoteContentProviderCommand.Instance);
AddUserCommand(CloseTabCommand.Instance);
AddUserCommand(CopyCommand.Instance);
AddUserCommand(CopyBase64Command.Instance);

View File

@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
{
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
private readonly IAdminContentProvider _adminContentProvider;
private readonly IAdminElevationManager _adminElevationManager;
private readonly ILogger<LocalItemCreator> _logger;
public LocalItemCreator(
IAdminContentAccessorFactory adminContentAccessorFactory,
IAdminContentProvider adminContentProvider,
IAdminElevationManager adminElevationManager,
ILogger<LocalItemCreator> logger)
{
_adminContentAccessorFactory = adminContentAccessorFactory;
_adminContentProvider = adminContentProvider;
_adminElevationManager = adminElevationManager;
_logger = logger;
}
@@ -46,7 +46,8 @@ public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
}
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<ILocalContentProvider>
}
var adminItemCreator = await _adminContentAccessorFactory.CreateAdminItemCreatorAsync();
await adminItemCreator.CreateElementAsync(_adminContentProvider, fullName);
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
await adminItemCreator.CreateElementAsync(remoteContentProvider, fullName);
}
}
}

View File

@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
public class LocalItemDeleter : IItemDeleter<ILocalContentProvider>
{
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
private readonly IAdminContentProvider _adminContentProvider;
private readonly IAdminElevationManager _adminElevationManager;
private readonly ILogger<LocalItemDeleter> _logger;
public LocalItemDeleter(
IAdminContentAccessorFactory adminContentAccessorFactory,
IAdminContentProvider adminContentProvider,
IAdminElevationManager adminElevationManager,
ILogger<LocalItemDeleter> logger)
{
_adminContentAccessorFactory = adminContentAccessorFactory;
_adminContentProvider = adminContentProvider;
_adminElevationManager = adminElevationManager;
_logger = logger;
}
@@ -59,7 +59,8 @@ public class LocalItemDeleter : IItemDeleter<ILocalContentProvider>
}
var adminItemDeleter = await _adminContentAccessorFactory.CreateAdminItemDeleterAsync();
await adminItemDeleter.DeleteAsync(_adminContentProvider, fullName);
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
await adminItemDeleter.DeleteAsync(remoteContentProvider, fullName);
}
}
}

View File

@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
public class LocalItemMover : IItemMover<ILocalContentProvider>
{
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
private readonly IAdminContentProvider _adminContentProvider;
private readonly IAdminElevationManager _adminElevationManager;
private readonly ILogger<LocalItemMover> _logger;
public LocalItemMover(
IAdminContentAccessorFactory adminContentAccessorFactory,
IAdminContentProvider adminContentProvider,
IAdminElevationManager adminElevationManager,
ILogger<LocalItemMover> logger)
{
_adminContentAccessorFactory = adminContentAccessorFactory;
_adminContentProvider = adminContentProvider;
_adminElevationManager = adminElevationManager;
_logger = logger;
}
@@ -60,7 +60,8 @@ public class LocalItemMover : IItemMover<ILocalContentProvider>
}
var adminItemMover = await _adminContentAccessorFactory.CreateAdminItemMoverAsync();
await adminItemMover.RenameAsync(_adminContentProvider, fullName, newPath);
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
await adminItemMover.RenameAsync(remoteContentProvider, fullName, newPath);
}
}
}

View File

@@ -9,7 +9,7 @@
<ItemGroup>
<ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" />
<ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
<ProjectReference Include="..\FileTime.Providers.Remote\FileTime.Providers.Remote.csproj" />
</ItemGroup>
</Project>

View File

@@ -6,8 +6,8 @@ namespace FileTime.Providers.LocalAdmin;
public interface IAdminContentAccessorFactory
{
bool IsAdminModeSupported { get; }
Task<IRemoteItemCreator> CreateAdminItemCreatorAsync();
Task<IRemoteItemDeleter> CreateAdminItemDeleterAsync();
Task<IRemoteItemMover> CreateAdminItemMoverAsync();
Task<IRemoteContentWriter> CreateContentWriterAsync(NativePath nativePath);
Task<RemoteItemCreator> CreateAdminItemCreatorAsync();
Task<RemoteItemDeleter> CreateAdminItemDeleterAsync();
Task<RemoteItemMover> CreateAdminItemMoverAsync();
Task<RemoteContentWriter> CreateContentWriterAsync(NativePath nativePath);
}

View File

@@ -1,8 +0,0 @@
using FileTime.Core.ContentAccess;
namespace FileTime.Providers.LocalAdmin;
public interface IAdminContentProvider : IContentProvider
{
}

View File

@@ -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<IRemoteConnection> CreateConnectionAsync();
Task<IRemoteContentProvider> GetRemoteContentProviderAsync();
string ProviderName { get; }
Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null);
}

View File

@@ -22,34 +22,34 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory
public bool IsAdminModeSupported => _adminElevationManager.IsAdminModeSupported;
public async Task<IRemoteItemCreator> CreateAdminItemCreatorAsync()
=> await CreateHelperAsync<IRemoteItemCreator>();
public async Task<RemoteItemCreator> CreateAdminItemCreatorAsync()
=> await CreateHelperAsync<RemoteItemCreator>();
public async Task<IRemoteItemDeleter> CreateAdminItemDeleterAsync()
=> await CreateHelperAsync<IRemoteItemDeleter>();
public async Task<RemoteItemDeleter> CreateAdminItemDeleterAsync()
=> await CreateHelperAsync<RemoteItemDeleter>();
public async Task<IRemoteItemMover> CreateAdminItemMoverAsync()
=> await CreateHelperAsync<IRemoteItemMover>();
public async Task<RemoteItemMover> CreateAdminItemMoverAsync()
=> await CreateHelperAsync<RemoteItemMover>();
public async Task<IRemoteContentWriter> CreateContentWriterAsync(NativePath nativePath)
public async Task<RemoteContentWriter> 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<IRemoteContentWriter>();
).GetRequiredService<RemoteContentWriter>();
return contentWriter;
}
private async Task<T> CreateHelperAsync<T>()
where T : class, IInitable<IRemoteConnection, string>
where T : class, IInitable<IRemoteContentProvider, string>
{
await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync();
var connection = await _adminElevationManager.CreateConnectionAsync();
var connection = await _adminElevationManager.GetRemoteContentProviderAsync();
Debug.Assert(connection != null);

View File

@@ -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<IItem> 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<byte[]?> GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default)
=> throw new NotImplementedException();
public override bool CanHandlePath(NativePath path)
=> throw new NotImplementedException();
}

View File

@@ -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<AdminElevationManager> _logger;
private readonly IOptionsMonitor<AdminElevationConfiguration> _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<AdminElevationManager> logger,
IOptionsMonitor<AdminElevationConfiguration> 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<IRemoteConnection> CreateConnectionAsync()
//Note: this does not have to return a task
public Task<IRemoteContentProvider> 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)

View File

@@ -11,6 +11,7 @@
<ProjectReference Include="..\..\Server\FileTime.Server.Common\FileTime.Server.Common.csproj" />
<ProjectReference Include="..\FileTime.Providers.Local.Abstractions\FileTime.Providers.Local.Abstractions.csproj" />
<ProjectReference Include="..\FileTime.Providers.LocalAdmin.Abstractions\FileTime.Providers.LocalAdmin.Abstractions.csproj" />
<ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
<ProjectReference Include="..\FileTime.Providers.Remote\FileTime.Providers.Remote.csproj" />
</ItemGroup>

View File

@@ -11,7 +11,6 @@ public static class Startup
{
services.AddOptions<AdminElevationConfiguration>().Bind(configuration.GetSection(AdminElevationConfiguration.SectionName));
services.TryAddSingleton<IAdminContentAccessorFactory, AdminContentAccessorFactory>();
services.TryAddSingleton<IAdminContentProvider, AdminContentProvider>();
services.TryAddSingleton<AdminElevationManager>();
services.TryAddSingleton<IAdminElevationManager>(sp => sp.GetRequiredService<AdminElevationManager>());
services.AddSingleton<IExitHandler>(sp => sp.GetRequiredService<AdminElevationManager>());

View File

@@ -1,8 +1,9 @@
using FileTime.Core.ContentAccess;
using FileTime.Server.Common;
namespace FileTime.Providers.Remote;
public interface IRemoteContentProvider : IContentProvider
{
Task<IRemoteConnection> GetRemoteConnectionAsync();
}

View File

@@ -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<IRemoteConnection, string, NativePath, Guid>
{
}

View File

@@ -1,12 +0,0 @@
using FileTime.Core.ContentAccess;
using FileTime.Server.Common;
using InitableService;
namespace FileTime.Providers.Remote;
public interface IRemoteItemCreator :
IItemCreator<IRemoteContentProvider>,
IInitable<IRemoteConnection, string>
{
}

View File

@@ -1,10 +0,0 @@
using FileTime.Core.ContentAccess;
using FileTime.Server.Common;
using InitableService;
namespace FileTime.Providers.Remote;
public interface IRemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteConnection, string>
{
}

View File

@@ -1,10 +0,0 @@
using FileTime.Core.ContentAccess;
using FileTime.Server.Common;
using InitableService;
namespace FileTime.Providers.Remote;
public interface IRemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteConnection, string>
{
}

View File

@@ -9,6 +9,7 @@
<ItemGroup>
<ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" />
<ProjectReference Include="..\..\Core\FileTime.Core.ContentAccess\FileTime.Core.ContentAccess.csproj" />
<ProjectReference Include="..\..\Server\FileTime.Server.Common.Abstractions\FileTime.Server.Common.Abstractions.csproj" />
<ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
</ItemGroup>

View File

@@ -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<Task<IRemoteConnection>> _remoteConnectionProvider;
public RemoteContentProvider(
ITimelessContentProvider timelessContentProvider,
Func<Task<IRemoteConnection>> remoteConnectionProvider,
string remoteName,
string name = "remote")
: base(name, timelessContentProvider)
{
_remoteConnectionProvider = remoteConnectionProvider;
}
public async Task<IRemoteConnection> GetRemoteConnectionAsync()
=> await _remoteConnectionProvider();
//TODO implement
public override Task<IItem> GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, AbsolutePathType forceResolvePathType = AbsolutePathType.Unknown, ItemInitializationSettings itemInitializationSettings = default) => throw new NotImplementedException();

View File

@@ -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<IRemoteContentProvider, string, NativePath, Guid>
{
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);
}
}

View File

@@ -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<IRemoteContentProvider>,
IRemoteItemCreator
IInitable<IRemoteContentProvider, string>
{
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);
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateContainerAsync(_remoteContentProviderId, fullName);
public override async Task CreateElementAsync(IRemoteContentProvider contentProvider, FullName fullName)
=> await _remoteConnection.CreateElementAsync(_remoteContentProviderId, fullName);
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateElementAsync(_remoteContentProviderId, fullName);
}

View File

@@ -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<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
{
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);
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).DeleteItemAsync(_remoteContentProviderId, fullName);
}

View File

@@ -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<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
{
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);
}

View File

@@ -8,10 +8,10 @@ public static class Startup
public static IServiceCollection AddRemoteProviderServices(this IServiceCollection serviceCollection)
{
serviceCollection.TryAddSingleton<IRemoteContentProvider, RemoteContentProvider>();
serviceCollection.TryAddTransient<IRemoteItemCreator, RemoteItemCreator>();
serviceCollection.TryAddTransient<IRemoteItemDeleter, RemoteItemDeleter>();
serviceCollection.TryAddTransient<IRemoteItemMover, RemoteItemMover>();
serviceCollection.TryAddTransient<IRemoteContentWriter, RemoteContentWriter>();
serviceCollection.TryAddTransient<RemoteItemCreator>();
serviceCollection.TryAddTransient<RemoteItemDeleter>();
serviceCollection.TryAddTransient<RemoteItemMover>();
serviceCollection.TryAddTransient<RemoteContentWriter>();
return serviceCollection;
}
}

View File

@@ -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<IRemoteConnection> CreateConnectionAsync() => throw new NotImplementedException();
public Task<IRemoteContentProvider> GetRemoteContentProviderAsync() => throw new NotImplementedException();
public string ProviderName => throw new NotImplementedException();
public Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null) => throw new NotImplementedException();