app: add catalog commands/queries (RegisterAsset, UpdateMetadata, GetTimeline, GetAsset)

This commit is contained in:
2026-05-31 05:13:47 +02:00
parent 4549d746c3
commit 536bf3463a
15 changed files with 471 additions and 1 deletions

View File

@@ -0,0 +1,37 @@
use std::sync::Arc;
use domain::{
catalog::entities::Asset,
catalog::services::resolve_metadata,
errors::DomainError,
ports::{AssetRepository, AssetMetadataRepository},
value_objects::{StructuredData, SystemId},
};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct GetAssetQuery {
pub asset_id: SystemId,
}
pub struct GetAssetHandler {
asset_repo: Arc<dyn AssetRepository>,
metadata_repo: Arc<dyn AssetMetadataRepository>,
}
impl GetAssetHandler {
pub fn new(
asset_repo: Arc<dyn AssetRepository>,
metadata_repo: Arc<dyn AssetMetadataRepository>,
) -> Self {
Self { asset_repo, metadata_repo }
}
pub async fn execute(&self, query: GetAssetQuery) -> Result<(Asset, StructuredData), DomainError> {
let asset = self.asset_repo.find_by_id(&query.asset_id).await?
.ok_or_else(|| DomainError::NotFound(format!("Asset {} not found", query.asset_id)))?;
let layers = self.metadata_repo.find_by_asset(&asset.asset_id).await?;
let resolved = resolve_metadata(&layers);
Ok((asset, resolved))
}
}

View File

@@ -0,0 +1,42 @@
use std::sync::Arc;
use domain::{
catalog::entities::Asset,
catalog::services::resolve_metadata,
errors::DomainError,
ports::{AssetRepository, AssetMetadataRepository},
value_objects::{StructuredData, SystemId},
};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct GetTimelineQuery {
pub owner_id: SystemId,
pub limit: u32,
pub offset: u32,
}
pub struct GetTimelineHandler {
asset_repo: Arc<dyn AssetRepository>,
metadata_repo: Arc<dyn AssetMetadataRepository>,
}
impl GetTimelineHandler {
pub fn new(
asset_repo: Arc<dyn AssetRepository>,
metadata_repo: Arc<dyn AssetMetadataRepository>,
) -> Self {
Self { asset_repo, metadata_repo }
}
pub async fn execute(&self, query: GetTimelineQuery) -> Result<Vec<(Asset, StructuredData)>, DomainError> {
let assets = self.asset_repo.find_by_owner(&query.owner_id, query.limit, query.offset).await?;
let mut results = Vec::with_capacity(assets.len());
for asset in assets {
let layers = self.metadata_repo.find_by_asset(&asset.asset_id).await?;
let resolved = resolve_metadata(&layers);
results.push((asset, resolved));
}
Ok(results)
}
}

View File

@@ -0,0 +1,2 @@
pub mod get_timeline;
pub mod get_asset;