summaryrefslogtreecommitdiff
path: root/lib/post_handlers.ml
blob: dc0f43bdae3711c6e7770263c3c443006f6c49f7 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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
;;