From b9f95473166deaf857f92a695e2021f42c0d77c6 Mon Sep 17 00:00:00 2001 From: swrup Date: Thu, 11 Dec 2025 09:20:32 +0100 Subject: [PATCH] + drain --- src/handler.ml | 13 +++++++++++++ src/management.ml | 27 ++++++++++++++++++++++++++- src/mte.ml | 1 + src/pg.ml | 25 ++++++++++++++++++++++++- 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/handler.ml b/src/handler.ml index 968a7458..2ea55f42 100644 --- a/src/handler.ml +++ b/src/handler.ml @@ -165,3 +165,16 @@ let management_wire_disable req server _env = Ok "" in respond_with_res res req + +let management_drain_jsont = DrainProfitsMessage.jsont + +let management_drain req server _env = + let open Management in + let db_conn = Vif.Server.device Devices.db_connection server in + let res = + let* v = Vif.Request.of_json req |> unwrap_err_msg in + let* () = verify_drain v in + let* () = update_drain ~db_conn v in + Ok "" + in + respond_with_res res req diff --git a/src/management.ml b/src/management.ml index be9a8f54..e32c56e1 100644 --- a/src/management.ml +++ b/src/management.ml @@ -445,4 +445,29 @@ let update_wire_disable ~db_conn in () -(*[@@@ocaml.warning "-27"]*) +[@@@ocaml.warning "-27"] + +let verify_drain + DrainProfitsMessage. + { + debit_account_section; + credit_payto_uri; + wtid; + master_sig; + date; + amount; + } = + let open Bin_sig.MasterDrainProfit in + let open Bin_type in + verify ~key:Config.Exchange.master_public_key master_sig + { + wtid; + date; + amount; + h_section= Hash_64_cstr.hash debit_account_section; + h_payto= FullPaytoHash.hash credit_payto_uri; + } + +let update_drain ~db_conn v = + let+ () = Pg.insert_drain_profit db_conn v |> unwrap_err_caqti in + () diff --git a/src/mte.ml b/src/mte.ml index 6461fc5a..b9b79339 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -56,6 +56,7 @@ let routes = post (v "management" / "wire") management_wire_jsont --> management_wire; post (v "management" / "wire" / "disable") management_wire_disable_jsont --> management_wire_disable; + post (v "management" / "drain") management_drain_jsont --> management_drain; ] let () = diff --git a/src/pg.ml b/src/pg.ml index 1d6a9bbb..58a91c8b 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -5,7 +5,9 @@ need to add boilerplate in each query for amounts GNU Taler db-events? - it seems caqti/pgx does not support it *) + it seems caqti/pgx does not support it + + transaction *) module type CONN = Caqti_miou.CONNECTION @@ -406,3 +408,24 @@ let disable_wire = in fun (module Conn : CONN) ~payto_uri ~validity_end -> Conn.exec disable_wire (payto_uri, validity_end) + +let insert_drain_profit = + let insert_drain_profit = + let master_sig = Bin_sig.MasterDrainProfit.caqti in + Caqti_type.(t6 string string payto_uri time amount master_sig ->. unit) + "INSERT INTO profit_drains (wtid, account_section, payto_uri, \ + trigger_date, amount, master_sig) VALUES ($1, $2, $3, $4, ($5,$6), $7)" + in + fun (module Conn : CONN) + Api.DrainProfitsMessage. + { + debit_account_section; + credit_payto_uri; + wtid; + master_sig; + date; + amount; + } + -> + Conn.exec insert_drain_profit + (wtid, debit_account_section, credit_payto_uri, date, amount, master_sig)