this repo has no description
lustre frontent oat-ui gleam
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

🚧 start working on access token

+71 -11
+5 -5
src/client/session.gleam
··· 1 1 import client/route 2 - import client/user 2 + import client/session/token 3 3 import gleam/dynamic/decode 4 4 5 5 pub type Session { 6 6 /// User is sucessfully authenticated 7 - Authenticated(user: user.User) 7 + Authenticated(token.Token) 8 8 /// User is waiting for the Server to validate their credentials 9 9 Pending(on_success: route.Route, on_error: route.Route) 10 10 ··· 17 17 18 18 case variant { 19 19 "authenticated" -> { 20 - use user <- decode.field("user", user.decoder()) 21 - decode.success(Authenticated(user:)) 20 + use token <- decode.field("token", token.decoder()) 21 + decode.success(Authenticated(token)) 22 22 } 23 23 24 24 "pending" -> { ··· 28 28 } 29 29 30 30 "none" -> decode.success(None) 31 - _ -> decode.failure(None, "Session") 31 + _ -> decode.failure(None, "session") 32 32 } 33 33 }
+33
src/client/session/token.gleam
··· 1 + import client/user 2 + import gleam/dynamic/decode 3 + import gleam/http/request 4 + import gleam/json 5 + 6 + pub opaque type Token { 7 + Token(access_token: String, token_type: String, user: user.User) 8 + } 9 + 10 + pub fn decoder() -> decode.Decoder(Token) { 11 + use access_token <- decode.field("access_token", decode.string) 12 + use token_type <- decode.field("token_type", decode.string) 13 + use user <- decode.field("user", user.decoder()) 14 + 15 + decode.success(Token(access_token:, token_type:, user:)) 16 + } 17 + 18 + pub fn to_json(token: Token) -> json.Json { 19 + let Token(access_token:, token_type:, user:) = token 20 + json.object([ 21 + #("access_token", json.string(access_token)), 22 + #("token_type", json.string(token_type)), 23 + #("user", user.to_json(user)), 24 + ]) 25 + } 26 + 27 + pub fn include(req: request.Request(_), token: Token) -> request.Request(_) { 28 + let value = 29 + to_json(token) 30 + |> json.to_string 31 + 32 + request.set_header(req, "authorization", "bearer " <> value) 33 + }
+10
src/client/user.gleam
··· 1 1 import gleam/dynamic/decode 2 + import gleam/json 2 3 3 4 pub type User { 4 5 User(id: String, full_name: String, email: String) 6 + } 7 + 8 + pub fn to_json(user: User) -> json.Json { 9 + let User(id:, full_name:, email:) = user 10 + json.object([ 11 + #("id", json.string(id)), 12 + #("full_name", json.string(full_name)), 13 + #("email", json.string(email)), 14 + ]) 5 15 } 6 16 7 17 pub fn decoder() -> decode.Decoder(User) {
+19 -1
test/dummy.gleam
··· 3 3 import client/page 4 4 import client/route 5 5 import client/session 6 + import client/session/token 6 7 import client/user.{type User, User} 8 + import gleam/json 7 9 8 10 pub fn user() -> User { 9 11 User(id: "", full_name: "Dummy", email: "dummy@lustre.dev") 10 12 } 11 13 12 14 pub fn session() -> session.Session { 13 - session.Authenticated(user()) 15 + session.Authenticated(token()) 16 + } 17 + 18 + pub fn token() -> token.Token { 19 + let body = 20 + json.object([ 21 + #("access_token", json.string("access_token")), 22 + #("token_type", json.string("bearer")), 23 + #("user", user.to_json(user())), 24 + ]) 25 + 26 + let assert Ok(token) = { 27 + json.to_string(body) 28 + |> json.parse(token.decoder()) 29 + } 30 + 31 + token 14 32 } 15 33 16 34 pub fn model(session: session.Session, route: route.Route) -> client.Model {
+4 -5
test/page/login_test.gleam
··· 30 30 } 31 31 32 32 pub fn auth_success_test() -> Nil { 33 - let want = dummy.user() 33 + let want = dummy.token() 34 34 35 35 let model = 36 36 Ok(session.Authenticated(want)) 37 37 |> login.ApiReturnedSession 38 38 |> login.update(login.empty, _) 39 39 40 - let assert login.ServerAuthenticatedUser(resp) = model as "user authenticated" 41 - let assert session.Authenticated(got) = resp as "correct user" 42 - 43 - assert got == want 40 + let assert login.ServerAuthenticatedUser(session) = model 41 + let assert session.Authenticated(got) = session 42 + assert got == want as "correct token" 44 43 45 44 Nil 46 45 }