From 4ddd5b4a76e076f8c34f56bdfc82e32ce3da613e Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 27 Dec 2022 16:16:41 -0500 Subject: [PATCH] Add upsert headers for POST requests to the OpenAPI output --- CHANGELOG.md | 1 + src/PostgREST/Response/OpenAPI.hs | 20 +++++++++++++++----- test/spec/Feature/OpenApi/OpenApiSpec.hs | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82feceba2..0789fd8e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #2575, Replace misleading error message when no function is found with a hint containing functions/parameters names suggestions - @laurenceisla - #2569, Replace misleading error message when no relationship is found with a hint containing parent/child names suggestions - @laurenceisla - #1405, Add the required OpenAPI items object when the parameter is an array - @laurenceisla + - #2592, Add upsert headers for POST requests to the OpenAPI output - @laurenceisla ## [10.1.1] - 2022-11-08 diff --git a/src/PostgREST/Response/OpenAPI.hs b/src/PostgREST/Response/OpenAPI.hs index d159d3bac..240551e54 100644 --- a/src/PostgREST/Response/OpenAPI.hs +++ b/src/PostgREST/Response/OpenAPI.hs @@ -161,7 +161,15 @@ makePreferParam ts = & schema .~ ParamOther ((mempty :: ParamOtherSchema) & in_ .~ ParamHeader & type_ ?~ SwaggerString - & enum_ .~ JSON.decode (JSON.encode ts)) + & enum_ .~ JSON.decode (JSON.encode $ foldl (<>) [] (val <$> ts))) + where + val :: Text -> [Text] + val = \case + "count" -> ["count=none"] + "params" -> ["params=single-object"] + "return" -> ["return=representation", "return=minimal", "return=none"] + "resolution" -> ["resolution=ignore-duplicates", "resolution=merge-duplicates"] + _ -> [] makeProcParam :: ProcDescription -> [Referenced Param] makeProcParam pd = @@ -174,9 +182,11 @@ makeProcParam pd = makeParamDefs :: [Table] -> [(Text, Param)] makeParamDefs ti = - [ ("preferParams", makePreferParam ["params=single-object"]) - , ("preferReturn", makePreferParam ["return=representation", "return=minimal", "return=none"]) - , ("preferCount", makePreferParam ["count=none"]) + -- TODO: create Prefer for each method (GET, PATCH, etc.) + [ ("preferParams", makePreferParam ["params"]) + , ("preferReturn", makePreferParam ["return"]) + , ("preferCount", makePreferParam ["count"]) + , ("preferPost", makePreferParam ["return", "resolution"]) , ("select", (mempty :: Param) & name .~ "select" & description ?~ "Filtering Columns" @@ -276,7 +286,7 @@ makePathItem t = ("/" ++ T.unpack tn, p $ tableInsertable t || tableUpdatable t ) ) postOp = tOp - & parameters .~ fmap ref ["body." <> tn, "select", "preferReturn"] + & parameters .~ fmap ref ["body." <> tn, "select", "preferPost"] & at 201 ?~ "Created" patchOp = tOp & parameters .~ fmap ref (rs <> ["body." <> tn, "preferReturn"]) diff --git a/test/spec/Feature/OpenApi/OpenApiSpec.hs b/test/spec/Feature/OpenApi/OpenApiSpec.hs index 31aedfb06..b7603b111 100644 --- a/test/spec/Feature/OpenApi/OpenApiSpec.hs +++ b/test/spec/Feature/OpenApi/OpenApiSpec.hs @@ -91,7 +91,7 @@ spec actualPgVersion = describe "OpenAPI" $ do [ { "$ref": "#/parameters/body.child_entities" }, { "$ref": "#/parameters/select" }, - { "$ref": "#/parameters/preferReturn" } + { "$ref": "#/parameters/preferPost" } ] |]