Disallow non-idempotent PUTs
This commit is contained in:
+9
-9
@@ -3,7 +3,7 @@
|
|||||||
-- {{{ Imports
|
-- {{{ Imports
|
||||||
module Dbapi where
|
module Dbapi where
|
||||||
|
|
||||||
import Types (SqlRow)
|
import Types (SqlRow, getRow)
|
||||||
|
|
||||||
import Control.Exception (try)
|
import Control.Exception (try)
|
||||||
import Control.Monad (join)
|
import Control.Monad (join)
|
||||||
@@ -34,7 +34,8 @@ import qualified Data.ByteString.Char8 as BS
|
|||||||
import Database.HDBC.PostgreSQL (Connection)
|
import Database.HDBC.PostgreSQL (Connection)
|
||||||
import Database.HDBC.Types (SqlError, seErrorMsg)
|
import Database.HDBC.Types (SqlError, seErrorMsg)
|
||||||
import Database.HDBC.SqlValue (SqlValue(..))
|
import Database.HDBC.SqlValue (SqlValue(..))
|
||||||
import PgStructure (printTables, printColumns, primaryKeyColumns)
|
import PgStructure (printTables, printColumns, primaryKeyColumns,
|
||||||
|
columns, Column(colName))
|
||||||
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
import Data.Text (pack, unpack)
|
import Data.Text (pack, unpack)
|
||||||
@@ -111,16 +112,15 @@ app conn req respond = do
|
|||||||
then return $ responseLBS status405 []
|
then return $ responseLBS status405 []
|
||||||
"You must speficy all and only primary keys as params"
|
"You must speficy all and only primary keys as params"
|
||||||
else do
|
else do
|
||||||
|
cols <- columns ver (unpack table) conn
|
||||||
|
let colNames = S.fromList $ map (pack . colName) cols
|
||||||
|
let specifiedCols = S.fromList $ map fst $ getRow row
|
||||||
|
if colNames == specifiedCols then do
|
||||||
_ <- upsert ver table row qq conn
|
_ <- upsert ver table row qq conn
|
||||||
return $ responseLBS status201 [] ""
|
return $ responseLBS status201 [] ""
|
||||||
-- allvals <- insert ver table row conn
|
else return $ responseLBS status400 []
|
||||||
-- let keyvals = allvals `intersection` fromList (zip keys $ repeat SqlNull)
|
"Missing column(s) in PUT request"
|
||||||
-- let params = urlEncodeVars $ map (\t -> (fst t, "eq." <> convert (snd t) :: String)) $ toList keyvals
|
|
||||||
-- [ jsonContentType
|
|
||||||
-- , (hLocation, "/" <> encodeUtf8 table <> "?" <> BS.pack params)
|
|
||||||
-- ] ""
|
|
||||||
)
|
)
|
||||||
|
|
||||||
(_, _) ->
|
(_, _) ->
|
||||||
return $ responseLBS status404 [] ""
|
return $ responseLBS status404 [] ""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user