diff options
Diffstat (limited to 'lib/post_handlers.ml')
-rw-r--r-- | lib/post_handlers.ml | 185 |
1 files changed, 110 insertions, 75 deletions
diff --git a/lib/post_handlers.ml b/lib/post_handlers.ml index 2035792..dc0f43b 100644 --- a/lib/post_handlers.ml +++ b/lib/post_handlers.ml @@ -1,4 +1,5 @@ open Piaf +open Shared type pool = ((module Rapper_helper.CONNECTION), Caqti_error.t) Caqti_eio.Pool.t @@ -8,32 +9,47 @@ type pool = ((module Rapper_helper.CONNECTION), Caqti_error.t) Caqti_eio.Pool.t let create_post (db_pool : pool) (request : Request.t) = Caqti_eio.Pool.use (fun conn -> - (* Parse JSON body *) - match Body.to_string request.body with - | Error _ -> Ok (Response.create `Bad_request) - | Ok body_str -> - try - let json = Yojson.Safe.from_string body_str in - let open Yojson.Safe.Util in - let title = json |> member "title" |> to_string in - let content = json |> member "content" |> to_string in - let tags = json |> member "tags" |> to_string_option |> Option.value ~default:"" in - let url = json |> member "url" |> to_string_option |> Option.value ~default:"" in - let date = Unix.time () |> Unix.gmtime |> fun tm -> - Printf.sprintf "%04d-%02d-%02d %02d:%02d:%02d" - (tm.tm_year + 1900) (tm.tm_mon + 1) tm.tm_mday - tm.tm_hour tm.tm_min tm.tm_sec in - (* Insert the post *) - match Query.create_post ~title ~content ~date ~tags ~url conn with - | Ok () -> - let response_json = `Assoc ["message", `String "Post created successfully"] in - Ok (Response.of_string ~body:(Yojson.Safe.to_string response_json) `Created) - | Error err -> - Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err); - Ok (Response.create `Internal_server_error) - with - | Yojson.Json_error _ -> Ok (Response.create `Bad_request) - | _ -> Ok (Response.create `Bad_request)) + (* Parse JSON body *) + match Body.to_string request.body with + | Error _ -> Ok (Response.create `Bad_request) + | Ok body_str -> + (try + let json = Yojson.Safe.from_string body_str in + let open Yojson.Safe.Util in + let title = json |> member "title" |> to_string in + let content = json |> member "content" |> to_string in + let tags = + json |> member "tags" |> to_string_option |> Option.value ~default:"" + in + let url = + json |> member "url" |> to_string_option |> Option.value ~default:"" + in + let date = + Unix.time () + |> Unix.gmtime + |> fun tm -> + Printf.sprintf + "%04d-%02d-%02d %02d:%02d:%02d" + (tm.tm_year + 1900) + (tm.tm_mon + 1) + tm.tm_mday + tm.tm_hour + tm.tm_min + tm.tm_sec + in + (* Insert the post *) + match Query.create_post ~title ~content ~date ~tags ~url conn with + | Ok () -> + let response_json = + `Assoc [ "message", `String "Post created successfully" ] + in + Ok (Response.of_string ~body:(Yojson.Safe.to_string response_json) `Created) + | Error err -> + Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err); + Ok (Response.create `Internal_server_error) + with + | Yojson.Json_error _ -> Ok (Response.create `Bad_request) + | _ -> Ok (Response.create `Bad_request))) db_pool ;; @@ -41,33 +57,50 @@ let create_post (db_pool : pool) (request : Request.t) = let create_comment (db_pool : pool) (request : Request.t) = Caqti_eio.Pool.use (fun conn -> - match Body.to_string request.body with - | Error _ -> Ok (Response.create `Bad_request) - | Ok body_str -> - try - let json = Yojson.Safe.from_string body_str in - let open Yojson.Safe.Util in - let content = json |> member "content" |> to_string in - let post_id = json |> member "post_id" |> to_int in - let parent = json |> member "parent" |> to_int_option in - let author = json |> member "author" |> to_string in - let tags = json |> member "tags" |> to_string_option |> Option.value ~default:"" in - let url = json |> member "url" |> to_string_option |> Option.value ~default:"" in - let date = Unix.time () |> Unix.gmtime |> fun tm -> - Printf.sprintf "%04d-%02d-%02d %02d:%02d:%02d" - (tm.tm_year + 1900) (tm.tm_mon + 1) tm.tm_mday - tm.tm_hour tm.tm_min tm.tm_sec in - (* Insert the comment *) - match Query.create_comment ~content ~date ~tags ~url ~post_id ?parent ~author conn with - | Ok () -> - let response_json = `Assoc ["message", `String "Comment created successfully"] in - Ok (Response.of_string ~body:(Yojson.Safe.to_string response_json) `Created) - | Error err -> - Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err); - Ok (Response.create `Internal_server_error) - with - | Yojson.Json_error _ -> Ok (Response.create `Bad_request) - | _ -> Ok (Response.create `Bad_request)) + match Body.to_string request.body with + | Error _ -> Ok (Response.create `Bad_request) + | Ok body_str -> + (try + let json = Yojson.Safe.from_string body_str in + let open Yojson.Safe.Util in + let content = json |> member "content" |> to_string in + let post_id = json |> member "post_id" |> to_int in + let parent = json |> member "parent" |> to_int_option in + let author = json |> member "author" |> to_string in + let tags = + json |> member "tags" |> to_string_option |> Option.value ~default:"" + in + let url = + json |> member "url" |> to_string_option |> Option.value ~default:"" + in + let date = + Unix.time () + |> Unix.gmtime + |> fun tm -> + Printf.sprintf + "%04d-%02d-%02d %02d:%02d:%02d" + (tm.tm_year + 1900) + (tm.tm_mon + 1) + tm.tm_mday + tm.tm_hour + tm.tm_min + tm.tm_sec + in + (* Insert the comment *) + match + Query.create_comment ~content ~date ~tags ~url ~post_id ?parent ~author conn + with + | Ok () -> + let response_json = + `Assoc [ "message", `String "Comment created successfully" ] + in + Ok (Response.of_string ~body:(Yojson.Safe.to_string response_json) `Created) + | Error err -> + Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err); + Ok (Response.create `Internal_server_error) + with + | Yojson.Json_error _ -> Ok (Response.create `Bad_request) + | _ -> Ok (Response.create `Bad_request))) db_pool ;; @@ -75,26 +108,28 @@ let create_comment (db_pool : pool) (request : Request.t) = let create_vote (db_pool : pool) (request : Request.t) = Caqti_eio.Pool.use (fun conn -> - match Body.to_string request.body with - | Error _ -> Ok (Response.create `Bad_request) - | Ok body_str -> - try - let json = Yojson.Safe.from_string body_str in - let open Yojson.Safe.Util in - let user_id = json |> member "user_id" |> to_string in - let vote_type = json |> member "vote_type" |> to_string in - let post_id = json |> member "post_id" |> to_int_option in - let comment_id = json |> member "comment_id" |> to_int_option in - (* Insert the vote *) - match Query.create_vote ~user_id ~vote_type ?post_id ?comment_id conn with - | Ok () -> - let response_json = `Assoc ["message", `String "Vote created successfully"] in - Ok (Response.of_string ~body:(Yojson.Safe.to_string response_json) `Created) - | Error err -> - Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err); - Ok (Response.create `Internal_server_error) - with - | Yojson.Json_error _ -> Ok (Response.create `Bad_request) - | _ -> Ok (Response.create `Bad_request)) + match Body.to_string request.body with + | Error _ -> Ok (Response.create `Bad_request) + | Ok body_str -> + (try + let json = Yojson.Safe.from_string body_str in + let open Yojson.Safe.Util in + let user_id = json |> member "user_id" |> to_string in + let vote_type = json |> member "vote_type" |> to_string in + let post_id = json |> member "post_id" |> to_int_option in + let comment_id = json |> member "comment_id" |> to_int_option in + (* Insert the vote *) + match Query.create_vote ~user_id ~vote_type ?post_id ?comment_id conn with + | Ok () -> + let response_json = + `Assoc [ "message", `String "Vote created successfully" ] + in + Ok (Response.of_string ~body:(Yojson.Safe.to_string response_json) `Created) + | Error err -> + Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err); + Ok (Response.create `Internal_server_error) + with + | Yojson.Json_error _ -> Ok (Response.create `Bad_request) + | _ -> Ok (Response.create `Bad_request))) db_pool -;;
\ No newline at end of file +;; |