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; _userCommandHandlerService = userCommandHandlerService;
AddUserCommand(AddRemoteContentProviderCommand.Instance);
AddUserCommand(CloseTabCommand.Instance); AddUserCommand(CloseTabCommand.Instance);
AddUserCommand(CopyCommand.Instance); AddUserCommand(CopyCommand.Instance);
AddUserCommand(CopyBase64Command.Instance); AddUserCommand(CopyBase64Command.Instance);

View File

@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider> public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
{ {
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory; private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
private readonly IAdminContentProvider _adminContentProvider; private readonly IAdminElevationManager _adminElevationManager;
private readonly ILogger<LocalItemCreator> _logger; private readonly ILogger<LocalItemCreator> _logger;
public LocalItemCreator( public LocalItemCreator(
IAdminContentAccessorFactory adminContentAccessorFactory, IAdminContentAccessorFactory adminContentAccessorFactory,
IAdminContentProvider adminContentProvider, IAdminElevationManager adminElevationManager,
ILogger<LocalItemCreator> logger) ILogger<LocalItemCreator> logger)
{ {
_adminContentAccessorFactory = adminContentAccessorFactory; _adminContentAccessorFactory = adminContentAccessorFactory;
_adminContentProvider = adminContentProvider; _adminElevationManager = adminElevationManager;
_logger = logger; _logger = logger;
} }
@@ -46,7 +46,8 @@ public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
} }
var adminItemCreator = await _adminContentAccessorFactory.CreateAdminItemCreatorAsync(); 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(); 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> public class LocalItemDeleter : IItemDeleter<ILocalContentProvider>
{ {
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory; private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
private readonly IAdminContentProvider _adminContentProvider; private readonly IAdminElevationManager _adminElevationManager;
private readonly ILogger<LocalItemDeleter> _logger; private readonly ILogger<LocalItemDeleter> _logger;
public LocalItemDeleter( public LocalItemDeleter(
IAdminContentAccessorFactory adminContentAccessorFactory, IAdminContentAccessorFactory adminContentAccessorFactory,
IAdminContentProvider adminContentProvider, IAdminElevationManager adminElevationManager,
ILogger<LocalItemDeleter> logger) ILogger<LocalItemDeleter> logger)
{ {
_adminContentAccessorFactory = adminContentAccessorFactory; _adminContentAccessorFactory = adminContentAccessorFactory;
_adminContentProvider = adminContentProvider; _adminElevationManager = adminElevationManager;
_logger = logger; _logger = logger;
} }
@@ -59,7 +59,8 @@ public class LocalItemDeleter : IItemDeleter<ILocalContentProvider>
} }
var adminItemDeleter = await _adminContentAccessorFactory.CreateAdminItemDeleterAsync(); 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> public class LocalItemMover : IItemMover<ILocalContentProvider>
{ {
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory; private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
private readonly IAdminContentProvider _adminContentProvider; private readonly IAdminElevationManager _adminElevationManager;
private readonly ILogger<LocalItemMover> _logger; private readonly ILogger<LocalItemMover> _logger;
public LocalItemMover( public LocalItemMover(
IAdminContentAccessorFactory adminContentAccessorFactory, IAdminContentAccessorFactory adminContentAccessorFactory,
IAdminContentProvider adminContentProvider, IAdminElevationManager adminElevationManager,
ILogger<LocalItemMover> logger) ILogger<LocalItemMover> logger)
{ {
_adminContentAccessorFactory = adminContentAccessorFactory; _adminContentAccessorFactory = adminContentAccessorFactory;
_adminContentProvider = adminContentProvider; _adminElevationManager = adminElevationManager;
_logger = logger; _logger = logger;
} }
@@ -60,7 +60,8 @@ public class LocalItemMover : IItemMover<ILocalContentProvider>
} }
var adminItemMover = await _adminContentAccessorFactory.CreateAdminItemMoverAsync(); 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> <ItemGroup>
<ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" /> <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> </ItemGroup>
</Project> </Project>

