From 8a2727a05e0b61d300bb46e8e913c9e60ebd6328 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Tue, 4 Nov 2025 22:49:12 +0100 Subject: Can retrieve first challenge when registered --- lambda-calcul/haskell/src/Minilang/API.hs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'lambda-calcul/haskell/src/Minilang/API.hs') diff --git a/lambda-calcul/haskell/src/Minilang/API.hs b/lambda-calcul/haskell/src/Minilang/API.hs index e9eef6a..c9cde53 100644 --- a/lambda-calcul/haskell/src/Minilang/API.hs +++ b/lambda-calcul/haskell/src/Minilang/API.hs @@ -16,7 +16,7 @@ import qualified Data.ByteString.Lazy as LBS import Data.Text (Text) import Data.Time (UTCTime) import GHC.Generics (Generic) -import Servant (Get, JSON, Raw, ReqBody, StdMethod (POST), Verb, (:<|>), (:>)) +import Servant (FromHttpApiData, Get, JSON, QueryParam, Raw, ReqBody, StdMethod (POST), ToHttpApiData, Verb, parseUrlPiece, toUrlPiece, (:<|>), (:>)) import System.Random (StdGen, uniformList) data Score = Score @@ -29,13 +29,26 @@ data Score = Score newtype User = User {username :: Text} deriving newtype (Eq, Show, ToJSON, FromJSON) -data Token = Token {token :: Text} - deriving (Eq, Show, Generic, ToJSON, FromJSON) +newtype Token = Token {unToken :: Text} + deriving newtype (Eq, Ord, Show, ToJSON, FromJSON) + +instance ToHttpApiData Token where + toUrlPiece (Token t) = t + +instance FromHttpApiData Token where + parseUrlPiece t = Right (Token t) newToken :: StdGen -> (ByteString, StdGen) newToken = first LBS.pack . uniformList 16 +data Challenge = Challenge + { level :: Int, + expr :: Text + } + deriving (Eq, Show, Generic, ToJSON, FromJSON) + type LambdaAPI = "api" :> "register" :> ReqBody '[JSON] User :> Verb 'POST 201 '[JSON] Token :<|> "api" :> "leaderboard" :> Get '[JSON] [Score] + :<|> "api" :> "challenge" :> QueryParam "token" Token :> Get '[JSON] Challenge :<|> Raw -- cgit v1.3.1