packages feed

servant-auth-token-0.5.4.0: example/acid/src/Server.hs

module Server(
  -- * Server config
    ServerConfig(..)
  , readConfig
  -- * Server environment
  , ServerEnv
  , newServerEnv
  -- * Execution of server
  , exampleServerApp
  , runExampleServer
  ) where

import Control.Monad.IO.Class
import Control.Monad.Logger
import Data.Aeson.Unit
import Data.Aeson.WithField
import Data.Proxy
import Network.Wai
import Network.Wai.Handler.Warp
import Network.Wai.Middleware.RequestLogger
import Servant.API 
import Servant.API.Auth.Token
import Servant.Server
import Servant.Server.Auth.Token

import API
import Config
import Monad

-- | Enter infinite loop of processing requests for pdf-master-server.
--
-- Starts new Warp server with initialised threads for serving the master server.
runExampleServer :: MonadIO m => ServerConfig -> m ()
runExampleServer config = liftIO $ do
  env <- newServerEnv config
  liftIO $ run (serverPort config) $ logStdoutDev $ exampleServerApp env

-- | WAI application of server
exampleServerApp :: ServerEnv -> Application
exampleServerApp e = serve api apiImpl
  where
    api = Proxy :: Proxy ExampleAPI
    apiImpl = hoistServer api (runServerM e) exampleServer

-- | Implementation of main server API
exampleServer :: ServerT ExampleAPI ServerM
exampleServer = testEndpoint
  -- Pass though requests directly to the library in these endpoints
  :<|> authSigninPostProxy
  :<|> authTouchProxy
  :<|> authSignoutProxy

testEndpoint :: MToken' '["test-permission"] -> ServerM ()
testEndpoint token = do
  runAuth $ guardAuthToken token
  $logInfo "testEndpoint"
  return ()

authSigninPostProxy :: AuthSigninPostBody -> ServerM (OnlyField "token" SimpleToken)
authSigninPostProxy AuthSigninPostBody{..} = runAuth $ authSignin (Just authSigninBodyLogin) (Just authSigninBodyPassword) authSigninBodySeconds

authTouchProxy :: Maybe Seconds -> MToken' '[] -> ServerM Unit
authTouchProxy mexpire token = runAuth $ authTouch mexpire token

authSignoutProxy :: MToken' '[] -> ServerM Unit
authSignoutProxy mtoken = runAuth $ authSignout mtoken