@@ -63,6 +63,11 @@ type AuthRoute = Route GET
63 , unauthorized :: { body :: ErrorMsg }
63 , unauthorized :: { body :: ErrorMsg }
66+type SearchRoute = Route GET
67+ ("search" :? { active :: Boolean, minScore :: Number })
69+ (ok :: { body :: { active :: Boolean, minScore :: Number } })
67 { getUser :: GetUserRoute
72 { getUser :: GetUserRoute
68 , listUsers :: ListUsersRoute
73 , listUsers :: ListUsersRoute
@@ -70,6 +75,7 @@ type API =
70 , updateUser :: UpdateUserRoute
75 , updateUser :: UpdateUserRoute
71 , deleteUser :: DeleteUserRoute
76 , deleteUser :: DeleteUserRoute
72 , me :: AuthRoute
77 , me :: AuthRoute
78+ , search :: SearchRoute
75api = client @API "http://localhost:44932"
81api = client @API "http://localhost:44932"
@@ -130,6 +136,17 @@ meHandler = handle do
130 BearerToken "secret" -> respond @"ok" { id: 1, name: "Admin", email: "admin@test.com" }
136 BearerToken "secret" -> respond @"ok" { id: 1, name: "Admin", email: "admin@test.com" }
131 _ -> reject @"unauthorized" { error: "Invalid token" }
137 _ -> reject @"unauthorized" { error: "Invalid token" }
139+searchHandler :: Handler SearchRoute ()
140+searchHandler = handle do
142+ let active = case query.active of
145+ let minScore = case query.minScore of
148+ respond @"ok" { active, minScore }
133-- Test suite
150-- Test suite
135spec :: Spec Unit
152spec :: Spec Unit
@@ -210,6 +227,21 @@ spec = around withServer $ describe "server ↔ client roundtrip" do
210 # handleErrors { unauthorized: \e -> pure { id: 0, name: e.error, email: "" } }
227 # handleErrors { unauthorized: \e -> pure { id: 0, name: e.error, email: "" } }
211 liftAff $ user.name `shouldEqual` "Invalid token"
228 liftAff $ user.name `shouldEqual` "Invalid token"
230+ describe "GET with Boolean and Number query params" do
231+ it "passes Boolean and Number query params" \_ ->
232+ runOm {} { exception: \_ -> pure unit } do
233+ result <- api.search { active: Just true, minScore: Just 3.14 }
235+ result.active `shouldEqual` true
236+ result.minScore `shouldEqual` 3.14
238+ it "handles Nothing for optional Boolean/Number" \_ ->
239+ runOm {} { exception: \_ -> pure unit } do
240+ result <- api.search { active: Nothing, minScore: Nothing }
242+ result.active `shouldEqual` false
243+ result.minScore `shouldEqual` 0.0
213-- Server setup
245-- Server setup
215withServer :: forall a. (Unit -> _ a) -> _ a
247withServer :: forall a. (Unit -> _ a) -> _ a
@@ -218,13 +250,14 @@ withServer test = bracket acquire release (\_ -> test unit)
218 acquire = do
250 acquire = do
219 fastify <- liftEffect do
251 fastify <- liftEffect do
220 f <- F.fastify {}
252 f <- F.fastify {}
221− registerAPI
253+ registerAPI @API
222 { getUser: getUserHandler
254 { getUser: getUserHandler
223 , listUsers: listUsersHandler
255 , listUsers: listUsersHandler
224 , createUser: createUserHandler
256 , createUser: createUserHandler
225 , updateUser: updateUserHandler
257 , updateUser: updateUserHandler
226 , deleteUser: deleteUserHandler
258 , deleteUser: deleteUserHandler
227 , me: meHandler
259 , me: meHandler
260+ , search: searchHandler