From 5555c87afda2063bce3db4611ccbc6e7b63b099d Mon Sep 17 00:00:00 2001 From: Robur Date: Wed, 9 Jun 2021 14:26:05 +0000 Subject: [PATCH] Add the /job/:job/upload endpoint which receives a raw binary. Fixes #38 --- lib/builder_web.ml | 32 ++++++++++++++++++++++++++++++++ lib/dune | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/builder_web.ml b/lib/builder_web.ml index 8534237..64e31b5 100644 --- a/lib/builder_web.ml +++ b/lib/builder_web.ml @@ -242,6 +242,37 @@ let add_routes datadir = |> string_of_html |> Dream.html |> Lwt_result.ok in + let upload_binary req = + let job = Dream.param "job" req in + let* body = Dream.body req in + Authorization.authorized req job + |> if_error ~status:`Forbidden "Forbidden" >>= fun () -> + let uuid = Uuidm.v4_gen (Random.State.make_self_init ()) () in + Dream.sql req (Model.build_exists uuid) + |> if_error "Internal server error" + ~log:(fun e -> + Log.warn (fun m -> m "Error saving binary %S: %a" job pp_error e)) + >>= function + | true -> + Log.warn (fun m -> m "Build %S with same uuid exists: %a" job Uuidm.pp uuid); + Dream.respond ~status:`Conflict + (Fmt.strf "Build with same uuid exists: %a\n" Uuidm.pp uuid) + |> Lwt_result.ok + | false -> + let datadir = Dream.global datadir_global req in + let exec = + let now = Ptime_clock.now () in + ({ Builder.name = job ; script = "" ; files = [] }, uuid, [], now, now, Builder.Exited 0, + [ (Fpath.(v "bin" / job + "bin"), body) ]) + in + (Lwt.return (Dream.local Authorization.user_info_local req |> + Option.to_result ~none:(`Msg "no authenticated user")) >>= fun (user_id, _) -> + Dream.sql req (Model.add_build datadir user_id exec)) + |> if_error "Internal server error" + ~log:(fun e -> Log.warn (fun m -> m "Error saving build %a: %a" pp_exec exec pp_error e)) + >>= fun () -> Dream.respond "" |> Lwt_result.ok + in + let w f req = or_error_response (f req) in Dream.router [ @@ -253,4 +284,5 @@ let add_routes datadir = Dream.get "/hash" (w hash); Dream.get "/compare/:build_left/:build_right/opam-switch" (w compare_opam); Dream.post "/upload" (Authorization.authenticate (w upload)); + Dream.post "/job/:job/upload" (Authorization.authenticate (w upload_binary)); ] diff --git a/lib/dune b/lib/dune index 93ddab4..e0cf3e7 100644 --- a/lib/dune +++ b/lib/dune @@ -1,3 +1,3 @@ (library (name builder_web) - (libraries builder builder_db dream tyxml bos rresult duration hex caqti-lwt opamdiff)) + (libraries builder builder_db dream tyxml bos rresult duration hex caqti-lwt opamdiff ptime.clock.os))