use std::result::Result; use uuid::Uuid; use crate::common::errors::DomainError; use crate::domain::entities::contact::{Contact, ContactGroup}; pub type ContactRepositoryResult = Result; pub trait ContactRepository: Send + Sync + 'static { async fn create_contact(&self, contact: Contact) -> ContactRepositoryResult; async fn update_contact(&self, contact: Contact) -> ContactRepositoryResult; async fn delete_contact(&self, id: &Uuid) -> ContactRepositoryResult<()>; async fn get_contact_by_id(&self, id: &Uuid) -> ContactRepositoryResult>; async fn get_contact_by_uid( &self, address_book_id: &Uuid, uid: &str, ) -> ContactRepositoryResult>; /// Fetches the contacts matching any of the given vCard UIDs in one /// indexed query (`uid = ANY(...)`). Used by CardDAV multiget so a /// request for a handful of contacts never pays for the whole book. /// UIDs with no matching contact are silently absent from the result. async fn get_contacts_by_uids( &self, address_book_id: &Uuid, uids: &[String], ) -> ContactRepositoryResult>; async fn get_contacts_by_address_book( &self, address_book_id: &Uuid, ) -> ContactRepositoryResult>; /// Same as [`Self::get_contacts_by_address_book`] but bounded by /// `LIMIT`/`OFFSET` for paginated listings. async fn get_contacts_by_address_book_paginated( &self, address_book_id: &Uuid, limit: i64, offset: i64, ) -> ContactRepositoryResult>; async fn get_contacts_by_email(&self, email: &str) -> ContactRepositoryResult>; async fn get_contacts_by_group(&self, group_id: &Uuid) -> ContactRepositoryResult>; async fn search_contacts( &self, address_book_id: &Uuid, query: &str, ) -> ContactRepositoryResult>; } pub trait ContactGroupRepository: Send + Sync + 'static { async fn create_group(&self, group: ContactGroup) -> ContactRepositoryResult; async fn update_group(&self, group: ContactGroup) -> ContactRepositoryResult; async fn delete_group(&self, id: &Uuid) -> ContactRepositoryResult<()>; async fn get_group_by_id(&self, id: &Uuid) -> ContactRepositoryResult>; async fn get_groups_by_address_book( &self, address_book_id: &Uuid, ) -> ContactRepositoryResult>; async fn add_contact_to_group( &self, group_id: &Uuid, contact_id: &Uuid, ) -> ContactRepositoryResult<()>; async fn remove_contact_from_group( &self, group_id: &Uuid, contact_id: &Uuid, ) -> ContactRepositoryResult<()>; async fn get_contacts_in_group(&self, group_id: &Uuid) -> ContactRepositoryResult>; async fn get_groups_for_contact( &self, contact_id: &Uuid, ) -> ContactRepositoryResult>; }