use std::{rc::Rc, sync::Arc};
use matrix_sdk_base::media::store::MediaService;
use matrix_sdk_store_encryption::StoreCipher;
use crate::{
media_store::{
IndexeddbMediaStore, error::IndexeddbMediaStoreError, migrations::open_and_upgrade_db,
},
serializer::{indexed_type::IndexedTypeSerializer, safe_encode::types::SafeEncodeSerializer},
};
pub struct IndexeddbMediaStoreBuilder {
database_name: String,
store_cipher: Option<Arc<StoreCipher>>,
}
impl Default for IndexeddbMediaStoreBuilder {
fn default() -> Self {
Self { database_name: Self::DEFAULT_DATABASE_NAME.to_owned(), store_cipher: None }
}
}
impl IndexeddbMediaStoreBuilder {
pub const DEFAULT_DATABASE_NAME: &'static str = "media";
pub fn with_prefix(prefix: &str) -> Self {
Self {
database_name: format!("{}::{}", prefix, Self::DEFAULT_DATABASE_NAME),
store_cipher: None,
}
}
pub fn database_name(mut self, name: String) -> Self {
self.database_name = name;
self
}
pub fn store_cipher(mut self, store_cipher: Arc<StoreCipher>) -> Self {
self.store_cipher = Some(store_cipher);
self
}
pub async fn build(self) -> Result<IndexeddbMediaStore, IndexeddbMediaStoreError> {
Ok(IndexeddbMediaStore {
inner: Rc::new(open_and_upgrade_db(&self.database_name).await?),
serializer: IndexedTypeSerializer::new(SafeEncodeSerializer::new(self.store_cipher)),
media_service: MediaService::new(),
})
}
}