๐Ÿ‘ฉโ€๐Ÿš’ Firefighters API written in Gleam!
lustre gleam
at main 63 lines 1.6 kB view raw
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}