module SwaggerPetstore.Model where
import Data.Aeson ((.:),(.:!),(.:?),(.=))
import Data.Text (Text)
import Data.Aeson (Value)
import Data.ByteString.Lazy (ByteString)
import qualified Data.Aeson as A
import qualified Data.ByteString as B
import qualified Data.Data as P (Data, Typeable)
import qualified Data.HashMap.Lazy as HM
import qualified Data.Map as Map
import qualified Data.Maybe as P
import qualified Data.Foldable as P
import qualified Web.FormUrlEncoded as WH
import qualified Web.HttpApiData as WH
import qualified Data.Time as TI
import qualified Data.Time.ISO8601 as TI
import Data.Time (UTCTime)
import Control.Applicative ((<|>))
import Control.Applicative (Alternative)
import Prelude (($), (.),(<$>),(<*>),(>>=),Maybe(..),Bool(..),Char,Double,FilePath,Float,Int,Integer,String,fmap,undefined,mempty,maybe,pure,Monad,Applicative,Functor)
import qualified Prelude as P
data ApiResponse = ApiResponse
{ apiResponseCode :: Maybe Int
, apiResponseType :: Maybe Text
, apiResponseMessage :: Maybe Text
} deriving (P.Show,P.Eq,P.Typeable)
instance A.FromJSON ApiResponse where
parseJSON = A.withObject "ApiResponse" $ \o ->
ApiResponse
<$> (o .:? "code")
<*> (o .:? "type")
<*> (o .:? "message")
instance A.ToJSON ApiResponse where
toJSON ApiResponse {..} =
_omitNulls
[ "code" .= apiResponseCode
, "type" .= apiResponseType
, "message" .= apiResponseMessage
]
mkApiResponse
:: ApiResponse
mkApiResponse =
ApiResponse
{ apiResponseCode = Nothing
, apiResponseType = Nothing
, apiResponseMessage = Nothing
}
data Category = Category
{ categoryId :: Maybe Integer
, categoryName :: Maybe Text
} deriving (P.Show,P.Eq,P.Typeable)
instance A.FromJSON Category where
parseJSON = A.withObject "Category" $ \o ->
Category
<$> (o .:? "id")
<*> (o .:? "name")
instance A.ToJSON Category where
toJSON Category {..} =
_omitNulls
[ "id" .= categoryId
, "name" .= categoryName
]
mkCategory
:: Category
mkCategory =
Category
{ categoryId = Nothing
, categoryName = Nothing
}
data Order = Order
{ orderId :: Maybe Integer
, orderPetId :: Maybe Integer
, orderQuantity :: Maybe Int
, orderShipDate :: Maybe UTCTime
, orderStatus :: Maybe Text
, orderComplete :: Maybe Bool
} deriving (P.Show,P.Eq,P.Typeable)
instance A.FromJSON Order where
parseJSON = A.withObject "Order" $ \o ->
Order
<$> (o .:? "id")
<*> (o .:? "petId")
<*> (o .:? "quantity")
<*> (o .:? "shipDate" >>= P.mapM _readDateTime)
<*> (o .:? "status")
<*> (o .:? "complete")
instance A.ToJSON Order where
toJSON Order {..} =
_omitNulls
[ "id" .= orderId
, "petId" .= orderPetId
, "quantity" .= orderQuantity
, "shipDate" .= P.fmap _showDateTime orderShipDate
, "status" .= orderStatus
, "complete" .= orderComplete
]
mkOrder
:: Order
mkOrder =
Order
{ orderId = Nothing
, orderPetId = Nothing
, orderQuantity = Nothing
, orderShipDate = Nothing
, orderStatus = Nothing
, orderComplete = Nothing
}
data Pet = Pet
{ petId :: Maybe Integer
, petCategory :: Maybe Category
, petName :: Text
, petPhotoUrls :: [Text]
, petTags :: Maybe [Tag]
, petStatus :: Maybe Text
} deriving (P.Show,P.Eq,P.Typeable)
instance A.FromJSON Pet where
parseJSON = A.withObject "Pet" $ \o ->
Pet
<$> (o .:? "id")
<*> (o .:? "category")
<*> (o .: "name")
<*> (o .: "photoUrls")
<*> (o .:? "tags")
<*> (o .:? "status")
instance A.ToJSON Pet where
toJSON Pet {..} =
_omitNulls
[ "id" .= petId
, "category" .= petCategory
, "name" .= petName
, "photoUrls" .= petPhotoUrls
, "tags" .= petTags
, "status" .= petStatus
]
mkPet
:: Text
-> [Text]
-> Pet
mkPet petName petPhotoUrls =
Pet
{ petId = Nothing
, petCategory = Nothing
, petName
, petPhotoUrls
, petTags = Nothing
, petStatus = Nothing
}
data Tag = Tag
{ tagId :: Maybe Integer
, tagName :: Maybe Text
} deriving (P.Show,P.Eq,P.Typeable)
instance A.FromJSON Tag where
parseJSON = A.withObject "Tag" $ \o ->
Tag
<$> (o .:? "id")
<*> (o .:? "name")
instance A.ToJSON Tag where
toJSON Tag {..} =
_omitNulls
[ "id" .= tagId
, "name" .= tagName
]
mkTag
:: Tag
mkTag =
Tag
{ tagId = Nothing
, tagName = Nothing
}
data User = User
{ userId :: Maybe Integer
, userUsername :: Maybe Text
, userFirstName :: Maybe Text
, userLastName :: Maybe Text
, userEmail :: Maybe Text
, userPassword :: Maybe Text
, userPhone :: Maybe Text
, userUserStatus :: Maybe Int
} deriving (P.Show,P.Eq,P.Typeable)
instance A.FromJSON User where
parseJSON = A.withObject "User" $ \o ->
User
<$> (o .:? "id")
<*> (o .:? "username")
<*> (o .:? "firstName")
<*> (o .:? "lastName")
<*> (o .:? "email")
<*> (o .:? "password")
<*> (o .:? "phone")
<*> (o .:? "userStatus")
instance A.ToJSON User where
toJSON User {..} =
_omitNulls
[ "id" .= userId
, "username" .= userUsername
, "firstName" .= userFirstName
, "lastName" .= userLastName
, "email" .= userEmail
, "password" .= userPassword
, "phone" .= userPhone
, "userStatus" .= userUserStatus
]
mkUser
:: User
mkUser =
User
{ userId = Nothing
, userUsername = Nothing
, userFirstName = Nothing
, userLastName = Nothing
, userEmail = Nothing
, userPassword = Nothing
, userPhone = Nothing
, userUserStatus = Nothing
}
_omitNulls :: [(Text, A.Value)] -> A.Value
_omitNulls = A.object . P.filter notNull
where
notNull (_, A.Null) = False
notNull _ = True
_toFormItem :: (WH.ToHttpApiData a, Functor f) => t -> f a -> f (t, [Text])
_toFormItem name x = (name,) . (:[]) . WH.toQueryParam <$> x
_emptyToNothing :: Maybe String -> Maybe String
_emptyToNothing (Just "") = Nothing
_emptyToNothing x = x
_memptyToNothing :: (P.Monoid a, P.Eq a) => Maybe a -> Maybe a
_memptyToNothing (Just x) | x P.== P.mempty = Nothing
_memptyToNothing x = x
_readDateTime :: (TI.ParseTime t, Monad m, Alternative m) => String -> m t
_readDateTime =
_parseISO8601
_showDateTime :: (t ~ UTCTime, TI.FormatTime t) => t -> String
_showDateTime =
TI.formatISO8601Millis
_parseISO8601 :: (TI.ParseTime t, Monad m, Alternative m) => String -> m t
_parseISO8601 t =
P.asum $
P.flip (TI.parseTimeM True TI.defaultTimeLocale) t <$>
["%FT%T%QZ", "%FT%T%Q%z", "%FT%T%Q%Z"]
_readDate :: (TI.ParseTime t, Monad m) => String -> m t
_readDate =
TI.parseTimeM True TI.defaultTimeLocale ""
_showDate :: TI.FormatTime t => t -> String
_showDate =
TI.formatTime TI.defaultTimeLocale ""