diff --git a/src/clj/auto_ap/db/utils.clj b/src/clj/auto_ap/db/utils.clj index 8eb5efa2..181449a6 100644 --- a/src/clj/auto_ap/db/utils.clj +++ b/src/clj/auto_ap/db/utils.clj @@ -42,17 +42,21 @@ (defn merge-data [{:keys [data] :as x}] (merge x (edn/read-string data))) +(def ^{:dynamic true} current-conn nil) + (defn get-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!"})) + (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)] diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index 0895ce55..0d5d4d5b 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -7,9 +7,11 @@ [auto-ap.routes.graphql :as graphql] [auto-ap.routes.vendors :as vendors] [auto-ap.routes.checks :as checks] + [auto-ap.db.utils :as u] [buddy.auth.backends.token :refer [jws-backend]] [buddy.auth.middleware :refer [wrap-authentication wrap-authorization]] + [clojure.java.jdbc :as jdbc] [compojure.core :refer :all] [compojure.route :as route] [config.core :refer [env]] @@ -44,8 +46,19 @@ api-routes static-routes)) +(defn wrap-transaction [handler] + (fn [request] + (jdbc/with-db-transaction [t (u/get-conn)] + (binding [u/current-conn t] + (try + (handler (assoc request :db-conn t)) + (catch Exception e + (jdbc/db-set-rollback-only! t) + (throw e))))))) + (def app (-> #'app-routes + (wrap-transaction) (wrap-authorization auth-backend) (wrap-authentication auth-backend) (wrap-reload) diff --git a/src/cljs/auto_ap/views/components/invoice_table.cljs b/src/cljs/auto_ap/views/components/invoice_table.cljs index d5a3dada..66918ebb 100644 --- a/src/cljs/auto_ap/views/components/invoice_table.cljs +++ b/src/cljs/auto_ap/views/components/invoice_table.cljs @@ -10,17 +10,14 @@ [goog.string :as gstring])) ;; TODO show busy -;; TODO only when one company selected ;; TODO partial payments ;; TODO invoice status = paid when complete ;; TODO performance -;; TODO check numbers ;; TODO psql transactions ;; TODO refactor graphql - (defn query [params] {:venia/queries [[:invoice_page (assoc params