using transactions FTW

This commit is contained in:
Bryce Covert
2018-05-14 10:40:57 -07:00
parent cffff99014
commit 431645ad42
3 changed files with 27 additions and 13 deletions

View File

@@ -42,17 +42,21 @@
(defn merge-data [{:keys [data] :as x}] (defn merge-data [{:keys [data] :as x}]
(merge x (edn/read-string data))) (merge x (edn/read-string data)))
(def ^{:dynamic true} current-conn nil)
(defn get-conn [] (defn get-conn []
(let [db-host (:server (:db env)) (if current-conn
db-port 5432 current-conn
db-name "autoap"] (let [db-host (:server (:db env))
{:classname "org.postgresql.Driver" ; must be in classpath db-port 5432
#_#_:ssl true db-name "autoap"]
#_#_:sslfactory "org.postgresql.ssl.NonValidatingFactory" {:classname "org.postgresql.Driver" ; must be in classpath
:subprotocol "postgresql" #_#_:ssl true
:subname (str "//" db-host ":" db-port "/" db-name) #_#_:sslfactory "org.postgresql.ssl.NonValidatingFactory"
:user "ap" :subprotocol "postgresql"
:password "fifteen-invoices-imported!"})) :subname (str "//" db-host ":" db-port "/" db-name)
:user "ap"
:password "fifteen-invoices-imported!"})))
(defn query [q] (defn query [q]
(let [formatted (sql/format q)] (let [formatted (sql/format q)]

View File

@@ -7,9 +7,11 @@
[auto-ap.routes.graphql :as graphql] [auto-ap.routes.graphql :as graphql]
[auto-ap.routes.vendors :as vendors] [auto-ap.routes.vendors :as vendors]
[auto-ap.routes.checks :as checks] [auto-ap.routes.checks :as checks]
[auto-ap.db.utils :as u]
[buddy.auth.backends.token :refer [jws-backend]] [buddy.auth.backends.token :refer [jws-backend]]
[buddy.auth.middleware :refer [wrap-authentication [buddy.auth.middleware :refer [wrap-authentication
wrap-authorization]] wrap-authorization]]
[clojure.java.jdbc :as jdbc]
[compojure.core :refer :all] [compojure.core :refer :all]
[compojure.route :as route] [compojure.route :as route]
[config.core :refer [env]] [config.core :refer [env]]
@@ -44,8 +46,19 @@
api-routes api-routes
static-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 (def app
(-> #'app-routes (-> #'app-routes
(wrap-transaction)
(wrap-authorization auth-backend) (wrap-authorization auth-backend)
(wrap-authentication auth-backend) (wrap-authentication auth-backend)
(wrap-reload) (wrap-reload)

View File

@@ -10,17 +10,14 @@
[goog.string :as gstring])) [goog.string :as gstring]))
;; TODO show busy ;; TODO show busy
;; TODO only when one company selected
;; TODO partial payments ;; TODO partial payments
;; TODO invoice status = paid when complete ;; TODO invoice status = paid when complete
;; TODO performance ;; TODO performance
;; TODO check numbers
;; TODO psql transactions ;; TODO psql transactions
;; TODO refactor graphql ;; TODO refactor graphql
(defn query [params] (defn query [params]
{:venia/queries [[:invoice_page {:venia/queries [[:invoice_page
(assoc params (assoc params