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

105 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
pull-many-by-id
query2]]
[auto-ap.graphql.utils
:refer [<-graphql
assert-admin
attach-tracing-resolvers
ident->enum-f
result->page]]
[clj-time.coerce :as coerce]
[datomic.api :as dc]))
(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->> (query2 query)
true (apply-sort-3 args)
true (apply-pagination args))))
(defn graphql-results [ids db _]
(let [results (pull-many-by-id db default-read ids)]
(->> ids
(map results))))
(defn get-graphql [args]
(let [db (dc/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})))