Singular response for PATCH request (#634)
* Allow a singular entity to be returned from an update Since a `PATCH` will be an update that could affect many rows, there might be more than one object returned. By allowing asking for a singular response, the/an object will be returned instead of a list. This is useful in cases when the `PATCH` is against single entity (i.e. `/items?pkey=eq.99`). * Add tests for plurality=singular for `PATCH` requests * Disallow updating more than one row if `plurality=singular` As discussed in #634, we don't want to allow updating several rows with a `PATCH` request when the `Prefer` header specifies `return=representation;plurality=singular` as this would almost certainly be a client error. * Add test for patching multiple objects with singular response Patching > 1 object with `return=representation;plurality=singular` should return `400 Bad Request`. * Only add singleton range for read API requests * Disallow inserting more than one row if `plurality=singular` Disallow inserting several rows with a `POST` request when the `Prefer` header specifies `return=representation;plurality=singular` as this would almost certainly be a client error. * Only import `q` from `Text.InterpolatedString.Perl6` * Update OpenAPI response for PATCH/POST to mention `plurality=singular` The OpenAPI response for PATCH/POST requests now includes the `Prefer` value `return=representation;plurality=singular`. * Add entry in changelog
This commit is contained in:
committed by
Joe Nelson
parent
df6cbc4afa
commit
35c5b190b4
@@ -398,6 +398,35 @@ spec = do
|
||||
[json| { id: 99 } |]
|
||||
`shouldRespondWith` [json| [{id:99}] |]
|
||||
|
||||
context "in a table" $ do
|
||||
it "can provide a singular representation when updating one entity" $ do
|
||||
_ <- post "/addresses" [json| { id: 97, address: "A Street" } |]
|
||||
p <- request methodPatch
|
||||
"/addresses?id=eq.97"
|
||||
[("Prefer", "return=representation;plurality=singular")]
|
||||
[json| { address: "B Street" } |]
|
||||
liftIO $ simpleBody p `shouldBe` [str|{"id":97,"address":"B Street"}|]
|
||||
it "raises an error when attempting to update multiple entities with plurality=singular" $ do
|
||||
_ <- post "/addresses" [json| { id: 98, address: "xxx" } |]
|
||||
_ <- post "/addresses" [json| { id: 99, address: "yyy" } |]
|
||||
p <- request methodPatch
|
||||
"/addresses?id=gt.0"
|
||||
[("Prefer", "return=representation;plurality=singular")]
|
||||
[json| { address: "zzz" } |]
|
||||
liftIO $ simpleStatus p `shouldBe` status400
|
||||
it "can provide a singular representation when creating one entity" $ do
|
||||
p <- request methodPost
|
||||
"/addresses"
|
||||
[("Prefer", "return=representation;plurality=singular")]
|
||||
[json| [ { id: 100, address: "xxx" } ] |]
|
||||
liftIO $ simpleBody p `shouldBe` [str|{"id":100,"address":"xxx"}|]
|
||||
it "raises an error when attempting to create multiple entities with plurality=singular" $ do
|
||||
p <- request methodPost
|
||||
"/addresses"
|
||||
[("Prefer", "return=representation;plurality=singular")]
|
||||
[json| [ { id: 100, address: "xxx" }, { id: 101, address: "xxx" } ] |]
|
||||
liftIO $ simpleStatus p `shouldBe` status400
|
||||
|
||||
it "can set a json column to escaped value" $ do
|
||||
_ <- post "/json" [json| { data: {"escaped":"bar"} } |]
|
||||
request methodPatch "/json?data->>escaped=eq.bar"
|
||||
|
||||
Reference in New Issue
Block a user