summaryrefslogtreecommitdiff
path: root/lib/pages.ml
blob: e52332f48f9f8dec7182999a0281f37d08d9e507 (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
open Piaf

type pool = ((module Rapper_helper.CONNECTION), Caqti_error.t) Caqti_eio.Pool.t

(* This is the main handler function for the GET /posts endpoint. *)
(* It takes a database connection pool and a Piaf request as input. *)
let get_root (db_pool : pool) (request : Request.t) =
  let _coki = Piaf.Cookies.Cookie.parse request.headers in
  (* Use a connection from the pool. Caqti_eio.Pool.use handles acquiring and releasing the connection. *)
  Caqti_eio.Pool.use
    (fun conn ->
      (* Call the get_poasts function from the Query module to fetch posts from the database. *)
      let posts_or_error = Query.get_poasts () conn in
      (* Pattern match on the result of the database query. *)
      match posts_or_error with
      (* If the query is successful, the result is a list of posts. *)
      | Ok posts ->
        (* Map the list of post tuples to a Yojson list. *)
        let json =
          `List
            ((* For each post tuple, create a JSON object. *)
             List.map
               (fun (post : Query.post_summary) -> `Assoc [ "title", `String post.title ])
               posts)
        in
        (* Return a 200 OK response with the JSON body. *)
        Ok (Response.of_string ~body:(Yojson.Safe.to_string json) `OK)
      (* If the query fails, log the error and return a 500 Internal Server Error response. *)
      | Error err ->
        Logs.err (fun m -> m "Database error: %a" Caqti_error.pp err);
        Ok (Response.create `Internal_server_error))
    db_pool
;;