use async_trait::async_trait; use uuid::Uuid; use crate::{ authz::Permission, error::CoreResult, models::{ Album, FaceRegion, Media, MediaBundle, Person, PersonPermission, PublicAlbumBundle, Tag, User, }, schema::{ AddMediaToAlbumData, CreateAlbumData, CreateUserData, ListMediaOptions, LoginUserData, PaginatedResponse, ShareAlbumData, UpdateAlbumData, UploadMediaData, }, }; #[async_trait] pub trait MediaService: Send + Sync { async fn upload_media(&self, data: UploadMediaData<'_>) -> CoreResult; async fn get_media_details(&self, id: Uuid, user_id: Option) -> CoreResult; async fn list_user_media( &self, user_id: Uuid, options: ListMediaOptions, ) -> CoreResult>; async fn get_media_filepath(&self, id: Uuid, user_id: Option) -> CoreResult; async fn get_media_thumbnail_path(&self, id: Uuid, user_id: Option) -> CoreResult; async fn get_media_for_serving(&self, id: Uuid, user_id: Option) -> CoreResult; async fn delete_media(&self, id: Uuid, user_id: Uuid) -> CoreResult<()>; } #[async_trait] pub trait UserService: Send + Sync { async fn register(&self, data: CreateUserData<'_>) -> CoreResult; async fn login(&self, data: LoginUserData<'_>) -> CoreResult; async fn get_user_details(&self, user_id: uuid::Uuid) -> CoreResult; } #[async_trait] pub trait AlbumService: Send + Sync { async fn create_album(&self, data: CreateAlbumData<'_>) -> CoreResult<()>; async fn get_album_details(&self, album_id: Uuid, user_id: Uuid) -> CoreResult; async fn add_media_to_album(&self, data: AddMediaToAlbumData, user_id: Uuid) -> CoreResult<()>; async fn list_user_albums(&self, user_id: Uuid) -> CoreResult>; async fn share_album(&self, data: ShareAlbumData, owner_id: Uuid) -> CoreResult<()>; async fn update_album( &self, album_id: Uuid, user_id: Uuid, data: UpdateAlbumData<'_>, ) -> CoreResult; async fn delete_album(&self, album_id: Uuid, user_id: Uuid) -> CoreResult<()>; async fn get_public_album_bundle(&self, album_id: Uuid) -> CoreResult; async fn set_album_thumbnail( &self, album_id: Uuid, media_id: Uuid, user_id: Uuid, ) -> CoreResult<()>; } #[async_trait] pub trait TagService: Send + Sync { async fn add_tags_to_media( &self, media_id: Uuid, tag_names: &[String], user_id: Uuid, ) -> CoreResult>; async fn remove_tags_from_media( &self, media_id: Uuid, tag_names: &[String], user_id: Uuid, ) -> CoreResult<()>; async fn list_tags_for_media(&self, media_id: Uuid, user_id: Uuid) -> CoreResult>; } #[async_trait] pub trait PersonService: Send + Sync { async fn create_person(&self, name: &str, owner_id: Uuid) -> CoreResult; async fn get_person(&self, person_id: Uuid, user_id: Uuid) -> CoreResult; async fn list_people(&self, user_id: Uuid) -> CoreResult>; async fn update_person(&self, person_id: Uuid, name: &str, user_id: Uuid) -> CoreResult; async fn delete_person(&self, person_id: Uuid, user_id: Uuid) -> CoreResult<()>; async fn assign_face_to_person( &self, face_region_id: Uuid, person_id: Uuid, user_id: Uuid, ) -> CoreResult; async fn list_faces_for_media( &self, media_id: Uuid, user_id: Uuid, ) -> CoreResult>; async fn share_person( &self, person_id: Uuid, target_user_id: Uuid, permission: PersonPermission, owner_id: Uuid, ) -> CoreResult<()>; async fn unshare_person( &self, person_id: Uuid, target_user_id: Uuid, owner_id: Uuid, ) -> CoreResult<()>; async fn merge_people( &self, target_person_id: Uuid, source_person_id: Uuid, user_id: Uuid, ) -> CoreResult<()>; async fn set_person_thumbnail( &self, person_id: Uuid, face_region_id: Uuid, user_id: Uuid, ) -> CoreResult<()>; } #[async_trait] pub trait AuthorizationService: Send + Sync { async fn check_permission( &self, user_id: Option, permission: Permission, ) -> CoreResult<()>; }