From 5e14ecd005d6ebc615a6dfb9b53ebb959eca6e24 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Fri, 13 Apr 2018 20:46:27 -0700 Subject: [PATCH] reminders have been graphqld --- src/clj/auto_ap/db/reminders.clj | 39 ++++++++++++++++- src/clj/auto_ap/graphql.clj | 42 ++++++++++++++++++- src/cljs/auto_ap/events/admin/reminders.cljs | 15 ++++--- .../auto_ap/views/pages/admin/reminders.cljs | 4 +- 4 files changed, 90 insertions(+), 10 deletions(-) diff --git a/src/clj/auto_ap/db/reminders.clj b/src/clj/auto_ap/db/reminders.clj index a3e2f5d5..313b4928 100644 --- a/src/clj/auto_ap/db/reminders.clj +++ b/src/clj/auto_ap/db/reminders.clj @@ -1,17 +1,22 @@ (ns auto-ap.db.reminders - (:require [auto-ap.db.utils :refer [clj->db db->clj get-conn]] + (:require [auto-ap.db.utils :refer [clj->db db->clj get-conn query]] [clj-time.core :as time] [amazonica.aws.simpleemail :as ses] [clojure.java.jdbc :as j] [config.core :refer [env]] [clj-time.jdbc :as jdbc] - [clojure.string :as str])) + [clojure.string :as str] + [honeysql.core :as sql] + [honeysql.helpers :as helpers])) (defn insert [row] (db->clj (first (j/insert! (get-conn) :reminders (clj->db row))))) +(def base-query (sql/build :select :reminders.* + :from :reminders)) + (defn get-all [] (map db->clj (j/query (get-conn) (str @@ -43,6 +48,36 @@ (defn finish [id] (j/update! (get-conn) :reminders {:sent (time/now)} ["id = ?" id] )) +(def all-keys #{:id :vendor-id :email :body :subject :sent :scheduled}) + +(defn add-sort-by [q sort-by asc] + (let [sort-by-key (keyword sort-by)] + (cond (all-keys sort-by-key) + (helpers/merge-order-by q [sort-by-key (when-not asc :desc)]) + + (= :vendor sort-by-key) + (-> q + (helpers/merge-left-join [:vendors :v] [:= :v.id :reminders.vendor-id] ) + (helpers/merge-order-by [:v.name (when-not asc :desc)])) + + :else + q))) + + +(defn base-graphql [{:keys [imported company-id]}] + base-query) + +(defn get-graphql [{:keys [start sort-by asc] :as args}] + (query + (cond-> (base-graphql args) + (not (nil? sort-by) ) (add-sort-by sort-by asc) + true (assoc :limit 20) + start (assoc :offset start)))) + +(defn count-graphql [args] + (:count (first (query + (assoc (base-graphql args) :select [:%count.*]))))) + (defn template [] {:subject "Reminder to send invoices" :body (str "This is a reminder to please reply with a [format of invoice: pdf/excel]" diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 7f90b2b7..18546cf4 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -8,6 +8,7 @@ [auto-ap.db.invoices :as invoices] [auto-ap.db.vendors :as vendors] [auto-ap.db.companies :as companies] + [auto-ap.db.reminders :as reminders] [auto-ap.db.utils :as utils] [clojure.walk :as walk] [clojure.string :as str]) @@ -26,6 +27,16 @@ {:fields {:id {:type 'Int} :name {:type 'String} :invoice_reminder_schedule {:type 'String}}} + :reminder + {:fields {:id {:type 'Int} + :email {:type 'String} + :subject {:type 'String} + :body {:type 'String} + :scheduled {:type 'String} + :sent {:type 'String} + :vendor {:type :vendor + :resolve :get-vendor-for-invoice}} + } :invoice {:fields {:id {:type 'Int} :total {:type 'String} @@ -42,7 +53,13 @@ :count {:type 'Int} :total {:type 'Int} :start {:type 'Int} - :end {:type 'Int}}}} + :end {:type 'Int}}} + + :reminder_page {:fields {:reminders {:type '(list :reminder)} + :count {:type 'Int} + :total {:type 'Int} + :start {:type 'Int} + :end {:type 'Int}}}} :queries {:invoice_page {:type '(list :invoice_page) :args {:imported {:type 'Boolean} @@ -52,6 +69,12 @@ :asc {:type 'Boolean}} :resolve :get-invoice-page} + :reminder_page {:type '(list :reminder_page) + :args {:start {:type 'Int} + :sort_by {:type 'String} + :asc {:type 'Boolean}} + + :resolve :get-reminder-page} :company {:type '(list :company) :resolve :get-company} :vendor {:type '(list :vendor) @@ -117,6 +140,22 @@ :start (:start args 0) :end (+ (:start args 0) (count invoices))}] extra-context))) +(defn get-reminder-page [context args value] + (let [extra-context + (cond-> {} + (executor/selects-field? context :reminder/vendor) (assoc :vendor-cache (by (vendors/get-all) :id ))) + + reminders (map + ->graphql + (reminders/get-graphql (<-graphql args))) + reminder-count (reminders/count-graphql (<-graphql args))] + (resolve/with-context + [{:reminders reminders + :total reminder-count + :count (count reminders) + :start (:start args 0) + :end (+ (:start args 0) (count reminders))}] extra-context))) + (defn get-vendor-for-invoice [context args value] (->graphql (if-let [vendor-cache (:vendor-cache context)] @@ -140,6 +179,7 @@ (def schema (-> integreat-schema (attach-resolvers {:get-invoice-page get-invoice-page + :get-reminder-page get-reminder-page :get-vendor-for-invoice get-vendor-for-invoice :get-company-for-invoice get-company-for-invoice :get-company get-company diff --git a/src/cljs/auto_ap/events/admin/reminders.cljs b/src/cljs/auto_ap/events/admin/reminders.cljs index 097f08de..43931211 100644 --- a/src/cljs/auto_ap/events/admin/reminders.cljs +++ b/src/cljs/auto_ap/events/admin/reminders.cljs @@ -7,14 +7,19 @@ (re-frame/reg-event-fx ::mounted (fn [{:keys [db]} _] - {:http {:method :get - :token (:user db) - :uri "/api/reminders" - :on-success [::received]}})) + {:graphql {:token (:user db) + :query-obj {:venia/queries [[:reminder_page + + [[:reminders [:id :email :sent :scheduled :subject :body [:vendor [:name :id]] ]] + :total + :start + :end]]]} + + :on-success [::received]}})) (re-frame/reg-event-db ::received (fn [db [_ reminders]] - (assoc db :reminders reminders))) + (assoc db :reminders (:reminders (first (:reminder-page reminders)))))) diff --git a/src/cljs/auto_ap/views/pages/admin/reminders.cljs b/src/cljs/auto_ap/views/pages/admin/reminders.cljs index 713c475b..45f3aec0 100644 --- a/src/cljs/auto_ap/views/pages/admin/reminders.cljs +++ b/src/cljs/auto_ap/views/pages/admin/reminders.cljs @@ -20,10 +20,10 @@ [:th "Scheduled Date"] [:th "Status"] [:th "Email"]]] - [:tbody (for [{:keys [id vendor-name scheduled sent email ]} reminders] + [:tbody (for [{:keys [id vendor scheduled sent email ]} reminders] ^{:key id} [:tr - [:td vendor-name] + [:td (:name vendor)] [:td (date->str scheduled)] [:td (when sent [:span [:span.icon [:i.fa.fa-check]] "Sent " (date-time->str sent)]) ]