summaryrefslogtreecommitdiff
path: root/lib/post_handlers.ml
blob: 20357926ee70e10bcc37598aab0605263d7e9b80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
open Piaf

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
;;