use crate::api::MmexContext;
use crate::domain::tags::{Tag, TagId};
use crate::domain::transactions::{
SplitTransaction, Transaction, TransactionError, TransactionId, TransactionUpdate,
};
use crate::MmexError;
use std::sync::{Arc, Mutex};
#[derive(uniffi::Object)]
pub struct TransactionManager {
pub(crate) context: Arc<Mutex<MmexContext>>,
}
#[uniffi::export]
impl TransactionManager {
pub fn get_all(&self) -> Result<Vec<Transaction>, TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
Ok(ctx.transactions().get_all_transactions()?)
}
pub fn get_by_id(&self, id: i64) -> Result<Option<Transaction>, TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
Ok(ctx
.transactions()
.get_transaction_by_id(TransactionId { v1: id })?)
}
pub fn create(&self, transaction: Transaction) -> Result<Transaction, TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
Ok(ctx.transactions().create_transaction(&transaction)?)
}
pub fn update(&self, transaction: Transaction) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions().update_transaction(&transaction)?;
Ok(())
}
pub fn update_partial(
&self,
id: i64,
update: TransactionUpdate,
) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions()
.update_transaction_partial(TransactionId { v1: id }, update)?;
Ok(())
}
pub fn delete(&self, id: i64) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions()
.delete_transaction(TransactionId { v1: id })?;
Ok(())
}
pub fn get_tags(&self, transaction_id: i64) -> Result<Vec<Tag>, TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
Ok(ctx
.transactions()
.get_tags_for_transaction(TransactionId { v1: transaction_id })?)
}
pub fn link_tag(&self, transaction_id: i64, tag_id: i64) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions()
.link_tag(TransactionId { v1: transaction_id }, TagId { v1: tag_id })?;
Ok(())
}
pub fn unlink_tag(&self, transaction_id: i64, tag_id: i64) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions()
.unlink_tag(TransactionId { v1: transaction_id }, TagId { v1: tag_id })?;
Ok(())
}
pub fn get_splits(
&self,
transaction_id: i64,
) -> Result<Vec<SplitTransaction>, TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
Ok(ctx
.transactions()
.get_splits_for_transaction(TransactionId { v1: transaction_id })?)
}
pub fn add_split(&self, split: SplitTransaction) -> Result<SplitTransaction, TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
Ok(ctx.transactions().add_split(&split)?)
}
pub fn update_split(&self, split: SplitTransaction) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions().update_split(&split)?;
Ok(())
}
pub fn delete_split(&self, split_id: i64) -> Result<(), TransactionError> {
let ctx = self
.context
.lock()
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))?;
ctx.transactions().delete_split(split_id)?;
Ok(())
}
pub fn get_all_json(&self) -> Result<String, TransactionError> {
let transactions = self.get_all()?;
serde_json::to_string(&transactions)
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))
}
pub fn get_splits_json(&self, transaction_id: i64) -> Result<String, TransactionError> {
let splits = self.get_splits(transaction_id)?;
serde_json::to_string(&splits)
.map_err(|e| TransactionError::Common(MmexError::Internal(e.to_string())))
}
}