use crate::{Error, User, UserId, storage::NewUser};
use async_trait::async_trait;
#[async_trait]
pub trait UserRepository: Send + Sync + 'static {
async fn create(&self, user: NewUser) -> Result<User, Error>;
async fn find_by_id(&self, id: &UserId) -> Result<Option<User>, Error>;
async fn find_by_email(&self, email: &str) -> Result<Option<User>, Error>;
async fn find_or_create_by_email(&self, email: &str) -> Result<User, Error>;
async fn update(&self, user: &User) -> Result<User, Error>;
async fn delete(&self, id: &UserId) -> Result<(), Error>;
async fn mark_email_verified(&self, user_id: &UserId) -> Result<(), Error>;
}