summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2025-11-05 08:24:05 +0100
committerArnaud Bailly <arnaud@pankzsoft.com>2025-11-05 08:24:05 +0100
commit246d370bd903edeb5570b6f016556528b8ca57fc (patch)
tree0ce7b42c2644d1ea65b3284533666606ccc6fa61 /lambda-calcul/haskell/src/Minilang
parentabd07940e50d4b86024410971fc2c4dff058fd48 (diff)
downloadlambda-nantes-246d370bd903edeb5570b6f016556528b8ca57fc.tar.gz
can cleanup registered users
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang')
-rw-r--r--lambda-calcul/haskell/src/Minilang/API.hs19
-rw-r--r--lambda-calcul/haskell/src/Minilang/App.hs21
2 files changed, 37 insertions, 3 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/API.hs b/lambda-calcul/haskell/src/Minilang/API.hs
index 8082ac8..94976d2 100644
--- a/lambda-calcul/haskell/src/Minilang/API.hs
+++ b/lambda-calcul/haskell/src/Minilang/API.hs
@@ -16,11 +16,28 @@ import qualified Data.ByteString.Lazy as LBS
import Data.Text (Text)
import Data.Time (UTCTime)
import GHC.Generics (Generic)
-import Servant (FromHttpApiData, Get, JSON, Post, QueryParam, Raw, ReqBody, StdMethod (POST), ToHttpApiData, Verb, parseUrlPiece, toUrlPiece, (:<|>), (:>))
+import Servant
+ ( Delete,
+ FromHttpApiData,
+ Get,
+ JSON,
+ Post,
+ QueryParam,
+ Raw,
+ ReqBody,
+ StdMethod (POST),
+ ToHttpApiData,
+ Verb,
+ parseUrlPiece,
+ toUrlPiece,
+ (:<|>),
+ (:>),
+ )
import System.Random (StdGen, uniformList)
type LambdaAPI =
"api" :> "register" :> ReqBody '[JSON] User :> Verb 'POST 201 '[JSON] Token
+ :<|> "api" :> "register" :> QueryParam "token" Token :> Delete '[JSON] Score
:<|> "api" :> "leaderboard" :> Get '[JSON] [Score]
:<|> "api" :> "score" :> QueryParam "token" Token :> Get '[JSON] Score
:<|> "api" :> "challenge" :> QueryParam "token" Token :> Get '[JSON] Challenge
diff --git a/lambda-calcul/haskell/src/Minilang/App.hs b/lambda-calcul/haskell/src/Minilang/App.hs
index 9086d27..915f264 100644
--- a/lambda-calcul/haskell/src/Minilang/App.hs
+++ b/lambda-calcul/haskell/src/Minilang/App.hs
@@ -24,7 +24,7 @@ import Minilang.REPL (withInputs)
import Minilang.REPL.Purer (PurerEnv (..))
import Minilang.REPL.Types (In (..), Out (..), initialREPL)
import Network.Wai.Application.Static (defaultFileServerSettings, staticApp)
-import Servant (ServerT, err400, err500, errBody, (:<|>) (..))
+import Servant (ServerT, err400, err500, errBody, (:<|>) (..), err404)
import Servant.Server (Application, Handler (..), Tagged (..))
import System.Random (StdGen)
@@ -50,6 +50,7 @@ runApp env = Handler . ExceptT . try . flip runReaderT env . runAppM
lambdaApp :: (MonadIO m, MonadReader Env m) => ServerT LambdaAPI m
lambdaApp =
registerUser
+ :<|> unregisterUser
:<|> getLeaderboard
:<|> getUser
:<|> getChallenge
@@ -68,6 +69,22 @@ registerUser user@(User name) = do
writeTVar tvar updatedMap
pure token
+unregisterUser :: (MonadReader Env m, MonadIO m) => Maybe Token -> m Score
+unregisterUser Nothing = liftIO $ throwM $ err400 {errBody = "Missing token"}
+unregisterUser (Just token) = do
+ checkUserToken token
+ score <-
+ asks users
+ >>= liftIO . atomically . \tvar -> do
+ usersMap <- readTVar tvar
+ let score = Map.lookup token usersMap
+ updatedMap = Map.delete token usersMap
+ writeTVar tvar updatedMap
+ pure score
+ case score of
+ Nothing -> liftIO $ throwM $ err400 {errBody = "User does not exist"}
+ Just s -> pure s
+
checkDuplicateUser :: (MonadIO m, MonadReader Env m) => Text -> m ()
checkDuplicateUser name =
asks users >>= \user -> liftIO $ atomically $ do
@@ -97,7 +114,7 @@ getUser :: (MonadIO m, MonadReader Env m) => Maybe Token -> m Score
getUser mToken = do
usersMap <- asks users >>= liftIO . readTVarIO
case mToken >>= (`Map.lookup` usersMap) of
- Nothing -> liftIO $ throwM $ err400 {errBody = "User does not exist"}
+ Nothing -> liftIO $ throwM $ err404 {errBody = "User does not exist"}
Just score -> pure score
getChallenge :: (MonadReader Env m, MonadIO m) => Maybe Token -> m Challenge