packages feed

alto-0: src/Alto/Web.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}
module Alto.Web where

import           Alto.Menu
import           Control.Lens
import           Data.Text (Text)
import           Servant

data AltoConfig =
  AltoConfig
  { _mSys :: MenuSystem
  , _initState :: ClientState
  }
  deriving (Read, Show, Eq, Ord)

makeLenses ''AltoConfig

type RootAPI = "root" :> Get '[JSON] Root
type MenuAPI = "menu" :> Capture "menuid" MenuID :> Get '[JSON] (Headers '[Header "Cache-Control" Text] Menu)
-- type CallbackAPI = "callback" :> ReqBody '[PlainText] ByteString :> Post '[JSON] Event

type API = RootAPI :<|> MenuAPI

api :: Proxy API
api = Proxy

serveRoot :: AltoConfig -> Handler Root
serveRoot cfg = return $ MenuRoot (cfg^.initState) (cfg^.mSys.topMenu)

serveMenu :: AltoConfig -> Text -> Handler Menu
serveMenu cfg i =
  case cfg ^. mSys.menuMap.at i of
    Nothing -> throwError err404
    Just m -> return m

addCacheHeader :: Handler Menu -> Handler (Headers '[Header "Cache-Control" Text] Menu)
addCacheHeader = fmap (addHeader "public, max-age=1")

altoServer :: AltoConfig -> Server API
altoServer cfg = serveRoot cfg :<|> (addCacheHeader <$> serveMenu cfg)

altoApp :: AltoConfig -> Application
altoApp c = serve api (altoServer c)