in-memory storage #32

Merged
quentin merged 65 commits from in-memory into main 2023-12-27 16:35:43 +00:00
3 changed files with 24 additions and 20 deletions
Showing only changes of commit cf8b9ac28d - Show all commits

View file

@ -24,7 +24,7 @@ use crate::storage::*;
pub trait LoginProvider {
/// The login method takes an account's password as an input to decypher
/// decryption keys and obtain full access to the user's account.
async fn login(&self, username: &str, password: &str) -> Result<AnyCredentials>;
async fn login(&self, username: &str, password: &str) -> Result<Credentials>;
/// The public_login method takes an account's email address and returns
/// public credentials for adding mails to the user's inbox.
async fn public_login(&self, email: &str) -> Result<PublicCredentials>;
@ -34,26 +34,12 @@ pub trait LoginProvider {
/// in many places in the code
pub type ArcLoginProvider = Arc<dyn LoginProvider + Send + Sync>;
pub enum AnyCredentials {
InMemory(Credentials<in_memory::MemTypes>),
Garage(Credentials<garage::GrgTypes>),
}
impl<X> AnyCredentials where X: Sto
{
fn to_gen(&self) -> Credentials<X> {
match self {
Self::InMemory(u) => u,
Self::Garage(u) => u,
}
}
}
/// The struct Credentials represent all of the necessary information to interact
/// with a user account's data after they are logged in.
#[derive(Clone, Debug)]
pub struct Credentials<T: Sto> {
pub struct Credentials {
/// The storage credentials are used to authenticate access to the underlying storage (S3, K2V)
pub storage: T::Builder,
pub storage: AnyEngine,
/// The cryptographic keys are used to encrypt and decrypt data stored in S3 and K2V
pub keys: CryptoKeys,
}

View file

@ -32,9 +32,9 @@ const MAILBOX_LIST_SK: &str = "list";
use crate::storage::*;
pub struct User<T: Sto> {
pub struct User {
pub username: String,
pub creds: Credentials<T>,
pub creds: Credentials,
pub k2v: K2vClient,
pub mailboxes: std::sync::Mutex<HashMap<UniqueIdent, Weak<Mailbox>>>,

View file

@ -29,12 +29,30 @@ pub enum Error {
}
pub trait Sto: Sized {
type Builder: RowStore<Self>;
type Builder: RowBuilder<Self>;
type Store: RowStore<Self>;
type Ref: RowRef<Self>;
type Value: RowValue<Self>;
}
pub struct Engine<T: Sto> {
bucket: String,
row: T::Builder,
}
pub enum AnyEngine {
InMemory(Engine<in_memory::MemTypes>),
Garage(Engine<garage::GrgTypes>),
}
impl AnyEngine {
fn engine<X: Sto>(&self) -> &Engine<X> {
match self {
Self::InMemory(x) => x,
Self::Garage(x) => x,
}
}
}
// ------ Row Builder
pub trait RowBuilder<R: Sto>
{