use std::sync::Arc; use domain::ports::{ ActivityQueryPort, EntryDimensionPort, ExtractWriterPort, MoodEntryQueryPort, SharedExtract, }; use domain::user::UserId; use crate::entry::composition::EntryComposer; use crate::errors::ApplicationError; pub struct Deps { pub entries: Arc, pub dimensions: Vec>, pub activities: Arc, pub writer: Arc, } #[tracing::instrument(skip(deps))] pub async fn execute(user_id: UserId, deps: &Deps) -> Result, ApplicationError> { let entries = EntryComposer::new(deps.dimensions.clone()) .compose(deps.entries.find_by_user(&user_id, None, None).await?) .await?; let extract = SharedExtract { entries, activities: deps.activities.find_by_user(&user_id).await?, }; tracing::info!( entries = extract.entries.len(), "writing a shareable extract" ); Ok(deps.writer.write(&extract).await?) }