diff --git a/CHANGELOG.md b/CHANGELOG.md index 75dc0e760..4a4014e0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). + Note: data representations require Postgres 10 (Postgres 11 if using `IN` predicates); data representations are not implemented for RPC - #2647, Allow to verify the PostgREST version in SQL: `select distinct application_name from pg_stat_activity`. - @laurenceisla - #2856, Add the `--version` CLI option that prints the version information - @laurenceisla + - #1655, Improve `details` field of the singular error response - @taimoorzaeem ### Fixed diff --git a/src/PostgREST/Error.hs b/src/PostgREST/Error.hs index 6e0d72d6f..e6795d4af 100644 --- a/src/PostgREST/Error.hs +++ b/src/PostgREST/Error.hs @@ -530,7 +530,7 @@ instance JSON.ToJSON Error where toJSON (SingularityError n) = JSON.object [ "code" .= ApiRequestErrorCode16, "message" .= ("JSON object requested, multiple (or no) rows returned" :: Text), - "details" .= T.unwords ["Results contain", show n, "rows,", T.decodeUtf8 (MediaType.toMime MTSingularJSON), "requires 1 row"], + "details" .= T.unwords ["The result contains", show n, "rows"], "hint" .= JSON.Null] toJSON (PgErr err) = JSON.toJSON err diff --git a/test/spec/Feature/Query/SingularSpec.hs b/test/spec/Feature/Query/SingularSpec.hs index 5f2122465..b8ff4fa8f 100644 --- a/test/spec/Feature/Query/SingularSpec.hs +++ b/test/spec/Feature/Query/SingularSpec.hs @@ -69,7 +69,7 @@ spec = [("Prefer", "tx=commit"), singular] [json| { address: "zzz" } |] `shouldRespondWith` - [json|{"details":"Results contain 4 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 4 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -85,7 +85,7 @@ spec = [("Prefer", "tx=commit"), ("Prefer", "return=representation"), singular] [json| { address: "zzz" } |] `shouldRespondWith` - [json|{"details":"Results contain 4 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 4 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -100,7 +100,7 @@ spec = request methodPatch "/items?id=gt.0&id=lt.0" [singular] [json|{"id":1}|] `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -109,7 +109,7 @@ spec = request methodPatch "/items?id=gt.0&id=lt.0" [("Prefer", "return=representation"), singular] [json|{"id":1}|] `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -141,7 +141,7 @@ spec = [("Prefer", "tx=commit"), singular] [json| [ { id: 200, address: "xxx" }, { id: 201, address: "yyy" } ] |] `shouldRespondWith` - [json|{"details":"Results contain 2 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 2 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -157,7 +157,7 @@ spec = [("Prefer", "tx=commit"), ("Prefer", "return=representation"), singular] [json| [ { id: 202, address: "xxx" }, { id: 203, address: "yyy" } ] |] `shouldRespondWith` - [json|{"details":"Results contain 2 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 2 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -173,7 +173,7 @@ spec = [("Prefer", "tx=commit"), ("Prefer", "return=minimal"), singular] [json| [ { id: 204, address: "xxx" }, { id: 205, address: "yyy" } ] |] `shouldRespondWith` - [json|{"details":"Results contain 2 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 2 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -189,7 +189,7 @@ spec = [singular] [json| [ ] |] `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -199,7 +199,7 @@ spec = [("Prefer", "return=representation"), singular] [json| [ ] |] `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -222,7 +222,7 @@ spec = [("Prefer", "tx=commit"), singular] "" `shouldRespondWith` - [json|{"details":"Results contain 5 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 5 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -240,7 +240,7 @@ spec = request methodDelete "/items?id=gt.5&id=lt.11" [("Prefer", "tx=commit"), ("Prefer", "return=representation"), singular] "" `shouldRespondWith` - [json|{"details":"Results contain 5 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 5 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ] @@ -257,7 +257,7 @@ spec = request methodDelete "/items?id=lt.0" [singular] "" `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -266,7 +266,7 @@ spec = request methodDelete "/items?id=lt.0" [("Prefer", "return=representation"), singular] "" `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -276,7 +276,7 @@ spec = request methodPost "/rpc/getproject" [singular] [json|{ "id": 9999999}|] `shouldRespondWith` - [json|{"details":"Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 0 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -299,7 +299,7 @@ spec = request methodPost "/rpc/getallprojects" [singular] "{}" `shouldRespondWith` - [json|{"details":"Results contain 5 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 5 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [matchContentTypeSingular] } @@ -314,7 +314,7 @@ spec = [("Prefer", "tx=commit"), singular] [json| {"id_l": 1, "id_h": 2, "name": "changed"} |] `shouldRespondWith` - [json|{"details":"Results contain 2 rows, application/vnd.pgrst.object+json requires 1 row","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] + [json|{"details":"The result contains 2 rows","message":"JSON object requested, multiple (or no) rows returned","code":"PGRST116","hint":null}|] { matchStatus = 406 , matchHeaders = [ matchContentTypeSingular , "Preference-Applied" <:> "tx=commit" ]