diff options
author | rtkay123 <dev@kanjala.com> | 2025-08-09 11:45:07 +0200 |
---|---|---|
committer | rtkay123 <dev@kanjala.com> | 2025-08-09 11:45:18 +0200 |
commit | d50185df5a5870498b6c7e6b51e0368d051743ca (patch) | |
tree | 2820c340d86650efdc2e231b4190bddcd54c9f73 /crates | |
parent | 9e3e07220ef10d2b8e5251c4871d54f9c5a1e9d0 (diff) | |
download | warden-d50185df5a5870498b6c7e6b51e0368d051743ca.tar.bz2 warden-d50185df5a5870498b6c7e6b51e0368d051743ca.zip |
feat: money type
Diffstat (limited to 'crates')
-rw-r--r-- | crates/warden/src/server/routes/processor/pacs008.rs | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/crates/warden/src/server/routes/processor/pacs008.rs b/crates/warden/src/server/routes/processor/pacs008.rs index e241d38..87f1fee 100644 --- a/crates/warden/src/server/routes/processor/pacs008.rs +++ b/crates/warden/src/server/routes/processor/pacs008.rs @@ -1,6 +1,8 @@ use axum::{extract::State, response::IntoResponse}; -use tracing::{error, trace, warn}; +use stack_up::tracing_opentelemetry::OpenTelemetrySpanExt; +use tracing::{debug, error, trace, warn}; use warden_core::{ + google::r#type::Money, iso20022::{TransactionType, pacs008::Pacs008Document}, message::DataCache, }; @@ -35,7 +37,8 @@ pub(super) async fn post_pacs008( State(state): State<AppHandle>, axum::Json(transaction): axum::Json<Pacs008Document>, ) -> Result<impl IntoResponse, AppError> { - let tx_tp = TransactionType::PACS008; + let tx_tp = TransactionType::PACS008.to_string(); + tracing::Span::current().record("tx_tp", &tx_tp); let data_cache = build_data_cache(&transaction)?; let tx_count = transaction.f_i_to_f_i_cstmr_cdt_trf.cdt_trf_tx_inf.len(); @@ -63,6 +66,39 @@ pub(super) async fn post_pacs008( .map(|value| value.pmt_id.end_to_end_id.as_str()) .ok_or_else(|| anyhow::anyhow!("missing end_to_end_id id"))?; + let ccy = + cdt_trf_tx_inf.and_then(|value| value.instd_amt.as_ref().map(|value| value.ccy.as_str())); + + let end_to_end_id = cdt_trf_tx_inf + .as_ref() + .map(|value| value.pmt_id.end_to_end_id.as_str()) + .ok_or_else(|| { + error!("missing end_to_end_id"); + anyhow::anyhow!("missing end_to_end_id id") + })?; + + tracing::Span::current().record("end_to_end_id", end_to_end_id); + let end_to_end_id = String::from(end_to_end_id); + + let msg_id = &transaction.f_i_to_f_i_cstmr_cdt_trf.grp_hdr.msg_id; + tracing::Span::current().record("msg_id", msg_id); + + let pmt_inf_id = cdt_trf_tx_inf + .and_then(|value| value.pmt_id.instr_id.as_ref()) + .ok_or_else(|| { + error!("missing pmt_inf_id"); + anyhow::anyhow!("missing pmt_inf_id id") + })?; + + debug!(%msg_id, %end_to_end_id, "extracted transaction identifiers"); + + let money = if let (Some(amt), Some(ccy)) = (amount, ccy) { + Some(Money::try_from((amt, ccy)).map_err(|_e| anyhow::anyhow!("invalid currency"))?) + } else { + trace!(msg_id, "transaction has no amount or currency"); + None + }; + Ok(String::default()) } |