diff options
| author | Fuwn <[email protected]> | 2024-05-14 06:37:52 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-05-14 06:37:52 +0000 |
| commit | 71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3 (patch) | |
| tree | fc3dec26c9280af36357100e33a30bf29998b908 /src/request.gleam | |
| download | mayu-71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3.tar.xz mayu-71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3.zip | |
feat: initial release
Diffstat (limited to 'src/request.gleam')
| -rw-r--r-- | src/request.gleam | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/request.gleam b/src/request.gleam new file mode 100644 index 0000000..8476fd5 --- /dev/null +++ b/src/request.gleam @@ -0,0 +1,57 @@ +import database +import gleam/json +import gleam/string_builder +import svg +import wisp.{type Response} + +fn middleware( + request: wisp.Request, + handle: fn(wisp.Request) -> wisp.Response, +) -> wisp.Response { + let request = wisp.method_override(request) + + use <- wisp.log_request(request) + use <- wisp.rescue_crashes + use request <- wisp.handle_head(request) + + handle(request) +} + +pub fn handle(request, connection) -> Response { + use _ <- middleware(request) + + case wisp.path_segments(request) { + ["heart-beat"] -> + wisp.html_response(string_builder.from_string("alive"), 200) + ["get", "@" <> name] -> + wisp.ok() + |> wisp.set_header("Content-Type", "image/svg+xml") + |> wisp.string_body(svg.xml( + case wisp.get_query(request) { + [#("theme", theme)] -> theme + _ -> "asoul" + }, + database.get_counter(connection, name).num, + )) + ["record", "@" <> name] -> { + let counter = database.get_counter(connection, name) + + case + Ok( + json.to_string_builder( + json.object([ + #("name", json.string(counter.name)), + #("num", json.int(counter.num)), + #("updated_at", json.string(counter.updated_at)), + #("created_at", json.string(counter.created_at)), + ]), + ), + ) + { + Ok(builder) -> wisp.json_response(builder, 200) + Error(_) -> wisp.unprocessable_entity() + } + } + _ -> wisp.html_response(string_builder.from_string("Not found"), 404) + } +} |