diff --git a/Dockerfile b/Dockerfile index 810a6689..d48a107d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,4 +3,5 @@ RUN apk update RUN apk add poppler RUN apk add poppler-utils COPY target/auto-ap.jar /usr/local/ +COPY config /usr/local/config/ CMD java -jar /usr/local/auto-ap.jar diff --git a/config/dev.edn b/config/dev.edn new file mode 100644 index 00000000..bdf06e8e --- /dev/null +++ b/config/dev.edn @@ -0,0 +1 @@ +{:db {:server "localhost"}} diff --git a/config/prod.edn b/config/prod.edn new file mode 100644 index 00000000..b0f33850 --- /dev/null +++ b/config/prod.edn @@ -0,0 +1 @@ +{:db {:server "database"}} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..c8900a9d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +version: '2' +services: + app: + build: . + ports: + - 3000:3000 + depends_on: + - database + environment: + config: /usr/local/config/prod.edn + database: + image: postgres:9-alpine + ports: + - 5432:5432 + volumes: + - ./init-db:/docker-entrypoint-initdb.d/ + environment: + POSTGRES_USER: ap + POSTGRES_PASSWORD: fifteen-invoices-imported! + POSTGRES_DB: autoap + diff --git a/init-db/0001.sql b/init-db/0001.sql new file mode 100644 index 00000000..7d15549d --- /dev/null +++ b/init-db/0001.sql @@ -0,0 +1,4 @@ +CREATE TABLE invoices (id serial primary key, invoice_number varchar(255), date varchar(255), total varchar(255), customer_identifier varchar(255), imported boolean, status varchar(255), vendor varchar(255), potential_duplicate boolean, company varchar(255)); + +CREATE TABLE users (id serial primary key, provider varchar(255), provider_id varchar(255), data text); + diff --git a/init-db/0002.sql b/init-db/0002.sql new file mode 100644 index 00000000..611158c1 --- /dev/null +++ b/init-db/0002.sql @@ -0,0 +1 @@ +insert into users (provider, provider_id, data) values('google', '104596437663417983775', '{:companies ["Brown Chicken Brown Cow" "Campbell Brewing Company"]}'); diff --git a/project.clj b/project.clj index a0bebf96..31945ad8 100644 --- a/project.clj +++ b/project.clj @@ -31,6 +31,7 @@ :clean-targets ^{:protect false} ["resources/public/js/compiled" "target"] :ring {:handler auto-ap.handler/app} :source-paths ["src/clj"] + :resource-paths ["resources"] :figwheel {:css-dirs ["resources/public/css"] :ring-handler auto-ap.handler/app} @@ -49,7 +50,8 @@ [com.cemerick/piggieback "0.2.2"]] :plugins [[lein-figwheel "0.5.13"] - [lein-pdo "0.1.1"]]}} + [lein-pdo "0.1.1"]] + :jvm-opts ["-Dconfig=config/dev.edn"]}} :cljsbuild {:builds diff --git a/src/clj/auto_ap/db/invoices.clj b/src/clj/auto_ap/db/invoices.clj index 276ca963..29134405 100644 --- a/src/clj/auto_ap/db/invoices.clj +++ b/src/clj/auto_ap/db/invoices.clj @@ -1,28 +1,28 @@ (ns auto-ap.db.invoices (:require [clojure.java.jdbc :as j] - [auto-ap.db.utils :refer [clj->db db->clj conn]])) + [auto-ap.db.utils :refer [clj->db db->clj get-conn]])) (defn insert-multi! [rows] - (j/insert-multi! conn + (j/insert-multi! (get-conn) :invoices (map clj->db rows))) (defn get-all [] - (map db->clj (j/query conn "SELECT * FROM invoices"))) + (map db->clj (j/query (get-conn) "SELECT * FROM invoices"))) (defn approve [] - (map db->clj (j/update! conn :invoices {:imported true} [] ))) + (map db->clj (j/update! (get-conn) :invoices {:imported true} [] ))) (defn reject [] - (j/delete! conn :invoices ["imported = false"])) + (j/delete! (get-conn) :invoices ["imported = false"])) (defn get-unpaid [company] (if company - (map db->clj (j/query conn ["SELECT * FROM invoices WHERE imported=true AND company = ?" company])) - (map db->clj (j/query conn "SELECT * FROM invoices WHERE imported=true")))) + (map db->clj (j/query (get-conn) ["SELECT * FROM invoices WHERE imported=true AND company = ?" company])) + (map db->clj (j/query (get-conn) "SELECT * FROM invoices WHERE imported=true")))) (defn get-pending [company] (if company - (map db->clj (j/query conn ["SELECT * FROM invoices WHERE (imported=false or imported is null) AND company = ?" company])) - (map db->clj (j/query conn"SELECT * FROM invoices WHERE imported=false or imported is null")))) + (map db->clj (j/query (get-conn) ["SELECT * FROM invoices WHERE (imported=false or imported is null) AND company = ?" company])) + (map db->clj (j/query (get-conn) "SELECT * FROM invoices WHERE imported=false or imported is null")))) diff --git a/src/clj/auto_ap/db/users.clj b/src/clj/auto_ap/db/users.clj index cba3108a..3a01bacc 100644 --- a/src/clj/auto_ap/db/users.clj +++ b/src/clj/auto_ap/db/users.clj @@ -1,10 +1,10 @@ (ns auto-ap.db.users (:require [clojure.java.jdbc :as j] [clojure.edn :as edn] - [auto-ap.db.utils :refer [clj->db db->clj conn]])) + [auto-ap.db.utils :refer [clj->db db->clj get-conn]])) (defn find-or-insert! [row] - (let [user (first (j/find-by-keys conn + (let [user (first (j/find-by-keys (get-conn) :users {:provider_id (:provider_id row) :provider (:provider row)}))] diff --git a/src/clj/auto_ap/db/utils.clj b/src/clj/auto_ap/db/utils.clj index fa899c3e..b32c79f0 100644 --- a/src/clj/auto_ap/db/utils.clj +++ b/src/clj/auto_ap/db/utils.clj @@ -1,4 +1,5 @@ (ns auto-ap.db.utils + (:require [config.core :refer [env]]) (:require [clojure.string :as str])) (defn snake->kebab [s] @@ -21,19 +22,18 @@ [(keyword (kebab->snake (name k))) v]) x))) -(let [db-host "ec2-54-235-123-153.compute-1.amazonaws.com" - db-port 5432 - db-name "dbfemhppkdksfp"] +(defn get-conn [] + (let [db-host (:server (:db env)) + db-port 5432 + db-name "autoap"] + (println "envt" env) + (println (:db env)) - (def conn {: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) - ; Any additional - ; keys are passed - ; to the driver - ; as driver-specific properties. - :user "tkilrhrhzlumol" - :password "de6117f8551364ac84ed31c1231941f53ab0b5470c9956f478b2025ab5a0fb8b"})) + {: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!"})) diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index a92af5c2..aa87a5ec 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -41,14 +41,14 @@ (defroutes unauthenticated-routes (GET "/" [] (response/resource-response "index.html" {:root "public"})) - (GET "/api/oauth" {{:strs [code]} :query-params} + (GET "/api/oauth" {{:strs [code]} :query-params :keys [scheme] :as r {:strs [host]} :headers} (try (let [auth (-> "https://accounts.google.com/o/oauth2/token" (http/post {:form-params {"client_id" google-client-id "client_secret" google-client-secret "code" code - "redirect_uri" "http://localhost:3449/api/oauth" + "redirect_uri" (str (name scheme) "://" host "/api/oauth") "grant_type" "authorization_code"} :as :json}) :body) diff --git a/src/cljs/auto_ap/core.cljs b/src/cljs/auto_ap/core.cljs index c715ea38..84c649c9 100644 --- a/src/cljs/auto_ap/core.cljs +++ b/src/cljs/auto_ap/core.cljs @@ -6,7 +6,7 @@ [auto-ap.config :as config] [auto-ap.effects :as effects] [pushy.core :as pushy] - [auto-ap.pushy :as p] + [auto-ap.history :as p] [bidi.bidi :as bidi])) (defn dev-setup [] diff --git a/src/cljs/auto_ap/effects.cljs b/src/cljs/auto_ap/effects.cljs index 1d9e7919..46fd8f62 100644 --- a/src/cljs/auto_ap/effects.cljs +++ b/src/cljs/auto_ap/effects.cljs @@ -3,7 +3,7 @@ (:require [re-frame.core :as re-frame] [cljs-http.client :as http] [cljs.core.async :refer [