Send back Location header on insert
This commit is contained in:
+10
-4
@@ -15,6 +15,7 @@ import Data.Ranged.Ranges (emptyRange)
|
|||||||
import Data.HashMap.Strict (keys, elems, filterWithKey, toList)
|
import Data.HashMap.Strict (keys, elems, filterWithKey, toList)
|
||||||
import Data.String.Conversions (cs)
|
import Data.String.Conversions (cs)
|
||||||
import Data.List (sortBy)
|
import Data.List (sortBy)
|
||||||
|
import Data.Functor.Identity
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
|
|
||||||
import Network.HTTP.Types.Status
|
import Network.HTTP.Types.Status
|
||||||
@@ -104,12 +105,17 @@ app req =
|
|||||||
([table], "POST") ->
|
([table], "POST") ->
|
||||||
handleJsonObj req $ \obj -> H.tx Nothing $ do
|
handleJsonObj req $ \obj -> H.tx Nothing $ do
|
||||||
let qt = QualifiedTable schema (cs table)
|
let qt = QualifiedTable schema (cs table)
|
||||||
H.unit . coerce $ insertInto qt (map cs $ keys obj) (elems obj)
|
query = coerce $
|
||||||
|
insertInto qt (map cs $ keys obj) (elems obj)
|
||||||
|
row <- H.single query
|
||||||
|
let (Identity insertedJson) = fromMaybe (Identity "{}" :: Identity Text) row
|
||||||
|
Just inserted = decode (cs insertedJson) :: Maybe Object
|
||||||
|
|
||||||
primaryKeys <- map cs <$> primaryKeyColumns qt
|
primaryKeys <- map cs <$> primaryKeyColumns qt
|
||||||
let primaries = filterWithKey (const . (`elem` primaryKeys)) obj
|
let primaries = filterWithKey (const . (`elem` primaryKeys)) inserted
|
||||||
let params = urlEncodeVars
|
let params = urlEncodeVars
|
||||||
$ map (\t -> (cs $ fst t, "eq." <> cs (encode $ snd t)))
|
$ map (\t -> (cs $ fst t, "eq." <> cs (encode $ snd t)))
|
||||||
$ toList primaries
|
$ sortBy (comparing fst) $ toList primaries
|
||||||
return $ responseLBS status201
|
return $ responseLBS status201
|
||||||
[ jsonH
|
[ jsonH
|
||||||
, (hLocation, "/" <> cs table <> "?" <> cs params)
|
, (hLocation, "/" <> cs table <> "?" <> cs params)
|
||||||
@@ -165,7 +171,7 @@ isSqlError (HB.ErroneousResult x) = Just $ HB.ErroneousResult x
|
|||||||
isSqlError _ = Nothing
|
isSqlError _ = Nothing
|
||||||
|
|
||||||
sqlErrHandler :: HB.Error -> IO Response
|
sqlErrHandler :: HB.Error -> IO Response
|
||||||
sqlErrHandler (HB.ErroneousResult err) = do
|
sqlErrHandler (HB.ErroneousResult err) =
|
||||||
return $ if "42P01" `isInfixOf` err
|
return $ if "42P01" `isInfixOf` err
|
||||||
then responseLBS status404 [] ""
|
then responseLBS status404 [] ""
|
||||||
else responseLBS status400 [] (cs err)
|
else responseLBS status400 [] (cs err)
|
||||||
|
|||||||
+6
-1
@@ -83,6 +83,11 @@ asJsonWithCount (sql, params, pre) = (
|
|||||||
, params, pre
|
, params, pre
|
||||||
)
|
)
|
||||||
|
|
||||||
|
asJsonRow :: StatementT
|
||||||
|
asJsonRow (sql, params, pre) = (
|
||||||
|
"row_to_json(t) from (" <> sql <> ") t", params, pre
|
||||||
|
)
|
||||||
|
|
||||||
selectStar :: QualifiedTable -> DynamicSQL
|
selectStar :: QualifiedTable -> DynamicSQL
|
||||||
selectStar t =
|
selectStar t =
|
||||||
("select * from " <> fromQt t, [], mempty)
|
("select * from " <> fromQt t, [], mempty)
|
||||||
@@ -95,7 +100,7 @@ insertInto t cols vals =
|
|||||||
cs (intercalate ", " (map pgFmtIdent cols)) <>
|
cs (intercalate ", " (map pgFmtIdent cols)) <>
|
||||||
") values (" <>
|
") values (" <>
|
||||||
cs (intercalate ", " (map (const "?") vals)) <>
|
cs (intercalate ", " (map (const "?") vals)) <>
|
||||||
")"
|
") returning row_to_json(" <> fromQt t <> ".*)"
|
||||||
, map pgParam vals
|
, map pgParam vals
|
||||||
, mempty
|
, mempty
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user