wip: delete post

This commit is contained in:
Swrup 2022-02-21 09:46:27 +01:00
parent 667dba9704
commit b710f08c3b
5 changed files with 63 additions and 1 deletions

View file

@ -193,6 +193,10 @@ module Q = struct
let get_threads = let get_threads =
Caqti_request.collect Caqti_type.unit Caqti_type.string Caqti_request.collect Caqti_type.unit Caqti_type.string
"SELECT thread_id FROM thread_info;" "SELECT thread_id FROM thread_info;"
let delete_post =
Caqti_request.exec Caqti_type.string
"DELETE FROM post_user WHERE post_id=?;"
end end
let () = let () =
@ -442,3 +446,10 @@ let get_op id =
let get_posts ids = unwrap_list get_post ids let get_posts ids = unwrap_list get_post ids
let get_ops ids = unwrap_list get_op ids let get_ops ids = unwrap_list get_op ids
let try_delete_post ~nick id =
let* post = get_post id in
if post.nick = nick then
let^ () = Db.exec Q.delete_post id in
Ok ()
else Error "You can only delete your posts"

20
src/delete_page.eml.html Normal file
View file

@ -0,0 +1,20 @@
let f post_preview post_id request =
<script type="text/javascript" src="/assets/js/js_catalog.js" defer="defer"></script>
<%s! post_preview %>
% let url = Format.sprintf "/delete/%s" post_id in
% begin match Dream.session "nick" request with
% | None ->
% let redirect = Dream.to_percent_encoded url in
<a href="/login?redirect=<%s redirect%>">Login</a> to delete your post.
% | Some _nick ->
<div class="row mb-3">
<div class="col-md-6" id="delete-form">
<div class="postForm">
<%s! Dream.form_tag ~action:url ~enctype:`Multipart_form_data request %>
<button name="delete-button" type="submit" class="btn btn-primary">DELETE</button>
</form>
</div>
</div>
</div>
% end;

View file

@ -5,6 +5,7 @@
babillard babillard
babillard_page babillard_page
catalog_page catalog_page
delete_page
bindings bindings
content content
db db
@ -42,6 +43,12 @@
(action (action
(run dream_eml %{deps} --workspace %{workspace_root}))) (run dream_eml %{deps} --workspace %{workspace_root})))
(rule
(targets delete_page.ml)
(deps delete_page.eml.html)
(action
(run dream_eml %{deps} --workspace %{workspace_root})))
(rule (rule
(targets template.ml) (targets template.ml)
(deps template.eml.html) (deps template.eml.html)

View file

@ -70,6 +70,25 @@ let catalog request =
in in
render_unsafe (Catalog_page.f catalog_content) request render_unsafe (Catalog_page.f catalog_content) request
let delete_get request =
let post_id = Dream.param request "post_id" in
let post_preview =
Result.fold ~ok:Fun.id ~error:Fun.id (Pp_babillard.view_post post_id)
in
render_unsafe (Delete_page.f post_preview post_id request) request
let delete_post request =
let post_id = Dream.param request "post_id" in
match Dream.session "nick" request with
| None -> render_unsafe "Not logged in" request
| Some nick -> (
match Babillard.try_delete_post ~nick post_id with
| Error e -> render_unsafe e request
| Ok () ->
Dream.respond ~status:`See_Other
~headers:[ ("Location", "/") ]
"Your post was deleted!" )
let user request = let user request =
render_unsafe (Result.fold ~ok:Fun.id ~error:Fun.id (User.list ())) request render_unsafe (Result.fold ~ok:Fun.id ~error:Fun.id (User.list ())) request
@ -273,6 +292,8 @@ let routes =
; get_ "/thread/:thread_id" thread_get ; get_ "/thread/:thread_id" thread_get
; post "/thread/:thread_id" reply_post ; post "/thread/:thread_id" reply_post
; get_ "/catalog" catalog ; get_ "/catalog" catalog
; get_ "/delete/:post_id" delete_get
; post "/delete/:post_id" delete_post
] ]
@ @
if App.open_registration then if App.open_registration then

View file

@ -122,6 +122,10 @@ let pp_post fmt t =
in in
pp pp
let view_post id =
let* post = get_post id in
Ok (Format.asprintf "%a" pp_post (Post post))
let pp_thread_preview fmt op = let pp_thread_preview fmt op =
let thread_data, post = op in let thread_data, post = op in
let thread_preview = let thread_preview =
@ -137,7 +141,6 @@ let pp_thread_preview fmt op =
thread_preview thread_preview
let catalog_content () = let catalog_content () =
Format.printf "catalog_content@.";
let^ ids = Db.collect_list Q.get_threads () in let^ ids = Db.collect_list Q.get_threads () in
let* ops = get_ops ids in let* ops = get_ops ids in
let previews = List.map (Format.asprintf "%a" pp_thread_preview) ops in let previews = List.map (Format.asprintf "%a" pp_thread_preview) ops in