(ns auto-ap.handler (:require [compojure.core :refer :all] [compojure.route :as route] [clojure.java.io :as io] [clojure.string :as str] [auto-ap.db.invoices :as invoices] [auto-ap.parse :as parse] [ring.middleware.multipart-params :as mp] [ring.util.response :as response] [ring.middleware.defaults :refer [wrap-defaults site-defaults]] [ring.middleware.reload :refer [wrap-reload]] [ring.middleware.json :refer [wrap-json-response]] [ring.middleware.edn :refer [wrap-edn-params]] [clojure.java.jdbc :as j])) (defroutes app-routes (GET "/" [] (response/resource-response "index.html" {:root "public"})) (GET "/api/invoices" [] {:status 200 :body (pr-str (invoices/get-all)) :headers {"Content-Type" "application/edn"}}) (GET "/api/invoices/unpaid" [] {:status 200 :body (pr-str (invoices/get-unpaid)) :headers {"Content-Type" "application/edn"}}) (GET "/api/invoices/pending" [] {:status 200 :body (pr-str (invoices/get-pending)) :headers {"Content-Type" "application/edn"}}) (POST "/api/invoices" {:keys [edn-params]} (invoices/insert-multi! (:rows edn-params)) {:status 200 :body (pr-str (invoices/get-all)) :headers {"Content-Type" "application/edn"}}) (POST "/api/invoices/approve" [] (invoices/approve) (println (invoices/get-pending)) {:status 200 :body (pr-str (invoices/get-pending)) :headers {"Content-Type" "application/edn"}}) (POST "/api/invoices/reject" [] (invoices/reject) (println (invoices/get-pending)) {:status 200 :body (pr-str (invoices/get-pending)) :headers {"Content-Type" "application/edn"}}) (POST "/pdf-upload" {{ files "file"} :params :as params} (let [{:keys [filename tempfile]} files existing-invoices (invoices/get-all)] (println existing-invoices) (invoices/insert-multi! (for [{:keys [total date invoice-number customer-identifier vendor] :as row} (parse/parse-file (.getPath tempfile) filename)] (assoc row :imported false :potential-duplicate (boolean (seq (filter #(and (= vendor (:vendor %)) (= invoice-number (:invoice-number %))) existing-invoices))) ))) {:status 200 :body (pr-str (invoices/get-pending)) :headers {"Content-Type" "application/edn"}})) (route/resources "/") (routes (ANY "*" [] (response/resource-response "index.html" {:root "public"}))) (route/not-found "Not Found")) (def app (wrap-edn-params (mp/wrap-multipart-params (wrap-reload #'app-routes))))