View File

@@ -6,8 +6,8 @@ namespace FileTime.Providers.LocalAdmin;
public interface IAdminContentAccessorFactory public interface IAdminContentAccessorFactory
{ {
bool IsAdminModeSupported { get; } bool IsAdminModeSupported { get; }
Task<IRemoteItemCreator> CreateAdminItemCreatorAsync(); Task<RemoteItemCreator> CreateAdminItemCreatorAsync();
Task<IRemoteItemDeleter> CreateAdminItemDeleterAsync(); Task<RemoteItemDeleter> CreateAdminItemDeleterAsync();
Task<IRemoteItemMover> CreateAdminItemMoverAsync(); Task<RemoteItemMover> CreateAdminItemMoverAsync();
Task<IRemoteContentWriter> CreateContentWriterAsync(NativePath nativePath); 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; namespace FileTime.Providers.LocalAdmin;
@@ -6,7 +6,7 @@ public interface IAdminElevationManager
{ {
bool IsAdminModeSupported { get; } bool IsAdminModeSupported { get; }
bool IsAdminInstanceRunning { get; } bool IsAdminInstanceRunning { get; }
Task<IRemoteConnection> CreateConnectionAsync(); Task<IRemoteContentProvider> GetRemoteContentProviderAsync();
string ProviderName { get; } string ProviderName { get; }
Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null); Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null);
} }

View File

