Files
michaelschiemer/docs/discovery-filesystem-integration.md
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

297 lines
9.1 KiB
Markdown

# Integration von Discovery und Filesystem Modulen
Dieses Dokument beschreibt die Integration des Discovery-Moduls mit dem Filesystem-Modul, um Codeduplizierung zu reduzieren, die Robustheit zu verbessern und erweiterte Funktionen zu nutzen.
## Überblick
Die Integration umfasst folgende Komponenten:
1. **FileMetadata**: Eine erweiterte FileMetadata-Klasse im Filesystem-Modul, die Core Value Objects nutzt
2. **DiscoveryStorage**: Ein spezialisiertes Storage-Interface für Discovery-Operationen
3. **FileSystemDiscoveryStorage**: Eine Implementierung des DiscoveryStorage-Interfaces
4. **FileScannerService**: Der bestehende Service, aktualisiert für die Nutzung des Filesystem-Moduls
5. **FileScannerServiceBootstrapper**: Ein Bootstrapper für den FileScannerService
6. **UnifiedDiscoveryService**: Der bestehende Service, aktualisiert für die Nutzung des FileScannerServiceBootstrapper
## Vorteile der Integration
- **Vermeidung von Code-Duplizierung**: Einheitliche Abstraktion für Dateisystem-Operationen
- **Verbesserte Robustheit**: Konsistente Fehlerbehandlung und Ausnahmen
- **Leistungsoptimierung**: Nutzung von Batch- und Async-Funktionen des Filesystem-Moduls
- **Bessere Testbarkeit**: Einheitliche Mocking-Strategie für Dateisystem-Operationen
- **Erweiterte Funktionalität**: Zugriff auf fortschrittliche Features wie Dateisystem-Events
## Komponenten im Detail
### FileMetadata
Die erweiterte `FileMetadata`-Klasse im Filesystem-Modul vereint die Funktionalität der vorherigen FileMetadata-Klassen und nutzt Core-ValueObjects für eine robustere Implementierung.
```php
namespace App\Framework\Filesystem;
use App\Framework\Core\ValueObjects\Byte;
use App\Framework\Core\ValueObjects\Hash;
use App\Framework\Core\ValueObjects\HashAlgorithm;
use App\Framework\Core\ValueObjects\Timestamp;
final readonly class FileMetadata
{
public function __construct(
public FilePath|string $path = '',
public Byte|int $size = 0,
public Timestamp|int $lastModified = 0,
public ?Hash $checksum = null,
public ?Timestamp $scanTime = null,
public string $mimeType = '',
public bool $isReadable = false,
public bool $isWritable = false,
public array $additionalData = []
) {
}
// Methoden für Erstellung, Konvertierung, Prüfung auf Änderungen, etc.
}
```
### DiscoveryStorage Interface
Das `DiscoveryStorage`-Interface erweitert das Standard-Storage-Interface mit Discovery-spezifischen Methoden.
```php
namespace App\Framework\Discovery\Storage;
use App\Framework\Filesystem\Storage;
use App\Framework\Filesystem\FileMetadata;
use SplFileInfo;
interface DiscoveryStorage extends Storage
{
/**
* Findet geänderte Dateien seit dem letzten Scan
*/
public function findChangedFiles(string $directory, array $fileMetadata): array;
/**
* Führt einen inkrementellen Scan durch
*/
public function incrementalScan(string $directory, array $fileMetadata): array;
/**
* Findet alle Dateien mit einem bestimmten Muster
*/
public function findFiles(string $directory, string $pattern): array;
/**
* Erstellt Metadaten für eine Datei
*/
public function getDiscoveryMetadata(string $filePath, bool $calculateChecksum = true): FileMetadata;
/**
* Erstellt Metadaten für mehrere Dateien parallel
*/
public function getDiscoveryMetadataMultiple(array $filePaths, bool $calculateChecksum = true): array;
/**
* Registriert Dateisystem-Events für Änderungserkennung
*/
public function registerFileSystemEvents(string $directory, callable $callback): bool;
}
```
### FileSystemDiscoveryStorage
Die `FileSystemDiscoveryStorage`-Klasse implementiert das DiscoveryStorage-Interface und delegiert Standard-Storage-Operationen an eine zugrundeliegende Storage-Implementierung.
```php
namespace App\Framework\Discovery\Storage;
use App\Framework\Async\FiberManager;
use App\Framework\Filesystem\File;
use App\Framework\Filesystem\Directory;
use App\Framework\Filesystem\FileMetadata;
use App\Framework\Filesystem\PermissionChecker;
use App\Framework\Filesystem\Storage;
use SplFileInfo;
final class FileSystemDiscoveryStorage implements DiscoveryStorage
{
/**
* @param Storage $storage Basis-Storage-Implementierung für Delegation
* @param PermissionChecker $permissions Permissions-Checker
* @param FiberManager $fiberManager Fiber-Manager für asynchrone Operationen
*/
public function __construct(
private readonly Storage $storage,
public readonly PermissionChecker $permissions = new PermissionChecker(),
public readonly FiberManager $fiberManager = new FiberManager()
) {
}
// Implementierung der Storage-Methoden durch Delegation
/**
* {@inheritdoc}
*/
public function getDiscoveryMetadata(string $filePath, bool $calculateChecksum = true): FileMetadata
{
return FileMetadata::fromFile($filePath, $this, $calculateChecksum);
}
// Weitere Implementierungen der Discovery-spezifischen Methoden
}
```
### FileScannerService
Der `FileScannerService` wurde aktualisiert, um das DiscoveryStorage-Interface zu nutzen, wenn verfügbar, mit Fallback auf die alte Implementierung für Abwärtskompatibilität.
```php
namespace App\Framework\Discovery;
use App\Framework\Discovery\Storage\DiscoveryStorage;
final class FileScannerService
{
public function __construct(
private readonly FileScannerInterface $fileScanner,
private readonly PathProvider $pathProvider,
private readonly Cache $cache,
private readonly bool $useCache = true,
// weitere Parameter
private readonly ?DiscoveryStorage $storage = null
) {
// Initialisierung
}
// Methoden für Scanning, Verarbeitung, Caching, etc.
// mit Nutzung von DiscoveryStorage wenn verfügbar
}
```
### FileScannerServiceBootstrapper
Der `FileScannerServiceBootstrapper` erstellt und konfiguriert den FileScannerService mit den richtigen Abhängigkeiten.
```php
namespace App\Framework\Discovery;
use App\Framework\Filesystem\FilesystemManager;
final class FileScannerServiceBootstrapper
{
public function __construct(
private readonly FilesystemManager $filesystemManager,
// weitere Parameter
) {
}
public function create(
bool $useCache = true,
// weitere Parameter
): FileScannerService {
// Erstelle DiscoveryStorage und FileScannerService
}
public static function createDefault(
FilesystemManager $filesystemManager,
// weitere Parameter
): FileScannerService {
// Factory-Methode für einfache Erstellung
}
}
```
### UnifiedDiscoveryService
Der `UnifiedDiscoveryService` wurde aktualisiert, um den FileScannerServiceBootstrapper zu nutzen.
```php
namespace App\Framework\Discovery;
use App\Framework\Filesystem\FilesystemManager;
final readonly class UnifiedDiscoveryService
{
public function __construct(
FilesystemManager $filesystemManager,
// weitere Parameter
) {
// Erstelle FileScannerService mit Bootstrapper
}
// Methoden für Discovery, Caching, Health-Checks, etc.
}
```
## Verwendung
### Einfache Verwendung mit Standard-Konfiguration
```php
// Container-Konfiguration
$container->singleton(UnifiedDiscoveryService::class, function (Container $container) {
return new UnifiedDiscoveryService(
$container->get(FilesystemManager::class),
$container->get(PathProvider::class),
$container->get(Cache::class),
$container->get(Clock::class),
// weitere Parameter mit Standardwerten
);
});
// Verwendung
$discoveryService = $container->get(UnifiedDiscoveryService::class);
$results = $discoveryService->discover();
```
### Erweiterte Konfiguration
```php
// Manuelle Erstellung mit angepasster Konfiguration
$bootstrapper = new FileScannerServiceBootstrapper(
$filesystemManager,
$pathProvider,
$cache,
$logger
);
$fileScannerService = $bootstrapper->create(
useCache: true,
asyncProcessing: true,
chunkSize: 200,
maxRetries: 5,
enableAdaptiveChunking: true,
storageName: 'custom_storage'
);
// Verwendung des FileScannerService direkt
$fileScannerService->scan(true); // mit Fortschrittsanzeige
```
### Verwendung des DiscoveryStorage direkt
```php
// Erstelle DiscoveryStorage
$storage = new FileSystemDiscoveryStorage(
$filesystemManager->storage('default')
);
// Finde geänderte Dateien
$changedFiles = $storage->findChangedFiles('/path/to/directory', $existingMetadata);
// Hole Metadaten für eine Datei
$metadata = $storage->getDiscoveryMetadata('/path/to/file.php', true);
// Hole Metadaten für mehrere Dateien parallel
$metadataMap = $storage->getDiscoveryMetadataMultiple([
'/path/to/file1.php',
'/path/to/file2.php',
'/path/to/file3.php'
]);
```
## Fazit
Die Integration des Discovery-Moduls mit dem Filesystem-Modul bietet zahlreiche Vorteile in Bezug auf Codeduplizierung, Robustheit, Leistung und Funktionalität. Die Implementierung ist abwärtskompatibel, sodass bestehender Code weiterhin funktioniert, während neue Code die verbesserte Funktionalität nutzen kann.