git.iko.soy/rowtype-yoga/purescript-yoga-fetch-om
on main help sign in
121 lines 3.3 kB history raw
1module Complete.Example where
3import Prelude
5import Data.Array (length)
6import Justifill (justifill)
7import Effect.Class.Console (log)
8import Yoga.Fetch.Om (GET, POST, PUT, DELETE, Route, JSON, type (/), type (:), type (:?), client)
9import Yoga.HTTP.API.Route (BearerToken(..))
10import Yoga.Om (Om, handleErrors)
12type User =
13 { id :: Int
14 , name :: String
15 , email :: String
16 }
18type CreateUserRequest =
19 { name :: String
20 , email :: String
21 }
23type UpdateUserRequest =
24 { name :: String
25 , email :: String
26 }
28type ErrorMessage =
29 { error :: String
30 }
32type UserAPI =
33 { getUser ::
34 Route GET ("users" / "id" : Int)
35 {}
36 ( ok :: { body :: User }
37 , notFound :: { body :: ErrorMessage }
38 )
39 , listUsers ::
40 Route GET ("users" :? { limit :: Int, offset :: Int })
41 {}
42 ( ok :: { body :: Array User }
43 )
44 , createUser ::
45 Route POST "users"
46 { body :: JSON CreateUserRequest }
47 ( created :: { body :: User }
48 , badRequest :: { body :: ErrorMessage }
49 )
50 , updateUser ::
51 Route PUT ("users" / "id" : Int)
52 { body :: JSON UpdateUserRequest }
53 ( ok :: { body :: User }
54 , notFound :: { body :: ErrorMessage }
55 , badRequest :: { body :: ErrorMessage }
56 )
57 , deleteUser ::
58 Route DELETE ("users" / "id" : Int)
59 {}
60 ( noContent :: {}
61 , notFound :: { body :: ErrorMessage }
62 )
63 , createUserAuth ::
64 Route POST "users"
65 { headers :: Record (authorization :: BearerToken), body :: JSON CreateUserRequest }
66 ( created :: { body :: User }
67 , badRequest :: { body :: ErrorMessage }
68 )
69 }
71api = client @UserAPI "https://api.example.com"
73exampleGetUser :: Om {} (notFound :: ErrorMessage) Unit
74exampleGetUser = do
75 user <- api.getUser { id: 42 }
76 log $ "Found user: " <> user.name <> " (" <> user.email <> ")"
78exampleGetUserHandled :: Om {} () Unit
79exampleGetUserHandled = do
80 user <- api.getUser { id: 42 }
81 # handleErrors
82 { notFound: \err -> ado
83 log $ "User not found: " <> err.error
84 in { id: 0, name: "unknown", email: "" }
85 }
86 log $ "Found user: " <> user.name
88exampleListUsers :: Om {} () Unit
89exampleListUsers = do
90 users <- api.listUsers (justifill { limit: 10, offset: 0 })
91 log $ "Found " <> show (length users) <> " users"
93exampleCreateUser :: Om {} (badRequest :: ErrorMessage) Unit
94exampleCreateUser = do
95 user <- api.createUser
96 { name: "Alice"
97 , email: "alice@example.com"
98 }
99 log $ "Created user with ID: " <> show user.id
101exampleUpdateUser :: Om {} (notFound :: ErrorMessage, badRequest :: ErrorMessage) Unit
102exampleUpdateUser = do
103 user <- api.updateUser
104 { id: 42 }
105 { name: "Alice Updated"
106 , email: "alice.new@example.com"
107 }
108 log $ "Updated user: " <> user.name
110exampleDeleteUser :: Om {} (notFound :: ErrorMessage) Unit
111exampleDeleteUser = do
112 _ <- api.deleteUser { id: 42 }
113 log "User deleted successfully"
115exampleCreateUserAuth :: Om {} (badRequest :: ErrorMessage) Unit
116exampleCreateUserAuth = do
117 user <- api.createUserAuth { authorization: BearerToken "abc123" }
118 { name: "Alice"
119 , email: "alice@example.com"
120 }
121 log $ "Created user with ID: " <> show user.id