tangled
alpha
login
or
join now
kacaii.dev
/
senac-brigade-server
0
fork
atom
wip: currently rewriting the project as a full stack application
tangled.org/kacaii.dev/sigo
gleam
0
fork
atom
overview
issues
1
pulls
pipelines
:label: add `Session` type
kacaii.dev
2 months ago
36d3fde9
3bb4b0c6
+45
1 changed file
expand all
collapse all
unified
split
src
app
web
session.gleam
+45
src/app/web/session.gleam
···
1
1
+
import app/domain/role
2
2
+
import gleam/dynamic/decode
3
3
+
import gleam/json
4
4
+
import gleam/result
5
5
+
import wisp
6
6
+
import youid/uuid
7
7
+
8
8
+
pub const session_cookie_name = "SESSION"
9
9
+
10
10
+
pub type SessionError {
11
11
+
MissingCookie
12
12
+
Decode(json.DecodeError)
13
13
+
}
14
14
+
15
15
+
pub type Session {
16
16
+
Session(user_id: uuid.Uuid, user_role: role.Role)
17
17
+
}
18
18
+
19
19
+
pub fn extract(req: wisp.Request) {
20
20
+
use raw <- result.try(
21
21
+
wisp.get_cookie(
22
22
+
request: req,
23
23
+
name: session_cookie_name,
24
24
+
security: wisp.Signed,
25
25
+
)
26
26
+
|> result.replace_error(MissingCookie),
27
27
+
)
28
28
+
29
29
+
json.parse(raw, decoder())
30
30
+
|> result.map_error(Decode)
31
31
+
}
32
32
+
33
33
+
pub fn decoder() -> decode.Decoder(Session) {
34
34
+
use user_id <- decode.field("user_id", uuid_decoder())
35
35
+
use user_role <- decode.field("user_role", role.decoder())
36
36
+
decode.success(Session(user_id:, user_role:))
37
37
+
}
38
38
+
39
39
+
fn uuid_decoder() {
40
40
+
use field <- decode.then(decode.string)
41
41
+
case uuid.from_string(field) {
42
42
+
Error(_) -> decode.failure(uuid.v7(), "uuid")
43
43
+
Ok(value) -> decode.success(value)
44
44
+
}
45
45
+
}