{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Todo where
import Control.Lens
import Data.Aeson
import Data.Proxy
import Data.Text (Text)
import Data.Time (UTCTime(..), fromGregorian)
import Data.Typeable (Typeable)
import Data.Swagger
import GHC.Generics
import Servant
import Servant.Swagger
todoAPI :: Proxy TodoAPI
todoAPI = Proxy
-- | The API of a Todo service.
type TodoAPI
= "todo" :> Get '[JSON] [Todo]
:<|> "todo" :> ReqBody '[JSON] Todo :> Post '[JSON] TodoId
:<|> "todo" :> Capture "id" TodoId :> Get '[JSON] Todo
:<|> "todo" :> Capture "id" TodoId :> ReqBody '[JSON] Todo :> Put '[JSON] TodoId
-- | API for serving @swagger.json@.
type SwaggerAPI = "swagger.json" :> Get '[JSON] Swagger
-- | Combined API of a Todo service with Swagger documentation.
type API = SwaggerAPI :<|> TodoAPI
-- | A single Todo entry.
data Todo = Todo
{ created :: UTCTime -- ^ Creation datetime.
, summary :: Text -- ^ Task summary.
} deriving (Show, Generic, Typeable)
-- | A unique Todo entry ID.
newtype TodoId = TodoId Int
deriving (Show, Generic, Typeable, ToJSON, FromText)
instance ToJSON Todo
instance FromJSON Todo
instance ToSchema Todo where
declareNamedSchema proxy = genericDeclareNamedSchema defaultSchemaOptions proxy
& mapped.schema.description ?~ "This is some real Todo right here"
& mapped.schema.example ?~ toJSON (Todo (UTCTime (fromGregorian 2015 12 31) 0) "get milk")
instance ToParamSchema TodoId
instance ToSchema TodoId
-- | Swagger spec for Todo API.
todoSwagger :: Swagger
todoSwagger = toSwagger todoAPI
& info.title .~ "Todo API"
& info.version .~ "1.0"
& info.description ?~ "This is an API that tests swagger integration"
& info.license ?~ ("MIT" & url ?~ URL "http://mit.com")
-- | Combined server of a Todo service with Swagger documentation.
server :: Server API
server = return todoSwagger :<|> error "not implemented"