sqlx_ledger/transaction/
entity.rs

1use crate::primitives::*;
2use chrono::{DateTime, NaiveDate, Utc};
3use derive_builder::Builder;
4use serde::{de::DeserializeOwned, Deserialize, Serialize};
5
6#[derive(Clone, Debug, Serialize, Deserialize)]
7pub struct Transaction {
8    pub id: TransactionId,
9    pub version: u32,
10    pub journal_id: JournalId,
11    pub tx_template_id: TxTemplateId,
12    pub effective: NaiveDate,
13    pub correlation_id: CorrelationId,
14    pub external_id: String,
15    pub description: Option<String>,
16    #[serde(rename = "metadata")]
17    pub metadata_json: Option<serde_json::Value>,
18    pub created_at: DateTime<Utc>,
19    pub modified_at: DateTime<Utc>,
20}
21
22impl Transaction {
23    pub fn metadata<T: DeserializeOwned>(&self) -> Result<Option<T>, serde_json::Error> {
24        match self.metadata_json.as_ref() {
25            Some(json) => Ok(serde_json::from_value(json.clone())?),
26            None => Ok(None),
27        }
28    }
29}
30
31#[derive(Builder)]
32pub(crate) struct NewTransaction {
33    #[builder(setter(into))]
34    pub(super) journal_id: JournalId,
35    pub(super) tx_template_id: TxTemplateId,
36    pub(super) effective: NaiveDate,
37    #[builder(setter(strip_option), default)]
38    pub(super) correlation_id: Option<CorrelationId>,
39    #[builder(setter(strip_option), default)]
40    pub(super) external_id: Option<String>,
41    #[builder(setter(strip_option), default)]
42    pub(super) description: Option<String>,
43    #[builder(setter(strip_option), default)]
44    pub(super) metadata: Option<serde_json::Value>,
45}
46
47impl NewTransaction {
48    pub fn builder() -> NewTransactionBuilder {
49        NewTransactionBuilder::default()
50    }
51}