wip: currently rewriting the project as a full stack application tangled.org/kacaii.dev/sigo
gleam

:label: add `Session` type

+45
+45
src/app/web/session.gleam
··· 1 + import app/domain/role 2 + import gleam/dynamic/decode 3 + import gleam/json 4 + import gleam/result 5 + import wisp 6 + import youid/uuid 7 + 8 + pub const session_cookie_name = "SESSION" 9 + 10 + pub type SessionError { 11 + MissingCookie 12 + Decode(json.DecodeError) 13 + } 14 + 15 + pub type Session { 16 + Session(user_id: uuid.Uuid, user_role: role.Role) 17 + } 18 + 19 + pub fn extract(req: wisp.Request) { 20 + use raw <- result.try( 21 + wisp.get_cookie( 22 + request: req, 23 + name: session_cookie_name, 24 + security: wisp.Signed, 25 + ) 26 + |> result.replace_error(MissingCookie), 27 + ) 28 + 29 + json.parse(raw, decoder()) 30 + |> result.map_error(Decode) 31 + } 32 + 33 + pub fn decoder() -> decode.Decoder(Session) { 34 + use user_id <- decode.field("user_id", uuid_decoder()) 35 + use user_role <- decode.field("user_role", role.decoder()) 36 + decode.success(Session(user_id:, user_role:)) 37 + } 38 + 39 + fn uuid_decoder() { 40 + use field <- decode.then(decode.string) 41 + case uuid.from_string(field) { 42 + Error(_) -> decode.failure(uuid.v7(), "uuid") 43 + Ok(value) -> decode.success(value) 44 + } 45 + }