use async_trait::async_trait;
use crate::error::WalletResult;
use crate::services::traits::WalletServices;
use crate::storage::action_types::{
StorageCreateActionArgs, StorageCreateActionResult, StorageInternalizeActionArgs,
StorageInternalizeActionResult, StorageProcessActionArgs, StorageProcessActionResult,
};
use crate::storage::traits::provider::StorageProvider;
use crate::storage::TrxToken;
#[async_trait]
pub trait StorageActionProvider: StorageProvider {
async fn create_action(
&self,
auth: &str,
args: &StorageCreateActionArgs,
trx: Option<&TrxToken>,
) -> WalletResult<StorageCreateActionResult> {
let (user, _) = self.find_or_insert_user(auth, trx).await?;
crate::storage::methods::create_action::storage_create_action(self, user.user_id, args, trx)
.await
}
async fn process_action(
&self,
auth: &str,
args: &StorageProcessActionArgs,
trx: Option<&TrxToken>,
) -> WalletResult<StorageProcessActionResult> {
let (user, _) = self.find_or_insert_user(auth, trx).await?;
crate::storage::methods::process_action::storage_process_action(
self,
user.user_id,
args,
trx,
)
.await
}
async fn internalize_action(
&self,
auth: &str,
args: &StorageInternalizeActionArgs,
services: &dyn WalletServices,
trx: Option<&TrxToken>,
) -> WalletResult<StorageInternalizeActionResult> {
let (user, _) = self.find_or_insert_user(auth, trx).await?;
crate::storage::methods::internalize_action::storage_internalize_action(
self,
services,
user.user_id,
args,
trx,
)
.await
}
}
impl<T: StorageProvider> StorageActionProvider for T {}