๐ฉโ๐ Firefighters API written in Gleam!
lustre
gleam
1import envoy
2import gleam/erlang/process
3import gleam/http
4import gleeunit
5import global_value
6import pog
7import server
8import server/context.{type Context, Context}
9import server/router
10import server/seed
11import shared/contract/login as login_contract
12import wisp.{type Request}
13import wisp/simulate
14
15pub fn main() {
16 gleeunit.main()
17}
18
19fn global_context() -> Context {
20 global_value.create_with_unique_name("server_test.global.data", fn() {
21 let db_process_name = process.new_name("db_conn")
22 let db = pog.named_connection(db_process_name)
23
24 let assert Ok(static_directory) = server.static_directory()
25 let assert Ok(secret_key) = envoy.get("SECRET_KEY")
26 let assert Ok(pog_config) = server.read_connection_uri(db_process_name)
27 let assert Ok(_db_process) = pog.start(pog_config)
28
29 let ctx = Context(static_directory:, db:, secret_key:)
30 let assert Ok(_result) = seed.germinate(ctx)
31
32 ctx
33 })
34}
35
36pub fn with_context(next: fn(Context) -> a) -> Nil {
37 let ctx = global_context()
38 let transaction = fn(db) {
39 next(Context(..ctx, db:))
40 Error(Nil)
41 }
42
43 let assert Error(pog.TransactionRolledBack(Nil)) =
44 pog.transaction(ctx.db, transaction)
45
46 Nil
47}
48
49pub fn with_authorization(
50 next next_request: Request,
51 ctx ctx: Context,
52) -> wisp.Request {
53 let body =
54 login_contract.RequestBody(email: seed.email, password: seed.password)
55 |> login_contract.request_to_json()
56
57 let req =
58 simulate.browser_request(http.Post, "/api/login")
59 |> simulate.json_body(body)
60
61 let resp = router.handle_request(req, ctx)
62 simulate.session(next_request, req, resp)
63}