diff --git a/src/management.ml b/src/management.ml index d1ebb3ad..f4436548 100644 --- a/src/management.ml +++ b/src/management.ml @@ -179,6 +179,42 @@ let update_master_signatures ~db_conn ~sm_signkey ~sm_denom (h_denom_pub, master_sig)) |> Secmod_denom.add_master_signatures db_conn sm_denom in + let* () = + (* TODO move to test *) + Secmod_denom.get_denoms sm_denom + |> list_iter (fun denom -> + let error = Error "update_master_signatures sanity check failure" in + let* opt = + Pg.lookup_denomination_key db_conn denom.Denomination.h_pub + |> unwrap_err_caqti + in + let* ( valid_from, + _expire_withdraw, + _expire_deposit, + _expire_legal, + coin, + _fee_withdraw, + _fee_deposit, + _fee_refresh, + fee_refund, + age_mask ) = + match opt with None -> error | Some v -> Ok v + in + let check = function false -> error | true -> Ok () in + (* TODO time *) + let timestamp_equal a b = + let timestamp_to_int64 = function + | None -> None + | Some v -> v |> Ptime.to_float_s |> Int64.of_float |> Option.some + in + timestamp_to_int64 a = timestamp_to_int64 b + in + let* () = check (timestamp_equal valid_from denom.stamp_start) in + let* () = check (coin = denom.value) in + let* () = check (fee_refund = denom.fee_refund) in + let* () = check (age_mask = denom.age_mask) in + Ok ()) + in Ok () (* --- *) @@ -200,7 +236,10 @@ let respond_with_ok_json content req = let respond_with_res res req = match res with - | Error err -> respond_with_plain_text_error err req + | Error err -> + Logs.err (fun m -> m "%s." err); + let err = Fmt.str "%s@." err in + respond_with_plain_text_error err req | Ok content -> respond_with_ok_json content req let keys_get req server _env = diff --git a/src/pg.ml b/src/pg.ml index feda504c..86225798 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -1,10 +1,13 @@ +(* TODO + how to fix postgres/caqti tuple type? + try something with OID? + need to add boilerplate in each query for amounts *) + open Crypto module Caqti_type = struct include Caqti_type - (* TODO add a dune stanza like for prelude: - "(flags (:standard -open Prelude))" *) (* we want to use int64 timestamps, not postgresql built-in timestamp type *) let ptime : Ptime.t option t = Timestamp.caqti @@ -110,8 +113,10 @@ let lookup_denomination_key = Caqti_type.( denomination_hash ->? t10 time time time time amount amount amount amount amount age_mask) - "SELECT valid_from, expire_withdraw, expire_deposit, expire_legal, coin, \ - fee_withdraw, fee_deposit, fee_refresh, fee_refund, age_mask FROM \ + "SELECT valid_from, expire_withdraw, expire_deposit, expire_legal, \ + (coin).val, (coin).frac, (fee_withdraw).val, (fee_withdraw).frac, \ + (fee_deposit).val, (fee_deposit).frac, (fee_refresh).val, \ + (fee_refresh).frac, (fee_refund).val, (fee_refund).frac, age_mask FROM \ denominations WHERE denom_pub_hash=$1" in fun (module Conn : CONN) (h_denom_pub : DenominationHash.t) -> diff --git a/src/timestamp.mli b/src/timestamp.mli index c1ac00ab..ae81b3a3 100644 --- a/src/timestamp.mli +++ b/src/timestamp.mli @@ -1,5 +1,6 @@ (* TODO time - not sure about this *) + uhuh! + need to be int64 for binary/pg round trip *) type t = Ptime.t option type span = Ptime.Span.t option