Send back Location header on insert

This commit is contained in:
Joe Nelson
2014-12-06 17:42:21 -08:00
parent 0ebb83de3a
commit ca4138df2a
2 changed files with 16 additions and 5 deletions
+10 -4
View File
@@ -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
View File
@@ -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
) )