11open Core
22open Tyxml
33open Opium.Std
4+ open Lwt.Syntax
45
56(* * A <head> component shared by all pages *)
67let default_head =
@@ -9,10 +10,15 @@ let default_head =
910 (title (txt " OCaml Webapp Tutorial" ))
1011 [
1112 meta ~a: [ a_charset " UTF-8" ] () ;
13+ meta
14+ ~a:
15+ [ a_name " viewport" ; a_content " width=device-width, initial-scale=1" ]
16+ () ;
1217 link ~rel: [ `Icon ]
1318 ~a: [ a_mime_type " image/x-icon" ]
1419 ~href: " /static/favicon.ico" () ;
15- link ~rel: [ `Stylesheet ] ~href: " /static/style.css" () ;
20+ link ~rel: [ `Stylesheet ]
21+ ~href: " https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" () ;
1622 ]
1723
1824(* * The basic page layout, emitted as an [`Html string] which Opium can use as a
@@ -54,22 +60,6 @@ let respond_or_err resp = function
5460 Html.
5561 [ p [ txt (Printf. sprintf " Oh no! Something went wrong: %s" err) ] ]
5662
57- let excerpt_of_form_data data =
58- let find data key =
59- let open Core in
60- (* NOTE Should handle error in case of missing fields *)
61- List.Assoc. find_exn ~equal: String. equal data key |> String. concat
62- in
63- let author = find data " author"
64- and excerpt = find data " excerpt"
65- and source = find data " source"
66- and page =
67- match find data " page" with
68- | "" -> None
69- | p -> Some p
70- in
71- Lwt. return Shared.Excerpt_t. { author; excerpt; source; page }
72-
7363(* * The route handlers for our app *)
7464module Handlers = struct
7565 type request = Request .t
@@ -78,33 +68,35 @@ module Handlers = struct
7868
7969 module Pages = struct
8070 (* * Defines a handler that replies to requests at the root endpoint *)
81- let root _req = respond' @@ basic_page ( Shared.PageWelcome. make () )
71+ let root _req = respond' @@ basic_page [ Shared.PageWelcome. make () ]
8272
8373 (* * Defines a handler that takes a path parameter from the route *)
84- let hello lang _req = respond' @@ basic_page ( Shared.PageHello. make ~lang )
74+ let hello lang _req = respond' @@ basic_page [ Shared.PageHello. make ~lang ]
8575
8676 (* * Fallback handler in case the endpoint is called without a language parameter *)
8777 let hello_fallback _req =
88- respond' @@ basic_page ( Shared.PageHelloFallback. make () )
78+ respond' @@ basic_page [ Shared.PageHelloFallback. make () ]
8979
9080 let excerpts_add _req =
91- respond' @@ basic_page ( Shared.PageAddExcerpt. make () )
81+ respond' @@ basic_page [ Shared.PageAddExcerpt. make () ]
9282
9383 let excerpts_by_author name req =
9484 let open Lwt in
9585 Db.Get. excerpts_by_author name req
9686 >> = respond_or_err @@ fun excerpts ->
9787 page_with_payload
9888 (Shared.PageExcerpts_j. string_of_payload excerpts)
99- ( Shared.PageExcerpts. make ~excerpts )
89+ [ Shared.PageExcerpts. make ~excerpts ]
10090
10191 let authors_with_excerpts req =
10292 let open Lwt in
10393 Db.Get. authors req
10494 >> = respond_or_err @@ fun authors ->
10595 page_with_payload
10696 (Shared.PageAuthorExcerpts_j. string_of_payload authors)
107- (Shared.PageAuthorExcerpts. make ~authors )
97+ [ Shared.PageAuthorExcerpts. make ~authors ]
98+
99+ let counter _req = respond' @@ basic_page [ Shared.PageCounter. make () ]
108100 end
109101
110102 module Api = struct
@@ -119,18 +111,14 @@ module Handlers = struct
119111 Db.Get. excerpts_by_author name req
120112 >> = respond_or_err (fun excerpts ->
121113 json (Shared.PageExcerpts_j. string_of_payload excerpts))
122- end
123- end
124114
125- (* * The POST route handlers for our app *)
126- module Post = struct
127- let excerpts_add req =
128- let open Lwt in
129- (* NOTE Should handle possible error arising from invalid data *)
130- App. urlencoded_pairs_of_body req >> = excerpt_of_form_data >> = fun excerpt ->
131- Db.Update. add_excerpt excerpt req
132- >> = respond_or_err (fun () ->
133- basic_page (Shared.PageExcerptAdded. make ~excerpt ))
115+ let add_excerpt req =
116+ let open Lwt in
117+ let * str = App. string_of_body_exn req in
118+ let excerpt = Shared.Excerpt_j. t_of_string str in
119+ Db.Update. add_excerpt excerpt req
120+ >> = respond_or_err (fun () -> json (Shared.Excerpt_j. string_of_t excerpt))
121+ end
134122end
135123
136124module Router = Shared.Router. Make (Handlers )
@@ -148,4 +136,4 @@ let create_middleware ~router =
148136let m = create_middleware ~router: (Shared.Method_routes. one_of Router. routes)
149137
150138let four_o_four =
151- not_found (fun _req -> respond' @@ basic_page ( Shared.PageNotFound. make () ) )
139+ not_found (fun _req -> respond' @@ basic_page [ Shared.PageNotFound. make () ] )
0 commit comments