Files
integreat/src/clj/auto_ap/graphql/import_batch.clj

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})))