@@ -22,34 +22,34 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory
public bool IsAdminModeSupported => _adminElevationManager.IsAdminModeSupported; public bool IsAdminModeSupported => _adminElevationManager.IsAdminModeSupported;
public async Task<IRemoteItemCreator> CreateAdminItemCreatorAsync() public async Task<RemoteItemCreator> CreateAdminItemCreatorAsync()
=> await CreateHelperAsync<IRemoteItemCreator>(); => await CreateHelperAsync<RemoteItemCreator>();
public async Task<IRemoteItemDeleter> CreateAdminItemDeleterAsync() public async Task<RemoteItemDeleter> CreateAdminItemDeleterAsync()
=> await CreateHelperAsync<IRemoteItemDeleter>(); => await CreateHelperAsync<RemoteItemDeleter>();
public async Task<IRemoteItemMover> CreateAdminItemMoverAsync() public async Task<RemoteItemMover> CreateAdminItemMoverAsync()
=> await CreateHelperAsync<IRemoteItemMover>(); => await CreateHelperAsync<RemoteItemMover>();
public async Task<IRemoteContentWriter> CreateContentWriterAsync(NativePath nativePath) public async Task<RemoteContentWriter> CreateContentWriterAsync(NativePath nativePath)
{ {
await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync(); await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync();
var connection = await _adminElevationManager.CreateConnectionAsync(); var connection = await _adminElevationManager.GetRemoteContentProviderAsync();
var contentWriter = _serviceProvider.GetInitableResolver( var contentWriter = _serviceProvider.GetInitableResolver(
connection, connection,
_adminElevationManager.ProviderName, _adminElevationManager.ProviderName,
nativePath, nativePath,
Guid.NewGuid() Guid.NewGuid()
).GetRequiredService<IRemoteContentWriter>(); ).GetRequiredService<RemoteContentWriter>();
return contentWriter; return contentWriter;
} }
private async Task<T> CreateHelperAsync<T>() private async Task<T> CreateHelperAsync<T>()
where T : class, IInitable<IRemoteConnection, string> where T : class, IInitable<IRemoteContentProvider, string>
{ {
await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync(); await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync();
var connection = await _adminElevationManager.CreateConnectionAsync(); var connection = await _adminElevationManager.GetRemoteContentProviderAsync();
Debug.Assert(connection != null); 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 System.Runtime.CompilerServices;
using FileTime.App.Core.Services; using FileTime.App.Core.Services;
using FileTime.Core.Interactions; using FileTime.Core.Interactions;
using FileTime.Core.Timeline;
using FileTime.Providers.Local; using FileTime.Providers.Local;
using FileTime.Server.Common; using FileTime.Providers.Remote;
using FileTime.Server.Common.Connections.SignalR; using FileTime.Server.Common.Connections.SignalR;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@@ -20,12 +21,14 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
private readonly SemaphoreSlim _lock = new(1, 1); private readonly SemaphoreSlim _lock = new(1, 1);
private readonly IUserCommunicationService _dialogService; private readonly IUserCommunicationService _dialogService;
private readonly ITimelessContentProvider _timelessContentProvider;
private readonly ILogger<AdminElevationManager> _logger; private readonly ILogger<AdminElevationManager> _logger;
private readonly IOptionsMonitor<AdminElevationConfiguration> _configuration; private readonly IOptionsMonitor<AdminElevationConfiguration> _configuration;
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private ConnectionInfo? _connectionInfo; private ConnectionInfo? _connectionInfo;
private bool _isAdminInstanceRunning; private bool _isAdminInstanceRunning;
private Process? _adminProcess; private Process? _adminProcess;
private RemoteContentProvider? _remoteContentProvider;
public bool IsAdminModeSupported => true; public bool IsAdminModeSupported => true;
private bool StartProcess => _configuration.CurrentValue.StartProcess ?? true; private bool StartProcess => _configuration.CurrentValue.StartProcess ?? true;
@@ -40,12 +43,14 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
public AdminElevationManager( public AdminElevationManager(
IUserCommunicationService dialogService, IUserCommunicationService dialogService,
ITimelessContentProvider timelessContentProvider,
ILogger<AdminElevationManager> logger, ILogger<AdminElevationManager> logger,
IOptionsMonitor<AdminElevationConfiguration> configuration, IOptionsMonitor<AdminElevationConfiguration> configuration,
IServiceProvider serviceProvider IServiceProvider serviceProvider
) )
{ {
_dialogService = dialogService; _dialogService = dialogService;
_timelessContentProvider = timelessContentProvider;
_logger = logger; _logger = logger;
_configuration = configuration; _configuration = configuration;
_serviceProvider = serviceProvider; _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 try
{ {
if (_remoteContentProvider != null) return Task.FromResult((IRemoteContentProvider)_remoteContentProvider);
ArgumentNullException.ThrowIfNull(_connectionInfo);
//TODO: use other connections too (if there will be any) //TODO: use other connections too (if there will be any)
ArgumentNullException.ThrowIfNull(_connectionInfo.SignalRBaseUrl); ArgumentNullException.ThrowIfNull(_connectionInfo.SignalRBaseUrl);
var connection = await SignalRConnection.GetOrCreateForAsync(_connectionInfo.SignalRBaseUrl); _remoteContentProvider = new RemoteContentProvider(
return connection; _timelessContentProvider,
async () => await SignalRConnection.GetOrCreateForAsync(_connectionInfo.SignalRBaseUrl),
"local",
"localAdminRemote"
);
return Task.FromResult((IRemoteContentProvider)_remoteContentProvider);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -181,8 +195,8 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
try try
{ {
_logger.LogInformation("Stopping admin process"); _logger.LogInformation("Stopping admin process");
var connection = await CreateConnectionAsync(); var connection = await GetRemoteContentProviderAsync();
await connection.Exit(); await (await connection.GetRemoteConnectionAsync()).Exit();
_logger.LogInformation("Admin process stopped successfully"); _logger.LogInformation("Admin process stopped successfully");
} }
catch (Exception ex) catch (Exception ex)

View File

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

View File

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

View File

@@ -1,8 +1,9 @@
using FileTime.Core.ContentAccess; using FileTime.Core.ContentAccess;
using FileTime.Server.Common;
namespace FileTime.Providers.Remote; namespace FileTime.Providers.Remote;
public interface IRemoteContentProvider : IContentProvider 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> <ItemGroup>
<ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" /> <ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" />
<ProjectReference Include="..\..\Core\FileTime.Core.ContentAccess\FileTime.Core.ContentAccess.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" /> <ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -2,18 +2,25 @@
using FileTime.Core.Enums; using FileTime.Core.Enums;
using FileTime.Core.Models; using FileTime.Core.Models;
using FileTime.Core.Timeline; using FileTime.Core.Timeline;
using FileTime.Server.Common;
namespace FileTime.Providers.Remote; namespace FileTime.Providers.Remote;
public class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider public sealed class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider
{ {
private readonly Func<Task<IRemoteConnection>> _remoteConnectionProvider;
public RemoteContentProvider( public RemoteContentProvider(
ITimelessContentProvider timelessContentProvider, ITimelessContentProvider timelessContentProvider,
Func<Task<IRemoteConnection>> remoteConnectionProvider,
string remoteName, string remoteName,
string name = "remote") string name = "remote")
: base(name, timelessContentProvider) : base(name, timelessContentProvider)
{ {
_remoteConnectionProvider = remoteConnectionProvider;
} }
public async Task<IRemoteConnection> GetRemoteConnectionAsync()
=> await _remoteConnectionProvider();
//TODO implement //TODO implement
public override Task<IItem> GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, AbsolutePathType forceResolvePathType = AbsolutePathType.Unknown, ItemInitializationSettings itemInitializationSettings = default) => throw new NotImplementedException(); 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.ContentAccess;
using FileTime.Core.Models; using FileTime.Core.Models;
using FileTime.Server.Common; using FileTime.Server.Common;
using InitableService;
namespace FileTime.Providers.Remote; 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 string _remoteContentProviderId = null!;
private NativePath _nativePath = null!; private NativePath _nativePath = null!;
private string _transactionId = null!; private string _transactionId = null!;
private bool _isRemoteWriterInitialized; private bool _isRemoteWriterInitialized;
public void Init( public void Init(
IRemoteConnection remoteConnection, IRemoteContentProvider remoteContentProvider,
string remoteContentProviderId, string remoteContentProviderId,
NativePath nativePath, NativePath nativePath,
Guid transactionId) Guid transactionId)
{ {
_remoteConnection = remoteConnection; _remoteContentProvider = remoteContentProvider;
_remoteContentProviderId = remoteContentProviderId; _remoteContentProviderId = remoteContentProviderId;
_nativePath = nativePath; _nativePath = nativePath;
_transactionId = transactionId.ToString(); _transactionId = transactionId.ToString();
@@ -27,7 +28,7 @@ public class RemoteContentWriter : IRemoteContentWriter
public void Dispose() public void Dispose()
{ {
if (!_isRemoteWriterInitialized) return; if (!_isRemoteWriterInitialized) return;
_remoteConnection.CloseWriterAsync(_transactionId); Task.Run(async () => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CloseWriterAsync(_transactionId));
} }
public int PreferredBufferSize => 10 * 1024 * 1024; 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) public async Task WriteBytesAsync(byte[] data, int? index = null, CancellationToken cancellationToken = default)
{ {
if (!_isRemoteWriterInitialized) await InitializeRemoteWriter(_nativePath); 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) public async Task FlushAsync(CancellationToken cancellationToken = default)
{ {
if (!_isRemoteWriterInitialized) return; if (!_isRemoteWriterInitialized) return;
await _remoteConnection.FlushWriterAsync(_transactionId, cancellationToken); await (await _remoteContentProvider.GetRemoteConnectionAsync()).FlushWriterAsync(_transactionId, cancellationToken);
} }
public Stream AsStream() => new ContentAccessStream(this); public Stream AsStream() => new ContentAccessStream(this);
@@ -49,6 +50,6 @@ public class RemoteContentWriter : IRemoteContentWriter
private async Task InitializeRemoteWriter(NativePath nativePath) private async Task InitializeRemoteWriter(NativePath nativePath)
{ {
_isRemoteWriterInitialized = true; _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.ContentAccess;
using FileTime.Core.Models; using FileTime.Core.Models;
using FileTime.Server.Common; using FileTime.Server.Common;
using InitableService;
namespace FileTime.Providers.Remote; namespace FileTime.Providers.Remote;
public class RemoteItemCreator : public class RemoteItemCreator :
ItemCreatorBase<IRemoteContentProvider>, ItemCreatorBase<IRemoteContentProvider>,
IRemoteItemCreator IInitable<IRemoteContentProvider, string>
{ {
private IRemoteConnection _remoteConnection = null!; private IRemoteContentProvider _remoteContentProvider = null!;
private string _remoteContentProviderId = 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; _remoteContentProviderId = remoteContentProviderId;
} }
public override async Task CreateContainerAsync(IRemoteContentProvider contentProvider, FullName fullName) 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) 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.Core.ContentAccess;
using FileTime.Server.Common; using FileTime.Core.Models;
using InitableService;
namespace FileTime.Providers.Remote; 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!; private string _remoteContentProviderId = null!;
public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId)
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId)
{ {
_remoteConnection = remoteConnection; _remoteContentProvider = remoteConnection;
_remoteContentProviderId = remoteContentProviderId; _remoteContentProviderId = remoteContentProviderId;
} }
public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName) 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.Core.ContentAccess;
using FileTime.Server.Common; using FileTime.Core.Models;
using InitableService;
namespace FileTime.Providers.Remote; namespace FileTime.Providers.Remote;
public class RemoteItemMover : IRemoteItemMover public class RemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
{ {
private IRemoteContentProvider _remoteContentProvider = null!;
private IRemoteConnection _remoteConnection = null!;
private string _remoteContentProviderId = 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; _remoteContentProviderId = remoteContentProviderId;
} }
public async Task RenameAsync(IRemoteContentProvider contentProvider, FullName fullName, FullName newPath) 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) public static IServiceCollection AddRemoteProviderServices(this IServiceCollection serviceCollection)
{ {
serviceCollection.TryAddSingleton<IRemoteContentProvider, RemoteContentProvider>(); serviceCollection.TryAddSingleton<IRemoteContentProvider, RemoteContentProvider>();
serviceCollection.TryAddTransient<IRemoteItemCreator, RemoteItemCreator>(); serviceCollection.TryAddTransient<RemoteItemCreator>();
serviceCollection.TryAddTransient<IRemoteItemDeleter, RemoteItemDeleter>(); serviceCollection.TryAddTransient<RemoteItemDeleter>();
serviceCollection.TryAddTransient<IRemoteItemMover, RemoteItemMover>(); serviceCollection.TryAddTransient<RemoteItemMover>();
serviceCollection.TryAddTransient<IRemoteContentWriter, RemoteContentWriter>(); serviceCollection.TryAddTransient<RemoteContentWriter>();
return serviceCollection; return serviceCollection;
} }
} }

View File

@@ -1,4 +1,5 @@
using FileTime.Providers.LocalAdmin; using FileTime.Providers.LocalAdmin;
using FileTime.Providers.Remote;
using FileTime.Server.Common; using FileTime.Server.Common;
namespace FileTime.Server.App; namespace FileTime.Server.App;
@@ -6,7 +7,7 @@ namespace FileTime.Server.App;
public class DummyAdminElevationManager : IAdminElevationManager public class DummyAdminElevationManager : IAdminElevationManager
{ {
public bool IsAdminInstanceRunning => throw new NotImplementedException(); 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 string ProviderName => throw new NotImplementedException();
public Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null) => throw new NotImplementedException(); public Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null) => throw new NotImplementedException();