open Piaf open Shared type pool = ((module Rapper_helper.CONNECTION), Caqti_error.t) Caqti_eio.Pool.t (* POST handlers for creating resources *) (* Handler for POST /posts - creates a new post *) 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))) db_pool ;; (* Handler for POST /comments - creates a new comment *) 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))) db_pool ;; (* Handler for POST /votes - creates a new vote *) 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))) db_pool ;;