packages feed

nomyx-api-0.1.0: src/Nomyx/Api/Server.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}

module Nomyx.Api.Server where

import           Nomyx.Api.Api
import           Nomyx.Core.Types
import           Nomyx.Core.Profile
import           Nomyx.Language.Types
import           Servant
import           Servant
import qualified Network.Wai.Handler.Warp as Warp
import           Network.Wai.Middleware.Cors
import           Network.Wai
import           Control.Concurrent.STM
import           Control.Monad
import           Data.Monoid
import           Data.Typeable
import           Data.ByteString.Char8 hiding (putStrLn)
import           GHC.Generics

serveApi :: TVar Session -> IO ()
serveApi tv = do
   putStrLn "Starting Api on http://localhost:8001/"
   Warp.run 8001 $ myCors $ serveWithContext nomyxApi (basicAuthServerContext tv) (server tv)

-- | 'BasicAuthCheck' holds the handler we'll use to verify a username and password.
authCheck :: (TVar Session) -> BasicAuthCheck PlayerNumber
authCheck tv = BasicAuthCheck (authCheck' tv)

authCheck' :: (TVar Session) -> BasicAuthData -> IO (BasicAuthResult PlayerNumber)
authCheck' tv (BasicAuthData username password) = do
  s <- atomically $ readTVar tv
  mpn <- getPlayerNumber' (unpack username) s
  case mpn of
    Just pn -> return (Authorized pn)
    Nothing -> return Unauthorized

basicAuthServerContext :: TVar Session -> Context (BasicAuthCheck PlayerNumber ': '[])
basicAuthServerContext tv = (authCheck tv) :. EmptyContext
                                                                                     
customPolicy :: CorsResourcePolicy
customPolicy = simpleCorsResourcePolicy { corsMethods = simpleMethods <> ["DELETE", "PUT"] }

myCors :: Middleware
myCors = cors (const $ Just customPolicy)

putSwaggerYaml :: IO ()
putSwaggerYaml = undefined --BL.putStrLn $ encode $ toSwagger nomyxApi