use crate::{
models::{Account, Invite, MFATicket, Session},
Result, Success,
};
use super::Migration;
#[async_trait]
pub trait AbstractDatabase: std::marker::Sync {
async fn run_migration(&self, migration: Migration) -> Success;
async fn find_account(&self, id: &str) -> Result<Account>;
async fn find_account_by_normalised_email(
&self,
normalised_email: &str,
) -> Result<Option<Account>>;
async fn find_account_with_email_verification(&self, token: &str) -> Result<Account>;
async fn find_account_with_password_reset(&self, token: &str) -> Result<Account>;
async fn find_account_with_deletion_token(&self, token: &str) -> Result<Account>;
async fn find_accounts_due_for_deletion(&self) -> Result<Vec<Account>>;
async fn find_invite(&self, id: &str) -> Result<Invite>;
async fn find_session(&self, id: &str) -> Result<Session>;
async fn find_sessions(&self, user_id: &str) -> Result<Vec<Session>>;
async fn find_sessions_with_subscription(&self, user_ids: &[String]) -> Result<Vec<Session>>;
async fn find_session_by_token(&self, token: &str) -> Result<Option<Session>>;
async fn find_ticket_by_token(&self, token: &str) -> Result<Option<MFATicket>>;
async fn save_account(&self, account: &Account) -> Success;
async fn save_session(&self, session: &Session) -> Success;
async fn save_invite(&self, invite: &Invite) -> Success;
async fn save_ticket(&self, ticket: &MFATicket) -> Success;
async fn delete_session(&self, id: &str) -> Success;
async fn delete_all_sessions(&self, user_id: &str, ignore: Option<String>) -> Success;
async fn delete_ticket(&self, id: &str) -> Success;
}