diff --git a/src/http_keys.ml b/src/http_keys.ml index 6cedefca..921e6ae0 100644 --- a/src/http_keys.ml +++ b/src/http_keys.ml @@ -1,5 +1,3 @@ -[@@@ocaml.warning "-26-27"] - open Syntax open Api module String_map = Stdlib.Map.Make (Stdlib.String) @@ -20,10 +18,10 @@ let denomgroup_of_denomdata fee_deposit; fee_refresh; fee_refund; - age_mask; - h_pub; + age_mask= _; + h_pub= _; master_sig; - revoked_sig; + revoked_sig= _; } = let master_sig = match master_sig with None -> assert false | Some v -> v in let denoms = @@ -110,12 +108,34 @@ let mk_keys ~db_conn (module Sm : Secmod.S) ~last_issue_date = denom_data_l in let list_issue_date = - match denom_data_l with [] -> None | v :: _ -> v.stamp_start + match denom_data_l with [] -> None | v :: _ -> v.Denom_data.stamp_start in let denominations = - (* TODO really need to understand and correctly group denoms - 'exchange_sig' depends on correct denom group/order *) - List.map denomgroup_of_denomdata denom_data_l + let open Denom_data in + (* TODO time + truncated timestamps to int for comparison *) + let timestamp_to_int = function + | None -> 0 + | Some ptime -> ptime |> Ptime.to_float_s |> Int.of_float + in + (* if `?last_issue_date` query param does not exactly match the `stamp_start` + of one of the denomination keys, all keys are returned *) + let l = + match last_issue_date with + | None -> denom_data_l + | Some last_issue_date -> ( + match + List.find_opt + (fun v -> timestamp_to_int v.stamp_start = last_issue_date) + denom_data_l + with + | None -> denom_data_l + | Some _ -> + List.filter + (fun v -> timestamp_to_int v.stamp_start > last_issue_date) + denom_data_l) + in + List.map denomgroup_of_denomdata l in let signkeys = @@ -220,8 +240,19 @@ let f req server _env = Logs.info (fun m -> m "GET /keys/"); let db_conn = Vif.Server.device Devices.db_connection server in let sm = Vif.Server.device Devices.secmod server in + let last_issue_date = + match Vif.Queries.get req "last_issue_date" with + | [] -> None + | v :: _ -> ( + (* TODO time *) + match float_of_string_opt v with + | None -> + Fmt.failwith + "invalid `?last_issue_date` query param, float_of_string failure" + | Some v -> Some (Int.of_float v)) + in let res = - let last_issue_date = Ptime_clock.now () |> Option.some in + (*let last_issue_date = Ptime_clock.now () |> Option.some in*) let* v = mk_keys ~db_conn sm ~last_issue_date in let s = Api.encode_exn jsont v in Ok s diff --git a/src/mte.ml b/src/mte.ml index d2767816..f98ee88f 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -23,9 +23,8 @@ let hello req _server _env = let routes = let open Vif.Uri in let open Vif.Route in - let open Vif.Type in - let get_ path = get (path /?? nil) in - let post path jsont = post (json_encoding jsont) (path /?? nil) in + let get_ path = get (path /?? any) in + let post path jsont = post (Vif.Type.json_encoding jsont) (path /?? any) in let tos = let v s = rel / s in [