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.String.Conversions (cs)
import Data.List (sortBy)
import Data.Functor.Identity
import qualified Data.Set as S
import Network.HTTP.Types.Status
@@ -104,12 +105,17 @@ app req =
([table], "POST") ->
handleJsonObj req $ \obj -> H.tx Nothing $ do
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
let primaries = filterWithKey (const . (`elem` primaryKeys)) obj
let primaries = filterWithKey (const . (`elem` primaryKeys)) inserted
let params = urlEncodeVars
$ map (\t -> (cs $ fst t, "eq." <> cs (encode $ snd t)))
$ toList primaries
$ sortBy (comparing fst) $ toList primaries
return $ responseLBS status201
[ jsonH
, (hLocation, "/" <> cs table <> "?" <> cs params)
@@ -165,7 +171,7 @@ isSqlError (HB.ErroneousResult x) = Just $ HB.ErroneousResult x
isSqlError _ = Nothing
sqlErrHandler :: HB.Error -> IO Response
sqlErrHandler (HB.ErroneousResult err) = do
sqlErrHandler (HB.ErroneousResult err) =
return $ if "42P01" `isInfixOf` err
then responseLBS status404 [] ""
else responseLBS status400 [] (cs err)
+6 -1
View File
@@ -83,6 +83,11 @@ asJsonWithCount (sql, params, pre) = (
, params, pre
)
asJsonRow :: StatementT
asJsonRow (sql, params, pre) = (
"row_to_json(t) from (" <> sql <> ") t", params, pre
)
selectStar :: QualifiedTable -> DynamicSQL
selectStar t =
("select * from " <> fromQt t, [], mempty)
@@ -95,7 +100,7 @@ insertInto t cols vals =
cs (intercalate ", " (map pgFmtIdent cols)) <>
") values (" <>
cs (intercalate ", " (map (const "?") vals)) <>
")"
") returning row_to_json(" <> fromQt t <> ".*)"
, map pgParam vals
, mempty
)