geochan/src/permap.ml

90 lines
2.6 KiB
OCaml
Raw Normal View History

2021-11-05 16:55:19 +01:00
let get_title content =
let open Soup in
try
let soup = content |> parse in
soup $ "h1" |> R.leaf_text
with
| Failure _e -> "Permap"
2021-11-07 10:21:01 +01:00
let render ?title content request =
2021-11-05 16:55:19 +01:00
let title =
match title with
| None -> get_title content
| Some title -> title
in
Dream.html
@@ Template.render_unsafe ~title:(Dream.html_escape title)
~content:(Dream.html_escape content)
2021-11-07 10:21:01 +01:00
request
2021-11-05 16:55:19 +01:00
2021-11-07 10:21:01 +01:00
let render_unsafe ?title content request =
2021-11-05 16:55:19 +01:00
let title =
match title with
| None -> get_title content
| Some title -> title
in
2021-11-07 10:21:01 +01:00
Dream.html @@ Template.render_unsafe ~title ~content request
2021-11-05 16:55:19 +01:00
let asset_loader _root path _request =
match Content.read ("assets/" ^ path) with
| None -> Dream.empty `Not_Found
| Some asset -> Dream.respond asset
2021-11-07 10:38:19 +01:00
let page name request =
match Content.read (name ^ ".md") with
2021-11-05 16:55:19 +01:00
| None -> Dream.empty `Not_Found
2021-11-07 10:38:19 +01:00
| Some page ->
let content = Omd.of_string page |> Omd.to_html in
render_unsafe content request
2021-11-05 16:55:19 +01:00
2021-11-07 10:38:19 +01:00
let homepage request = page "index" request
2021-11-05 16:55:19 +01:00
2021-11-07 10:21:01 +01:00
let register_get request = render_unsafe (Register.f request) request
2021-11-07 01:32:38 +01:00
let register_post request =
match%lwt Dream.form request with
| `Ok [ ("email", email); ("nick", nick); ("password", password) ] ->
2021-11-07 10:21:01 +01:00
render_unsafe (Register.f ~nick ~email ~password request) request
2021-11-07 01:32:38 +01:00
| _ -> assert false
2021-11-07 10:21:01 +01:00
let login_get request = render_unsafe (Login.f request) request
2021-11-07 01:32:38 +01:00
let login_post request =
match%lwt Dream.form request with
| `Ok [ ("nick", nick); ("password", password) ] ->
2021-11-07 10:21:01 +01:00
render_unsafe (Login.f ~nick ~password request) request
2021-11-07 01:32:38 +01:00
| _ -> assert false
2021-11-07 10:21:01 +01:00
let user request = render_unsafe (User.list ()) request
2021-11-07 01:42:18 +01:00
2021-11-07 10:32:17 +01:00
let user_profile request = render_unsafe (User.public_profile request) request
2021-11-05 16:55:19 +01:00
2021-11-07 10:26:50 +01:00
let logout request =
let _ = Dream.invalidate_session request in
let content = "Logged out !" in
render_unsafe content request
let profile_get request = render_unsafe (User_profile.f request) request
let profile_post request =
match%lwt Dream.form request with
| `Ok [ ("bio", bio) ] -> render_unsafe (User_profile.f ~bio request) request
| _ -> assert false
2021-11-07 10:32:17 +01:00
2021-11-05 16:55:19 +01:00
let () =
2021-11-07 10:26:50 +01:00
Dream.run @@ Dream.logger @@ Dream.memory_sessions
2021-11-05 16:55:19 +01:00
@@ Dream.router
[ Dream.get "/assets/**" (Dream.static ~loader:asset_loader "")
; Dream.get "/" homepage
2021-11-07 01:32:38 +01:00
; Dream.get "/register" register_get
; Dream.post "/register" register_post
; Dream.get "/login" login_get
; Dream.post "/login" login_post
; Dream.get "/user" user
2021-11-07 01:42:18 +01:00
; Dream.get "/user/:user" user_profile
2021-11-07 10:26:50 +01:00
; Dream.get "/logout" logout
; Dream.get "/profile" profile_get
; Dream.post "/profile" profile_post
2021-11-05 16:55:19 +01:00
]
@@ Dream.not_found