use async_trait::async_trait;
use email_address::EmailAddress;
use fistinc_errors::RepositoryResult;
use fistinc_paging::{Paging, QueryParams};
use phonenumber::PhoneNumber;
use uuid::Uuid;
use crate::domain::entity::User;
#[async_trait]
pub trait UserRepository: Send + Sync {
async fn find_all(
&self, params: &dyn QueryParams,
) -> RepositoryResult<Paging<User>>;
async fn find(&self, user_id: Uuid) -> RepositoryResult<Option<User>>;
async fn find_by_email(&self, email: &EmailAddress) -> RepositoryResult<Option<User>>;
async fn find_by_phone(&self, phone: &PhoneNumber) -> RepositoryResult<Option<User>>;
async fn create(&self, user: &User) -> RepositoryResult<()>;
async fn update(&self, user: &User) -> RepositoryResult<()>;
async fn delete(&self, user_id: Uuid) -> RepositoryResult<()>;
}