geochan/src/permap.ml

295 lines
9.4 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-08 15:24:10 +01:00
| `Ok _
| `Many_tokens _
| `Missing_token _
| `Invalid_token _
| `Wrong_session _
| `Expired _
| `Wrong_content_type ->
assert false
2021-11-07 01:32:38 +01:00
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
2022-01-14 21:36:25 +01:00
let user request =
render_unsafe
( match User.list () with
| Ok s -> s
| Error _ -> "" )
request
2021-11-07 01:42:18 +01:00
2022-01-14 21:36:25 +01:00
let user_profile request =
render_unsafe
( match User.public_profile request with
| Ok s -> s
| Error e -> e )
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
2021-11-08 15:24:10 +01:00
let profile_get request =
match Dream.session "nick" request with
| None -> render_unsafe "Not logged in" request
| Some nick ->
let bio =
match User.get_bio nick with
| Ok bio -> bio
| Error e -> e
in
render_unsafe (User_profile.f nick bio request) request
let profile_post request =
2021-11-08 15:24:10 +01:00
match Dream.session "nick" request with
| None -> render_unsafe "Not logged in" request
| Some nick -> (
match%lwt Dream.form request with
2022-01-14 21:36:25 +01:00
| `Ok [ ("bio", bio) ] -> (
match User.update_bio bio nick with
| Ok () ->
Dream.respond ~status:`See_Other
~headers:[ ("Location", "/profile") ]
"Your bio was updated!"
| Error e -> render_unsafe e request )
2021-11-08 15:24:10 +01:00
| `Ok _
| `Many_tokens _
| `Missing_token _
| `Invalid_token _
| `Wrong_session _
| `Expired _
| `Wrong_content_type -> (
match%lwt Dream.multipart request with
2022-01-14 21:36:25 +01:00
| `Ok [ ("file", file) ] -> (
match User.upload_avatar file nick with
| Ok () ->
Dream.respond ~status:`See_Other
~headers:[ ("Location", "/profile") ]
"Your avatar was updated!"
| Error e -> render_unsafe e request )
2021-11-08 15:24:10 +01:00
| `Ok _ -> Dream.empty `Bad_Request
| `Expired _
| `Many_tokens _
| `Missing_token _
| `Invalid_token _
| `Wrong_session _
| `Wrong_content_type ->
Dream.empty `Bad_Request ) )
let avatar_image request =
let nick = Dream.param "user" request in
let avatar = User.get_avatar nick in
match avatar with
| Ok (Some avatar) ->
Dream.respond ~headers:[ ("Content-Type", "image") ] avatar
| Ok None
| Error _ -> (
match Content.read "/assets/img/default_avatar.png" with
| None -> Dream.empty `Not_Found
| Some avatar -> Dream.respond ~headers:[ ("Content-Type", "image") ] avatar
)
2021-11-07 10:32:17 +01:00
2021-12-29 21:07:17 +01:00
let post_image request =
let post_id = Dream.param "post_id" request in
let image = Babillard.get_post_image post_id in
match image with
2022-01-12 15:38:30 +01:00
| Ok image -> Dream.respond ~headers:[ ("Content-Type", "image") ] image
| Error _ -> Dream.empty `Not_Found
2021-12-29 21:07:17 +01:00
let markers ~board request =
let markers = Babillard.get_markers board in
match markers with
| Ok markers ->
Dream.respond ~headers:[ ("Content-Type", "application/json") ] markers
2021-12-29 21:07:17 +01:00
| Error e -> render_unsafe e request
2022-01-18 00:12:03 +01:00
let babillard_get ~board request =
render_unsafe (Babillard_page.f ~board request) request
2021-12-29 21:07:17 +01:00
let newthread_get ~board request =
render_unsafe (Newthread_page.f ~board request) request
let newthread_post ~board request =
2021-12-29 21:07:17 +01:00
match Dream.session "nick" request with
| None -> render_unsafe "Not logged in" request
| Some nick -> (
match%lwt Dream.multipart request with
(*TODO jpp du duplicat la *)
| `Ok
[ ("file", file)
; ("lat_input", [ (_, lat) ])
; ("lng_input", [ (_, lng) ])
; ("subject", [ (_, subject) ])
; ("tags", [ (_, tags) ])
; ("threadComment", [ (_, comment) ])
]
| `Ok
(("file", file)
:: ("lat_input", [ (_, lat) ])
:: ("lng_input", [ (_, lng) ])
:: ("subject", [ (_, subject) ])
:: ("tags", [ (_, tags) ])
:: ("threadComment", [ (_, comment) ]) :: _ :: _ ) -> (
match (Float.of_string_opt lat, Float.of_string_opt lng) with
| None, _ -> render_unsafe "Invalide coordinate" request
| _, None -> render_unsafe "Invalide coordinate" request
| Some lat, Some lng -> (
match file with
| [] -> render_unsafe "No image" request
| _ :: _ :: _ -> render_unsafe "More than one image" request
2022-01-10 18:39:29 +01:00
| [ file ] -> (
match
Babillard.make_op ~comment ~image:file ~lat ~lng ~subject ~tags
~board nick
2022-01-10 18:39:29 +01:00
with
| Ok thread_id ->
let adress =
Format.asprintf "/%a/%s" Babillard.pp_board board thread_id
in
2022-01-17 21:55:09 +01:00
Dream.respond ~status:`See_Other
~headers:[ ("Location", adress) ]
2022-01-14 21:36:25 +01:00
"Your thread was posted!"
2022-01-10 18:39:29 +01:00
| Error e -> render_unsafe e request ) ) )
2021-12-29 21:07:17 +01:00
| `Ok _ -> Dream.empty `Bad_Request
| `Expired _
| `Many_tokens _
| `Missing_token _
| `Invalid_token _
| `Wrong_session _
| `Wrong_content_type ->
Dream.empty `Bad_Request )
let thread_get request =
let thread_id = Dream.param "thread_id" request in
let thread_view = Babillard.view_thread thread_id in
match thread_view with
| Error e -> render_unsafe e request
| Ok thread_view ->
render_unsafe (Thread_page.f thread_view thread_id request) request
(* get thread view but not wrapped in template, so we can display it on /babillard*)
let thread_view request =
let thread_id = Dream.param "thread_id" request in
let thread_view = Babillard.view_thread thread_id in
match thread_view with
| Error e -> render_unsafe e request
2022-01-10 18:39:29 +01:00
| Ok thread_view -> Dream.html (Thread_page.f thread_view thread_id request)
2021-12-29 21:07:17 +01:00
(*form to reply to a thread *)
let reply_post request =
2021-12-29 21:07:17 +01:00
match Dream.session "nick" request with
| None -> render_unsafe "Not logged in" request
| Some nick -> (
match%lwt Dream.multipart request with
| `Ok
[ ("file", file)
; ("replyComment", [ (_, comment) ])
; ("tags", [ (_, tags) ])
]
| `Ok
(("file", file)
:: ("tags", [ (_, tags) ])
2022-01-10 18:39:29 +01:00
:: ("replyComment", [ (_, comment) ]) :: _ :: _ ) -> (
2021-12-29 21:07:17 +01:00
let parent_id = Dream.param "thread_id" request in
let res =
match file with
| [] -> Babillard.make_reply ~comment ~tags ~parent_id nick
| [ file ] ->
Babillard.make_reply ~comment ~image:file ~tags ~parent_id nick
2021-12-29 21:07:17 +01:00
| _ :: _ :: _ -> Error "More than one image"
in
2022-01-10 18:39:29 +01:00
match res with
| Ok post_id ->
let adress = Format.sprintf "/babillard/%s#%s" parent_id post_id in
2022-01-17 21:55:09 +01:00
Dream.respond ~status:`See_Other
~headers:[ ("Location", adress) ]
2022-01-14 21:36:25 +01:00
"Your reply was posted!"
2022-01-10 18:39:29 +01:00
| Error e -> render_unsafe e request )
2021-12-29 21:07:17 +01:00
| `Ok _ -> Dream.empty `Bad_Request
| `Expired _
| `Many_tokens _
| `Missing_token _
| `Invalid_token _
| `Wrong_session _
| `Wrong_content_type ->
Dream.empty `Bad_Request )
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-08 15:24:10 +01:00
; Dream.get "/user/:user/avatar" avatar_image
2021-11-07 10:26:50 +01:00
; Dream.get "/logout" logout
; Dream.get "/profile" profile_get
; Dream.post "/profile" profile_post
2021-12-29 21:07:17 +01:00
; Dream.get "/thread_view/:thread_id" thread_view
; Dream.get "/babillard/markers" (markers ~board:Babillard)
; Dream.get "/post_pic/:post_id" post_image
2022-01-18 00:12:03 +01:00
; Dream.get "/babillard" (babillard_get ~board:Babillard)
; Dream.get "/babillard/new_thread" (newthread_get ~board:Babillard)
; Dream.post "/babillard/new_thread" (newthread_post ~board:Babillard)
; Dream.get "/babillard/:thread_id" thread_get
; Dream.post "/reply/:thread_id" reply_post
2021-12-29 21:07:17 +01:00
; Dream.get "/post_pic/:post_id" post_image
2021-11-05 16:55:19 +01:00
]
@@ Dream.not_found