11open Core
22open Tyxml
33open Opium.Std
4+ open Lwt.Syntax
45
56(* * A <head> component shared by all pages *)
67let default_head =
@@ -55,22 +56,6 @@ let respond_or_err resp = function
5556 Html.
5657 [ p [ txt (Printf. sprintf " Oh no! Something went wrong: %s" err) ] ]
5758
58- let excerpt_of_form_data data =
59- let find data key =
60- let open Core in
61- (* NOTE Should handle error in case of missing fields *)
62- List.Assoc. find_exn ~equal: String. equal data key |> String. concat
63- in
64- let author = find data " author"
65- and excerpt = find data " excerpt"
66- and source = find data " source"
67- and page =
68- match find data " page" with
69- | "" -> None
70- | p -> Some p
71- in
72- Lwt. return Shared.Excerpt_t. { author; excerpt; source; page }
73-
7459(* * The route handlers for our app *)
7560module Handlers = struct
7661 type request = Request .t
@@ -79,33 +64,33 @@ module Handlers = struct
7964
8065 module Pages = struct
8166 (* * Defines a handler that replies to requests at the root endpoint *)
82- let root _req = respond' @@ basic_page ([ Shared.PageWelcome. make () ])
67+ let root _req = respond' @@ basic_page [ Shared.PageWelcome. make () ]
8368
8469 (* * Defines a handler that takes a path parameter from the route *)
85- let hello lang _req = respond' @@ basic_page ([ Shared.PageHello. make ~lang ])
70+ let hello lang _req = respond' @@ basic_page [ Shared.PageHello. make ~lang ]
8671
8772 (* * Fallback handler in case the endpoint is called without a language parameter *)
8873 let hello_fallback _req =
89- respond' @@ basic_page ([ Shared.PageHelloFallback. make () ])
74+ respond' @@ basic_page [ Shared.PageHelloFallback. make () ]
9075
9176 let excerpts_add _req =
92- respond' @@ basic_page ([ Shared.PageAddExcerpt. make () ])
77+ respond' @@ basic_page [ Shared.PageAddExcerpt. make () ]
9378
9479 let excerpts_by_author name req =
9580 let open Lwt in
9681 Db.Get. excerpts_by_author name req
9782 >> = respond_or_err @@ fun excerpts ->
9883 page_with_payload
9984 (Shared.PageExcerpts_j. string_of_payload excerpts)
100- ([ Shared.PageExcerpts. make ~excerpts ])
85+ [ Shared.PageExcerpts. make ~excerpts ]
10186
10287 let authors_with_excerpts req =
10388 let open Lwt in
10489 Db.Get. authors req
10590 >> = respond_or_err @@ fun authors ->
10691 page_with_payload
10792 (Shared.PageAuthorExcerpts_j. string_of_payload authors)
108- ([ Shared.PageAuthorExcerpts. make ~authors ])
93+ [ Shared.PageAuthorExcerpts. make ~authors ]
10994 end
11095
11196 module Api = struct
@@ -120,18 +105,12 @@ module Handlers = struct
120105 Db.Get. excerpts_by_author name req
121106 >> = respond_or_err (fun excerpts ->
122107 json (Shared.PageExcerpts_j. string_of_payload excerpts))
123- end
124- end
125108
126- (* * The POST route handlers for our app *)
127- module Post = struct
128- let excerpts_add req =
129- let open Lwt in
130- (* NOTE Should handle possible error arising from invalid data *)
131- App. urlencoded_pairs_of_body req >> = excerpt_of_form_data >> = fun excerpt ->
132- Db.Update. add_excerpt excerpt req
133- >> = respond_or_err (fun () ->
134- basic_page ([Shared.PageExcerptAdded. make ~excerpt ]))
109+ let add_excerpt req =
110+ let * str = App. string_of_body_exn req in
111+ let excerpt = Shared.Excerpt_j. t_of_string str in
112+ respond' (json (Shared.Excerpt_j. string_of_t excerpt))
113+ end
135114end
136115
137116module Router = Shared.Router. Make (Handlers )
@@ -149,4 +128,4 @@ let create_middleware ~router =
149128let m = create_middleware ~router: (Shared.Method_routes. one_of Router. routes)
150129
151130let four_o_four =
152- not_found (fun _req -> respond' @@ basic_page ([ Shared.PageNotFound. make () ]) )
131+ not_found (fun _req -> respond' @@ basic_page [ Shared.PageNotFound. make () ] )
0 commit comments