From 041faadb54013b63ea737da27c0320ed4b9f1cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Fri, 22 Jan 2021 13:13:09 +0100 Subject: [PATCH] Return 409 conflic if build uuid already exists --- lib/builder_web.ml | 20 ++++++++++++++++---- lib/model.ml | 4 ++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/builder_web.ml b/lib/builder_web.ml index 69c90d6..1037c1f 100644 --- a/lib/builder_web.ml +++ b/lib/builder_web.ml @@ -156,14 +156,26 @@ let routes t = Log.warn (fun m -> m "Received bad builder ASN.1"); Log.debug (fun m -> m "Parse error: %s" e); Lwt.return (Response.of_plain_text "Bad request\n" ~status:`Bad_request) - | Ok exec -> - let* r = Caqti_lwt.Pool.use (Model.add_build t.datadir exec) t.pool in + | Ok ((_, uuid, _, _, _, _, _) as exec) -> + Log.info (fun m -> m "Received build %a" pp_exec exec); + let* r = Caqti_lwt.Pool.use (Model.build_exists uuid) t.pool in match r with - | Ok () -> - Lwt.return (Response.of_plain_text "Success!\n") | Error e -> Log.warn (fun m -> m "Error saving build %a: %a" pp_exec exec pp_error e); Lwt.return (Response.of_plain_text "Internal server error\n" ~status:`Internal_server_error) + | Ok true -> + Log.warn (fun m -> m "Build with same uuid exists: %a" pp_exec exec); + Lwt.return (Response.of_plain_text + (Fmt.strf "Build with same uuid exists: %a\n" Uuidm.pp uuid) + ~status:`Conflict) + | Ok false -> + let* r = Caqti_lwt.Pool.use (Model.add_build t.datadir exec) t.pool in + match r with + | Ok () -> + Lwt.return (Response.of_plain_text "Success!\n") + | Error e -> + Log.warn (fun m -> m "Error saving build %a: %a" pp_exec exec pp_error e); + Lwt.return (Response.of_plain_text "Internal server error\n" ~status:`Internal_server_error) in [ diff --git a/lib/model.ml b/lib/model.ml index 68d3aa6..d92316d 100644 --- a/lib/model.ml +++ b/lib/model.ml @@ -45,6 +45,10 @@ let build uuid (module Db : CONN) = Db.find_opt Builder_db.Build.get_by_uuid uuid >>= not_found +let build_exists uuid (module Db : CONN) = + Db.find_opt Builder_db.Build.get_by_uuid uuid >|= + Option.is_some + let job job (module Db : CONN) = Db.collect_list Builder_db.Build.get_all_meta_by_name job