using Explorer.Domain; namespace Explorer.Contracts; public interface IWorkbenchHost { IIndexingHost Indexing { get; } ITransferHost Transfers { get; } ISourceHost Sources { get; } IIndexMutations Mutations { get; } } public interface IIndexingHost { event EventHandler? ProgressChanged; void EnqueueFullScan(long sourceId); void EnqueueFolderScan(long sourceId, string pathRel); void EnqueueReconcile(long sourceId, string pathRel); /// Shallow reconcile, then descend into child folders whose index no longer matches disk. void EnqueueVerify(long sourceId, string pathRel) => EnqueueReconcile(sourceId, pathRel); void Cancel(long sourceId); } public interface ITransferHost { event EventHandler? Changed; event EventHandler? JobFinished; bool IsPaused { get; } IReadOnlyList Snapshot(); void PauseAll(); void ResumeAll(); void Pause(long jobId); void Resume(long jobId); void Retry(long jobId); void Cancel(long jobId); void Dismiss(long jobId); void ClearFinished(); bool MoveUp(long jobId); bool MoveDown(long jobId); Task EnqueueCopyAsync(IReadOnlyList sources, string destinationDirectory, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueMoveAsync(IReadOnlyList sources, string destinationDirectory, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueDeleteAsync(IReadOnlyList paths, bool permanent = false, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueRenameAsync(string path, string newName, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueEmptyRecycleBinAsync(CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueExtractAsync(string archivePath, string destinationDirectory, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueCompressAsync(IReadOnlyList sources, string archivePath, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueAddToArchiveAsync(string archivePath, IReadOnlyList sources, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueVerifyArchiveAsync(string archivePath, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueConvertAsync(string sourcePath, string destinationPath, ConversionKind kind, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueWriteTagsAsync(string path, string payload, CancellationToken cancellationToken = default) => Task.CompletedTask; Task EnqueueMoveToAsync(string source, string destinationPath, CancellationToken cancellationToken = default) => Task.CompletedTask; } public interface ISourceHost { Task RefreshAsync(CancellationToken cancellationToken = default); Task AddUncAsync(string path, CancellationToken cancellationToken = default); Task EnsureForPathAsync(string path, CancellationToken cancellationToken = default); Task ForgetAsync(string path, CancellationToken cancellationToken = default); Task MarkReachableAsync(string path, CancellationToken cancellationToken = default) => Task.FromResult(null); } public interface IIndexMutations { Task UpsertSyncProfileAsync(SyncProfile profile, CancellationToken cancellationToken = default); Task DeleteSyncProfileAsync(long id, CancellationToken cancellationToken = default); Task UpsertOperationProfileAsync(OperationProfile profile, CancellationToken cancellationToken = default); Task DeleteOperationProfileAsync(long id, CancellationToken cancellationToken = default); Task CreateRenameBatchAsync(IReadOnlyList items, CancellationToken cancellationToken = default); Task MarkRenameBatchUndoneAsync(long id, CancellationToken cancellationToken = default); Task EnqueueHashCollisionsAsync(long? sourceId, CancellationToken cancellationToken = default); Task UpsertRelationAsync(FileRelation relation, CancellationToken cancellationToken = default); }