diff --git a/src/handler.ml b/src/handler.ml index c997be05..17f35827 100644 --- a/src/handler.ml +++ b/src/handler.ml @@ -126,3 +126,16 @@ let management_wirefee req server _env = Ok "" in respond_with_res res req + +let management_global_fees_jsont = GlobalFees.jsont + +let management_global_fees 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_global_fees v in + let* () = update_global_fees ~db_conn v in + Ok "" + in + respond_with_res res req diff --git a/src/management.ml b/src/management.ml index 97aac9f8..924da552 100644 --- a/src/management.ml +++ b/src/management.ml @@ -327,14 +327,13 @@ let update_wirefee_setup ~db_conn closing_fee; wire_fee; } = - let* fees_opt = + let* wirefee_opt = Pg.lookup_wirefee_by_time db_conn ~wire_method ~start_date:fee_start ~end_date:fee_end |> unwrap_err_caqti in - match fees_opt with - | Some (_wire_fee, _closing_fee) -> - Error "wire-fee already setup? wire-fee mismatch" + match wirefee_opt with + | Some (_wire_fee, _closing_fee) -> Error "wire-fee already setup" | None -> let+ () = Pg.insert_wirefee db_conn ~wire_method ~start_date:fee_start @@ -343,4 +342,56 @@ let update_wirefee_setup ~db_conn in () -(*[@@@ocaml.warning "-27"]*) +let verify_global_fees + GlobalFees. + { + start_date; + end_date; + history_fee; + account_fee; + purse_fee; + history_expiration= _; + purse_account_limit; + purse_timeout= _; + master_sig; + } = + (* TODO time..... *) + let dummy_relative_time = None in + let dummy_amount = + Amount.make ~sign:None ~currency:"EUR" ~value:0_L ~fraction:0_l + |> Result.get_ok + in + (* TODO what is kyc_timeout, kyc_fee ? *) + let kyc_timeout = dummy_relative_time in + let kyc_fee = dummy_amount in + (* TODO force integer value to be a valid int64/int32 and in valid json integer range + in jsont encodings *) + let purse_account_limit = Int32.of_int purse_account_limit in + (* * *) + let open Bin_sig.GlobalFees in + verify ~key:Config.Exchange.master_public_key master_sig + { + start_date; + end_date; + purse_timeout= dummy_relative_time; + kyc_timeout; + history_expiration= dummy_relative_time; + history_fee; + kyc_fee; + account_fee; + purse_fee; + purse_account_limit; + } + +let update_global_fees ~db_conn v = + let* global_fees_opt = + let start_date = v.GlobalFees.start_date in + let end_date = v.GlobalFees.end_date in + Pg.lookup_global_fee_by_time db_conn ~start_date ~end_date + |> unwrap_err_caqti + in + match global_fees_opt with + | Some _ -> Error "global-fees already setup" + | None -> + let+ () = Pg.insert_global_fee db_conn v |> unwrap_err_caqti in + () diff --git a/src/mte.ml b/src/mte.ml index 15a764a6..631d3faa 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -51,6 +51,8 @@ let routes = --> management_auditors_disable; post (v "management" / "wire-fee") management_wirefee_jsont --> management_wirefee; + post (v "management" / "global-fees") management_global_fees_jsont + --> management_global_fees; ] let () = diff --git a/src/pg.ml b/src/pg.ml index 536ee475..584b12de 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -247,3 +247,53 @@ let insert_wirefee = -> Conn.exec insert_wirefee (wire_method, start_date, end_date, wire_fee, closing_fee, master_sig) + +let lookup_global_fee_by_time = + let lookup_global_fee_by_time = + let global_fee = Caqti_type.(t6 amount amount amount time time int32) in + Caqti_type.(t2 time time ->? global_fee) + "SELECT history_fee, account_fee, purse_fee, purse_timeout, \ + history_expiration, purse_account_limit FROM global_fee WHERE end_date \ + > $1 AND start_date < $2;" + in + fun (module Conn : CONN) ~start_date ~end_date -> + Conn.find_opt lookup_global_fee_by_time (start_date, end_date) + +let insert_global_fee = + let insert_global_fee = + let master_sig = Bin_sig.GlobalFees.caqti in + Caqti_type.( + t9 time time amount amount amount time time int32 master_sig ->. unit) + "INSERT INTO global_fee (start_date, end_date, history_fee, account_fee, \ + purse_fee, purse_timeout, history_expiration, purse_account_limit, \ + master_sig) VALUES ($1, $2, ($3,$4), ($5,$6), ($7,$8), $9, $10, $11, \ + $12)" + in + fun (module Conn : CONN) + Api.GlobalFees. + { + start_date; + end_date; + history_fee; + account_fee; + purse_fee; + history_expiration= _; + purse_account_limit; + purse_timeout= _; + master_sig; + } + -> + (* TODO time *) + let purse_account_limit = Int32.of_int purse_account_limit in + let purse_timeout = None in + let history_expiration = None in + Conn.exec insert_global_fee + ( start_date, + end_date, + history_fee, + account_fee, + purse_fee, + purse_timeout, + history_expiration, + purse_account_limit, + master_sig )