{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} module Admin.Server ( adminApp , serveAdmin ) where import Admin.API import Admin.Components import Admin.Server.Middlewares (middlewares) import Data.ByteString.Char8 (ByteString) import Data.Version import Servant adminApp :: Components a names api => a -> [ByteString] -> Application adminApp c = let p = (Proxy :: Proxy (AdminAPI api)) in adminApp' c p adminApp' :: Components a names api => a -> Proxy (AdminAPI api) -> [ByteString] -> Application adminApp' c proxy tokens = withMiddlewares tokens $ serve proxy $ serveAdmin c withMiddlewares :: [ByteString] -> Application -> Application withMiddlewares = middlewares serveAdmin :: Components a names api => a -> Server (AdminAPI api) serveAdmin c = handleRoot :<|> serveComponents c serveComponents :: Components a names apis => a -> Server (ComponentsAPI apis) serveComponents c = return (describe c) :<|> serveAll' c handleRoot = return NoContent :<|> return (makeVersion [1])