From ff8c6c9dde3a877b51e2fabafa579e2c05dc856e Mon Sep 17 00:00:00 2001 From: unwox Date: Thu, 17 Oct 2024 10:32:35 +0600 Subject: implement caching --- bin/serve.fnl | 71 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 31 deletions(-) (limited to 'bin/serve.fnl') diff --git a/bin/serve.fnl b/bin/serve.fnl index 62e3962..e574238 100644 --- a/bin/serve.fnl +++ b/bin/serve.fnl @@ -11,6 +11,7 @@ (local str (require :lib.string)) (local texts (require :texts)) (local spellfix (require :spellfix)) +(local cache (require :lib.cache)) (local {: must : measure} (require :lib.utils)) (local ozchai (require :parser.ozchai)) @@ -65,6 +66,12 @@ (tonumber (. query key 1)) nil)) +(fn serialize-query [query] + (local flattened-object + (collect [k v (pairs query)] + (values k (array.join (map (fn [_ vv] (.. k "=" vv)) v) "&")))) + (array.join (array.list flattened-object) "&")) + (fn collect-form [params category] {:query (str.trim (or (get-query-string params "query") "")) :tags (filter #(~= "" $2) (or params.tags [category])) @@ -365,40 +372,42 @@ [:footer {} paginator]]]]]]) (fn root-handler [{: path : query}] - (fn respond [query category] - (let [headers {:content-type "text/html"} - page (or (get-query-number query "page") 1) - form (collect-form query category) - {: results : total} - (if (not (form-empty? form)) - (measure "query products" #(query-products form page)) - {:total 48 :results (measure "random products" #(random-products 48))})] - (values - 200 headers - (.. "\n" - (measure "render" - #(html.render - (base-template form page total results) - true)))))) - - (match (str.split path "/") - ["red-tea"] (respond query "Красный чай") - ["sheng-puer"] (respond query "Шен пуэр") - ["shou-puer"] (respond query "Шу пуэр") - ["oolong"] (respond query "Улун") - ["green-tea"] (respond query "Зеленый чай") - ["white-tea"] (respond query "Белый чай") - ["yellow-tea"] (respond query "Желтый чай") - ["teaware"] (respond query "Посуда") - [] (respond query) - _ (values 404 {} "not found"))) + (local cache-key (.. path "?" (serialize-query query))) + (local cached (cache.get db cache-key)) + (if cached + (values 200 {:content-type "text/html"} cached) + (do + (fn respond [query category] + (let [headers {:content-type "text/html"} + page (or (get-query-number query "page") 1) + form (collect-form query category) + {: results : total} + (if (not (form-empty? form)) + (query-products form page) + {:total 48 :results (random-products 48)})] + (values + 200 headers + (cache.set db cache-key + (.. "\n" + (html.render + (base-template form page total results) + true)))))) + + (match (str.split path "/") + ["red-tea"] (respond query "Красный чай") + ["sheng-puer"] (respond query "Шен пуэр") + ["shou-puer"] (respond query "Шу пуэр") + ["oolong"] (respond query "Улун") + ["green-tea"] (respond query "Зеленый чай") + ["white-tea"] (respond query "Белый чай") + ["yellow-tea"] (respond query "Желтый чай") + ["teaware"] (respond query "Посуда") + [] (respond query) + _ (values 404 {} "not found"))))) (fn robots-handler [] (values 200 {:content-type "text/plain"} "User-agent: *\nAllow: /")) -(must (luna.router.route - "GET /" - (fn [req] - (measure "root handler" #(root-handler req))))) +(must (luna.router.route "GET /" root-handler)) (must (luna.router.route "GET /robots.txt" robots-handler)) (must (luna.router.static "GET /static/" "static/")) -- cgit v1.2.3