Files
integreat/src/clj/auto_ap/db/utils.clj
2018-07-10 20:16:26 -07:00

82 lines
1.9 KiB
Clojure

(ns auto-ap.db.utils
(:require [clojure.string :as str]
[clojure.edn :as edn]
[clojure.java.jdbc :as j]
[config.core :refer [env]]
[honeysql.core :as sql]))
(defn snake->kebab [s]
(str/replace s #"_" "-"))
(defn kebab->snake [s]
(str/replace s #"-" "_"))
(defn db->clj
([x]
(let [kebabed (into {}
(map
(fn [[k v]]
[(keyword (snake->kebab (name k))) v])
x))
merged (if (:data kebabed)
(update kebabed :data edn/read-string)
kebabed)]
merged)))
(defn snake [x]
(into {}
(map
(fn [[k v]]
[(keyword (kebab->snake (name k))) v])
x)))
(defn clj->db [x]
(let [snaked (snake x)
unmerged (if (:data snaked)
(update snaked :data pr-str)
snaked)]
unmerged))
(defn merge-data [{:keys [data] :as x}]
(merge x (edn/read-string data)))
(def ^{:dynamic true} current-conn nil)
(defn get-conn []
(if current-conn
current-conn
(let [db-host (:server (:db env))
db-port 5432
db-name "autoap"]
{:classname "org.postgresql.Driver" ; must be in classpath
#_#_:ssl true
#_#_:sslfactory "org.postgresql.ssl.NonValidatingFactory"
:subprotocol "postgresql"
:subname (str "//" db-host ":" db-port "/" db-name)
:user "ap"
:password "fifteen-invoices-imported!"})))
(defn query [q]
(let [formatted (sql/format q)]
(println "Executing query " q " SQL: " formatted)
(map db->clj (j/query (get-conn) formatted))))
(defn execute! [q]
(let [formatted (sql/format q)]
(println "Executing query " q " SQL: " formatted)
(j/execute! (get-conn) formatted)))
(defn limited-companies [id]
(cond
(= (:role id) "none")
[]
(= (:role id) "admin")
nil
(= (:role id) "user")
(:companies id [])))