use crate::plugin_registry::InMemoryPluginRegistry; use crate::plugins::{ DirectoryScannerPlugin, MetadataExtractorPlugin, NoOpPlugin, SidecarSyncPlugin, ThumbnailGeneratorPlugin, }; use application::catalog::RegisterAssetHandler; use domain::ports::{ EventPublisher, MetadataExtractorPort, SidecarWriterPort, ThumbnailGeneratorPort, }; use std::sync::Arc; use super::Repos; pub fn build_plugin_registry( repos: &Repos, file_storage: Arc, sidecar_writer: Arc, extractor: Arc, thumbnail_gen: Arc, event_pub: Arc, ) -> InMemoryPluginRegistry { let mut registry = InMemoryPluginRegistry::new(); registry.register(Arc::new(NoOpPlugin)); registry.register(Arc::new(MetadataExtractorPlugin::new( repos.asset.clone(), file_storage.clone(), repos.metadata.clone(), extractor, ))); registry.register(Arc::new(ThumbnailGeneratorPlugin::new( repos.asset.clone(), file_storage.clone(), repos.derivative.clone(), thumbnail_gen, ))); let register_handler = Arc::new(RegisterAssetHandler::new( repos.asset.clone(), repos.duplicate.clone(), event_pub, )); registry.register(Arc::new(DirectoryScannerPlugin::new( repos.volume.clone(), repos.library_path.clone(), file_storage.clone(), register_handler, ))); let export_handler = Arc::new(application::sidecar::ExportSidecarHandler::new( repos.metadata.clone(), repos.sidecar.clone(), sidecar_writer, )); registry.register(Arc::new(SidecarSyncPlugin::new(export_handler))); registry }