use std::string::String;
use std::vec::Vec;
use crate::core::storage_provider::AsyncStorageItemStream;
use crate::core::errors::StorageResult;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct StoredPasskey {
pub id: String,
pub user_id: String,
pub name: String,
pub credential_id: Vec<u8>,
pub credential_public_key: Vec<u8>,
pub counter: u32,
pub created_at: i64,
pub last_used_at: Option<i64>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct StoredTosAcceptance {
pub user_id: String,
pub tos_version: String,
pub accepted_at: i64,
pub ip_address: Option<String>,
}
pub trait PasskeyStore {
fn store_passkey(&self, passkey: &StoredPasskey) -> Result<(), String>;
fn find_passkeys_by_user(&self, user_id: &str) -> Result<Vec<StoredPasskey>, String>;
fn find_passkey_by_id(&self, passkey_id: &str) -> Result<Option<StoredPasskey>, String>;
fn find_passkey_by_credential_id(&self, credential_id: &[u8]) -> Result<Option<StoredPasskey>, String>;
fn update_passkey_counter(&self, passkey_id: &str, counter: u32) -> Result<(), String>;
fn update_passkey_name(&self, passkey_id: &str, name: &str) -> Result<(), String>;
fn delete_passkey(&self, passkey_id: &str) -> Result<(), String>;
}
pub trait TosStore {
fn store_tos_acceptance(&self, acceptance: &StoredTosAcceptance) -> Result<(), String>;
fn find_tos_acceptance(&self, user_id: &str, tos_version: &str) -> Result<Option<StoredTosAcceptance>, String>;
fn find_latest_tos_acceptance(&self, user_id: &str) -> Result<Option<StoredTosAcceptance>, String>;
}
pub trait AuthStore: PasskeyStore + TosStore {
fn find_user_by_email(&self, email: &str) -> Result<Option<(String, bool)>, String>;
}
#[async_trait::async_trait]
pub trait AsyncPasskeyStore {
async fn store_passkey_async(&self, passkey: &StoredPasskey) -> Result<(), String>;
async fn find_passkeys_by_user_async<'a>(&'a self, user_id: &'a str) -> StorageResult<AsyncStorageItemStream<'a, StoredPasskey>>;
async fn find_passkey_by_id_async<'a>(&'a self, passkey_id: &'a str) -> StorageResult<Option<StoredPasskey>>;
async fn find_passkey_by_credential_id_async<'a>(&'a self, credential_id: &'a [u8]) -> StorageResult<Option<StoredPasskey>>;
async fn update_passkey_counter_async(&self, passkey_id: &str, counter: u32) -> Result<(), String>;
async fn update_passkey_name_async(&self, passkey_id: &str, name: &str) -> Result<(), String>;
async fn delete_passkey_async(&self, passkey_id: &str) -> Result<(), String>;
}
#[async_trait::async_trait]
pub trait AsyncTosStore {
async fn store_tos_acceptance_async(&self, acceptance: &StoredTosAcceptance) -> Result<(), String>;
async fn find_tos_acceptance_async<'a>(&'a self, user_id: &'a str, tos_version: &'a str) -> StorageResult<Option<StoredTosAcceptance>>;
async fn find_latest_tos_acceptance_async<'a>(&'a self, user_id: &'a str) -> StorageResult<Option<StoredTosAcceptance>>;
}
#[async_trait::async_trait]
pub trait AsyncAuthStore: AsyncPasskeyStore + AsyncTosStore {
async fn find_user_by_email_async(&self, email: &str) -> StorageResult<Option<(String, bool)>>;
}