summaryrefslogtreecommitdiff
path: root/bin/server.ml
blob: f5a8830d51a7730802ea66830cec312c75d4401c (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
open Eio
open Piaf

let setup_log ?style_renderer level =
  Logs_threaded.enable ();
  Fmt_tty.setup_std_outputs ?style_renderer ();
  Logs.set_level ~all:true level;
  Logs.set_reporter (Logs_fmt.reporter ())
;;

let request_handler ~db_pool Server.{ request; _ } =
  match Lib.Router.match_route request.meth request.target with
  | Some handler ->
    (match handler db_pool request with
     | Ok response -> response
     | Error err ->
       Logs.err (fun m -> m "Handler error: %a" Caqti_error.pp err);
       Response.create `Internal_server_error)
  | None ->
    Logs.info (fun d -> d "the fuck %S\n" request.target);
    Response.create `Not_found
;;

let () =
  setup_log (Some Logs.Info);
  Eio_main.run
  @@ fun env ->
  Switch.run
  @@ fun sw ->
  let config =
    let interface = Net.Ipaddr.V4.any in
    let port = 4455 in
    `Tcp (interface, port)
  in
  let config = Server.Config.create config in
  let db_uri =
    Uri.make ~scheme:"sqlite3" ~path:"/home/y/code/ocaml/bs5/bulkdata/blog.db" ()
  in
  let pool_config = Caqti_pool_config.create ~max_size:10 () in
  (* Create connection pool with initialization function *)
  let connect_pool ~sw ~stdenv uri =
    Caqti_eio_unix.connect_pool
      ~pool_config
      ~sw
      ~stdenv
      ~post_connect:(fun conn ->
        (* Initialize each connection with SQLite performance pragmas *)
        match Shared.Query.init_connection conn with
        | Ok () -> Ok ()
        | Error err -> Error err)
      uri
  in
  match connect_pool ~sw ~stdenv:(env :> Caqti_eio.stdenv) db_uri with
  (* match Caqti_eio_unix.connect_pool ~sw ~stdenv:(env :> Caqti_eio.stdenv) db_uri with *)
  | Ok pool ->
    let server = Server.create ~config (request_handler ~db_pool:pool) in
    ignore @@ Server.Command.start ~sw env server
  | Error err ->
    Logs.err (fun m -> m "Error connecting to database: %a" Caqti_error.pp err)
;;