sqlx_ledger/transaction/
entity.rs1use 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}