geocsv-lite/src/geocsv_lite/data.cljs

90 lines
2.9 KiB
Clojure

(ns geocsv-lite.data
(:require-macros [cljs.core.async.macros :refer [go]])
(:require [clojure.browser.dom :as dom]
[clojure.string :as cs]
[cljs-http.client :as http]
[cljs.core.async :refer [<!]]
[geocsv-lite.gis :as gis]
[geocsv-lite.map :refer [get-view]]
))
;; function getQueryVariable(variable)
;; {
;; var query = window.location.search.substring(1);
;; var vars = query.split("&");
;; for (var i=0;i<vars.length;i++) {
;; var pair = vars[i].split("=");
;; if(pair[0] == variable){return pair[1];}
;; }
;; return(false);
;; }
(defn get-query-part-as-map
"Returns the query part of the current document URL as a keyword-string map."
[]
(let [query-nvs (map #(cs/split % "=") (cs/split (subs js/window.location.search 1) "&"))]
(when (every? #(= (count %) 2) query-nvs)
(zipmap (map #(keyword (first %)) query-nvs)(map #(nth % 1) query-nvs)))))
(defn get-csv-url
"`query` is expected a keyword-string map which may have keys:
* `:docid` whose value is a Google Sheets document id;
* `:uri` whose value is the URI of a JSON or CSV file.
If either of these keys is found, returns an appropriate URL, else nil."
[query]
(when (map? query)
(cond
(:docid query) (str
"https://docs.google.com/spreadsheets/d/"
(:docid query)
"/export?format=csv")
(:uri query) (:uri query))))
(defn default-handler
[response k]
(if
(= (:status response) 200)
(let [content (:body response)
data (js->clj (.-data (.parse js/Papa content)))
cols (map
#(let [n (cs/lower-case (cs/replace (cs/trim %) #"[^\w\d]+" "-"))]
(keyword
(if (empty? n)
(gensym)
n)))
(first data))
records (map
(fn [r] (zipmap cols (map str r)))
(rest data))
]
;; (println records)
(gis/refresh-map-pins (get-view k) records))
(println (str "Bad response from server: " (:status response)))))
(defn get-data
[k]
(let
[uri (get-csv-url (get-query-part-as-map))]
(go (let [response (<! (http/get uri {:with-credentials? "false"
:access-control-allow-credentials "true"
:origin js/window.location.hostname}))]
(println (cs/join " " ["tx:" uri "rx:" (:status response)]))
(default-handler response k)))))
(defn get-data-with-uri-and-handler
[uri handler-fn k]
(go (let [response (<! (http/get uri))]
(apply handler-fn (list response k)))))
(go (let [uri "http://localhost:3449/data/data.csv"
response (<! (http/get uri))]
(when (= (:status response) 200)
(default-handler response :map))))