102 lines
4.5 KiB
Clojure
102 lines
4.5 KiB
Clojure
(ns auto-ap.graphql.import-batch
|
|
(:require
|
|
[auto-ap.datomic
|
|
:refer
|
|
[add-sorter-fields apply-pagination apply-sort-3 conn merge-query]]
|
|
[auto-ap.graphql.utils
|
|
:refer
|
|
[<-graphql assert-admin ident->enum-f result->page]]
|
|
[clj-time.coerce :as coerce]
|
|
[com.walmartlabs.lacinia.util :refer [attach-resolvers]]
|
|
[datomic.api :as d]
|
|
[auto-ap.graphql.utils :refer [attach-tracing-resolvers]]))
|
|
|
|
(def default-read '[:db/id
|
|
:import-batch/external-id
|
|
:import-batch/date
|
|
:import-batch/imported
|
|
:import-batch/suppressed
|
|
:import-batch/extant
|
|
:import-batch/user-name
|
|
{:import-batch/source [:db/ident]}
|
|
{:import-batch/status [:db/ident]}])
|
|
|
|
(defn raw-graphql-ids [db args]
|
|
(let [query (cond-> {:query {:find []
|
|
:in ['$]
|
|
:where []}
|
|
:args [db]}
|
|
|
|
(:sort args) (add-sorter-fields {"date" ['[?e :import-batch/date ?sort-date]]}
|
|
args)
|
|
|
|
true
|
|
(merge-query {:query {:find ['?e]
|
|
:where ['[?e :import-batch/date]]}}))]
|
|
|
|
|
|
(cond->> query
|
|
true (d/query)
|
|
true (apply-sort-3 args)
|
|
true (apply-pagination args))))
|
|
|
|
(defn graphql-results [ids db _]
|
|
(let [results (->> (d/pull-many db default-read ids)
|
|
(group-by :db/id))]
|
|
(->> ids
|
|
(map results)
|
|
(map first))))
|
|
|
|
(defn get-graphql [args]
|
|
(let [db (d/db conn)
|
|
{ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)]
|
|
[(graphql-results ids-to-retrieve db args)
|
|
matching-count]))
|
|
|
|
(defn get-import-batch-page [context args _]
|
|
(let [_ (assert-admin (:id context))
|
|
args (assoc (:filters args) :id (:id context))
|
|
[values matching-count] (get-graphql (<-graphql args))]
|
|
(result->page (->> values
|
|
(map (ident->enum-f :import-batch/source))
|
|
(map (ident->enum-f :import-batch/status))
|
|
(map #(update % :import-batch/date coerce/to-date-time)))
|
|
matching-count :data args)))
|
|
|
|
|
|
(defn attach [schema]
|
|
(->
|
|
(merge-with merge schema
|
|
{:objects {:import_batch {:fields {:user_name {:type 'String}
|
|
:id {:type :id}
|
|
:date {:type :iso_date_time}
|
|
:imported {:type 'Int}
|
|
:extant {:type 'Int}
|
|
:suppressed {:type 'Int}
|
|
:status {:type :import_batch_status}
|
|
:source {:type :import_batch_source}}}
|
|
|
|
:import_batch_page {:fields {:data {:type '(list :import_batch)}
|
|
:count {:type 'Int}
|
|
:total {:type 'Int}
|
|
:start {:type 'Int}
|
|
:end {:type 'Int}}}
|
|
|
|
}
|
|
:queries {:import_batch_page {:type :import_batch_page
|
|
:args {:filters {:type :import_batch_filters}}
|
|
|
|
:resolve :get-import-batch-page}}
|
|
:mutations {}
|
|
:input-objects {:import_batch_filters {:fields {:start {:type 'Int}
|
|
:per_page {:type 'Int}
|
|
:sort {:type '(list :sort_item)}}}}
|
|
:enums {:import_batch_status {:values [{:enum-value :started}
|
|
{:enum-value :completed}]}
|
|
:import_batch_source {:values [{:enum-value :intuit}
|
|
{:enum-value :yodlee}
|
|
{:enum-value :yodlee2}
|
|
{:enum-value :plaid}
|
|
{:enum-value :manual}]}}})
|
|
(attach-tracing-resolvers {:get-import-batch-page get-import-batch-page})))
|