Refactor AdminContentProvider
This commit is contained in:
@@ -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";
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
using FileTime.Core.ContentAccess;
|
|
||||||
|
|
||||||
namespace FileTime.Providers.LocalAdmin;
|
|
||||||
|
|
||||||
public interface IAdminContentProvider : IContentProvider
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>());
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
@@ -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>
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user