module Network.Utilities where
import Control.Lens
import Data.Aeson
import Data.Aeson.Lens
import qualified Data.ByteString.Lazy.Char8 as BS
import qualified Data.HashMap.Lazy as Hash
import qualified Data.Map.Lazy as Map
import Data.Maybe
import Data.Scientific
import qualified Data.Text as T
import qualified Data.Vector as V
import Data.Word
import Network.Wreq
type Resp = Response BS.ByteString
type Obj = Map.Map String Value
type HObj = Hash.HashMap T.Text Value
type JSON = Response Obj
type Errors = (Int, String)
data VerificationStatus = Good | Bad | Unknown deriving (Show)
processRequest :: IO Resp -> IO (Status, Obj)
processRequest response = do r <- asJSON =<< response :: IO JSON
return (r ^. responseStatus, r ^. responseBody)
apiErr :: Int -> Obj -> String
apiErr code body
| code == 401 = getString "status_msg" body
| code == 400 = ret $ Map.lookup "status_msg" body
where ret val
| isNothing val = getString "status_msg" body
| otherwise = value2String $ fromJust val
definite :: String -> Obj -> Value
definite k m = fromJust $ Map.lookup k m
definite' :: String -> HObj -> Value
definite' k m = fromJust $ Hash.lookup (T.pack k) m
value2String :: Value -> String
value2String (String xs) = T.unpack xs
value2String _ = ""
value2Int :: Value -> Integer
value2Int (Number x) = coefficient x
value2Int _ = 0
value2Double :: Value -> Double
value2Double (Number x) = toRealFloat x :: Double
value2Double _ = 0
value2Map :: Value -> HObj
value2Map (Object o) = o
value2Map _ = Hash.empty
value2Vector :: Value -> V.Vector Value
value2Vector (Array a) = a
value2Vector _ = V.empty
getInt key = value2Int . definite key
getString key = value2String . definite key
getMap key = value2Map . definite key
getVec key = value2Vector . definite key
getInt' key = value2Int . definite' key
getString' key = value2String . definite' key
getMap' key = value2Map . definite' key
getVec' key = value2Vector . definite' key
postWith' :: (String -> [FormParam] -> IO (Response BS.ByteString) )
postWith' = postWith defaults'
defaults' = set checkStatus (Just $ \_ _ _ -> Nothing) defaults
videoExtensions = [".mov", ".webm", ".ogv", ".ogg", ".wmv", ".mp4",
".m4p", ".qt", ".mpg", ".mp2", ".mpeg", ".mpe"]
imageExtensions = [".png", ".jpeg", ".jpg", ".gif", ".bmp"]
fileCheck :: Integer -> Word64 -> VerificationStatus
fileCheck maxSize size =
if conv <= maxSize
then Good
else Bad
where conv = fromIntegral size :: Integer