use super::RepositoryError; use crate::domain::listing::{ListRequest, Page, SortDirection, SortKey}; use crate::domain::roasters::RoasterSortKey; use crate::domain::roasters::{Roaster, UpdateRoaster}; use crate::domain::roasts::RoastSortKey; use crate::domain::roasts::{Roast, RoastWithRoaster, UpdateRoast}; use crate::domain::timeline::TimelineEvent; use async_trait::async_trait; #[async_trait] pub trait RoasterRepository: Send + Sync { async fn insert(&self, roaster: Roaster) -> Result; async fn get(&self, id: String) -> Result; async fn list( &self, request: &ListRequest, ) -> Result, RepositoryError>; async fn update(&self, id: String, changes: UpdateRoaster) -> Result; async fn delete(&self, id: String) -> Result<(), RepositoryError>; async fn list_all(&self) -> Result, RepositoryError> { let sort_key = ::default(); let request = ListRequest::::show_all(sort_key, sort_key.default_direction()); let page = self.list(&request).await?; Ok(page.items) } async fn list_all_sorted( &self, sort_key: RoasterSortKey, direction: SortDirection, ) -> Result, RepositoryError> { let request = ListRequest::show_all(sort_key, direction); let page = self.list(&request).await?; Ok(page.items) } } #[async_trait] pub trait RoastRepository: Send + Sync { async fn insert(&self, roast: Roast) -> Result; async fn get(&self, id: String) -> Result; async fn list( &self, request: &ListRequest, ) -> Result, RepositoryError>; async fn list_by_roaster( &self, roaster_id: String, ) -> Result, RepositoryError>; async fn update(&self, id: String, changes: UpdateRoast) -> Result; async fn delete(&self, id: String) -> Result<(), RepositoryError>; async fn list_all(&self) -> Result, RepositoryError> { let sort_key = ::default(); let request = ListRequest::::show_all(sort_key, sort_key.default_direction()); let page = self.list(&request).await?; Ok(page.items) } } #[async_trait] pub trait TimelineEventRepository: Send + Sync { async fn list_all(&self) -> Result, RepositoryError>; }