feat: real XMP sidecar adapter, replaces LogSidecarWriter stubs

- adapters-sidecar: XmpSidecarWriter using xmp_toolkit
- Writes StructuredData → XMP with EXIF/DC/XMP namespace routing
- Reads XMP back to StructuredData
- Wired into bootstrap + worker, deleted both LogSidecarWriter stubs
This commit is contained in:
2026-05-31 21:05:46 +02:00
parent d379f3d3c8
commit f85c0cb246
12 changed files with 304 additions and 53 deletions

View File

@@ -1,4 +1,3 @@
pub mod config;
pub mod factory;
pub mod log_sidecar_writer;
pub mod services;

View File

@@ -1,21 +0,0 @@
use async_trait::async_trait;
use domain::{errors::DomainError, ports::SidecarWriterPort, value_objects::StructuredData};
pub struct LogSidecarWriter;
#[async_trait]
impl SidecarWriterPort for LogSidecarWriter {
fn format_name(&self) -> &str {
"log_noop"
}
async fn write_sidecar(&self, _data: &StructuredData, path: &str) -> Result<(), DomainError> {
tracing::info!(path, "sidecar write (no-op)");
Ok(())
}
async fn read_sidecar(&self, path: &str) -> Result<StructuredData, DomainError> {
tracing::info!(path, "sidecar read (no-op)");
Ok(StructuredData::new())
}
}

View File

@@ -3,7 +3,6 @@ use tracing::info;
mod config;
mod factory;
mod log_sidecar_writer;
mod services;
#[tokio::main]

View File

@@ -9,13 +9,12 @@ use application::sidecar::{
};
use presentation::state::SidecarHandlers;
use crate::log_sidecar_writer::LogSidecarWriter;
pub fn build(pool: &PgPool) -> SidecarHandlers {
let metadata_repo = Arc::new(PostgresAssetMetadataRepository::new(pool.clone()));
let asset_repo = Arc::new(PostgresAssetRepository::new(pool.clone()));
let sidecar_repo = Arc::new(PostgresSidecarRepository::new(pool.clone()));
let sidecar_writer: Arc<LogSidecarWriter> = Arc::new(LogSidecarWriter);
let sidecar_writer: Arc<adapters_sidecar::XmpSidecarWriter> =
Arc::new(adapters_sidecar::XmpSidecarWriter);
let export = Arc::new(ExportSidecarHandler::new(
metadata_repo.clone(),