aboutsummaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2025-08-09 11:45:07 +0200
committerrtkay123 <dev@kanjala.com>2025-08-09 11:45:18 +0200
commitd50185df5a5870498b6c7e6b51e0368d051743ca (patch)
tree2820c340d86650efdc2e231b4190bddcd54c9f73 /crates
parent9e3e07220ef10d2b8e5251c4871d54f9c5a1e9d0 (diff)
downloadwarden-d50185df5a5870498b6c7e6b51e0368d051743ca.tar.bz2
warden-d50185df5a5870498b6c7e6b51e0368d051743ca.zip
feat: money type
Diffstat (limited to 'crates')
-rw-r--r--crates/warden/src/server/routes/processor/pacs008.rs40
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())
}