1 module Databrary.Action.Form
    2   ( getFormData
    3   ) where
    4 
    5 import qualified Data.ByteString as BS
    6 import qualified Data.Map.Strict as Map
    7 import Data.Maybe (fromMaybe)
    8 import Data.Word (Word64)
    9 import qualified Network.Wai as Wai
   10 import Network.Wai.Parse (FileInfo)
   11 
   12 import Databrary.Has (peeks)
   13 import Databrary.HTTP.Form.Data
   14 import Databrary.HTTP.Parse
   15 import Databrary.Action.Types
   16 import qualified Databrary.JSON as JSON
   17 
   18 getFormData :: FileContent a => [(BS.ByteString, Word64)] -> Handler (FormData a)
   19 getFormData fileLimits = do
   20   (mkFormData
   21    :: Map.Map BS.ByteString BS.ByteString -> Maybe JSON.Value -> Map.Map BS.ByteString (FileInfo a) -> FormData a)
   22     <- peeks $ (\httpReq -> (FormData . Map.fromList . Wai.queryString) httpReq)
   23   (c :: Content a) <- parseRequestContent getFileMaxSizeByFieldName
   24   return $ case c of
   25     ContentForm formParams formFiles -> mkFormData (Map.fromList formParams) Nothing    (Map.fromList formFiles)
   26     ContentJSON val ->                  mkFormData Map.empty                 (Just val) Map.empty
   27     -- text or unknown
   28     _ ->                                mkFormData Map.empty                 Nothing    Map.empty
   29   where
   30     getFileMaxSizeByFieldName :: BS.ByteString -> Word64
   31     getFileMaxSizeByFieldName fieldName = (fromMaybe 0 . (`lookup` fileLimits)) fieldName