makes cloud search possible.

This commit is contained in:
2023-05-04 17:07:08 -07:00
parent 2bb1da1636
commit b200728c6a
30 changed files with 1308 additions and 451 deletions

View File

@@ -1,5 +1,6 @@
{:db {:server "localhost"} {:db {:server "localhost"}
:scheme "http" :scheme "http"
:solr-uri "http://localhost:8983"
:client-config {:server-type :dev-local :client-config {:server-type :dev-local
:system "dev"} :system "dev"}
:db-name "prod-migration2" :db-name "prod-migration2"

View File

@@ -1,5 +1,6 @@
{:scheme "https" {:scheme "https"
:db-name "prod-mirror2" :db-name "prod-mirror2"
:solr-uri "http://solr-prod-cloud.local:8983"
:datomic-url "datomic:ddb://us-east-1/iol-dev/dev" :datomic-url "datomic:ddb://us-east-1/iol-dev/dev"
:dd-env "prod-cloud" :dd-env "prod-cloud"
:dd-service "integreat-app-cloud" :dd-service "integreat-app-cloud"

View File

@@ -1,5 +1,6 @@
{:db {:server "database"} {:db {:server "database"}
:datomic-url "datomic:ddb://us-east-1/integreat/integreat-prod" :datomic-url "datomic:ddb://us-east-1/integreat/integreat-prod"
:solr-uri "http://solr-prod.local:8983"
:scheme "https" :scheme "https"
:dd-env "prod" :dd-env "prod"
:dd-service "integreat-app" :dd-service "integreat-app"

0
data/etc/nginx/conf.d/default.conf Normal file → Executable file
View File

0
data/etc/nginx/conf.d/nginx.conf Normal file → Executable file
View File

0
data/etc/nginx/vhost.d/default_location Normal file → Executable file
View File

View File

@@ -146,7 +146,7 @@
[com.bhauman/rebel-readline-cljs "0.1.4" :exclusions [org.clojure/clojurescript]] [com.bhauman/rebel-readline-cljs "0.1.4" :exclusions [org.clojure/clojurescript]]
[javax.servlet/servlet-api "2.5"]] [javax.servlet/servlet-api "2.5"]]
:plugins [[lein-pdo "0.1.1"]] :plugins [[lein-pdo "0.1.1"]]
:jvm-opts ["-Dconfig=config/dev.edn" "-Dlogback.configurationFile=logback.xml" "-Xms4G" "-Xmx8G"]} :jvm-opts ["-Dconfig=config/dev.edn" "-Dlogback.configurationFile=logback.xml" "-Xms4G" "-Xmx20G" "-Ddatomic.valcachePath=/mnt/data/datomic-cache" "-Ddatomic.valcacheMaxGb=50"]}
:uberjar :uberjar

View File

@@ -16,6 +16,7 @@
<link rel="stylesheet" href="/css/main.css" /> <link rel="stylesheet" href="/css/main.css" />
<link rel="stylesheet" href="https://unpkg.com/placeholder-loading/dist/css/placeholder-loading.min.css"> <link rel="stylesheet" href="https://unpkg.com/placeholder-loading/dist/css/placeholder-loading.min.css">
<script src="https://unpkg.com/hyperscript.org@0.9.7"></script> <script src="https://unpkg.com/hyperscript.org@0.9.7"></script>
<script src="https://unpkg.com/htmx.org@1.9.0/dist/htmx.js" crossorigin="anonymous"></script>
<script type='text/javascript' src='https://cdn.yodlee.com/fastlink/v4/initialize.js' async></script> <script type='text/javascript' src='https://cdn.yodlee.com/fastlink/v4/initialize.js' async></script>
</head> </head>
<body> <body>

View File

@@ -44,7 +44,8 @@
"http://localhost:8983/solr/gettingstarted/update?commitWithin=60000" "http://localhost:8983/solr/gettingstarted/update?commitWithin=60000"
{:headers {"Content-Type" "application/json"} {:headers {"Content-Type" "application/json"}
:method "POST" :method "POST"
:body (json/write-str batch)})))) :body (json/write-str batch)
}))))
(comment (comment

View File

@@ -39,119 +39,129 @@
([args] (raw-graphql-ids (dc/db conn) args)) ([args] (raw-graphql-ids (dc/db conn) args))
([db args] ([db args]
(let [check-number-like (try (Long/parseLong (:check-number-like args)) (catch Exception _ nil)) (let [check-number-like (try (Long/parseLong (:check-number-like args)) (catch Exception _ nil))
query (cond-> {:query {:find [] query (if (:exact-match-id args)
:in ['$] (cond-> {:query {:find '[?e]
:where []} :in '[$ ?e]
:args [db]} :where '[[?e :payment/client ?c]]}
(:sort args) (add-sorter-fields {"client" ['[?e :payment/client ?c] :args [db
'[?c :client/name ?sort-client]] (:exact-match-id args)]}
"vendor" ['[?e :payment/vendor ?v] (limited-clients (:id args))
'[?v :vendor/name ?sort-vendor]] (merge-query {:query {:in ['[?xx ...]]
"bank-account" ['[?e :payment/bank-account ?ba] :where ['[?e :payment/client ?xx]]}
'[?ba :bank-account/name ?sort-bank-account]] :args [(set (map :db/id (limited-clients (:id args))))]}))
"check-number" ['[(get-else $ ?e :payment/check-number 0) ?sort-check-number]] (cond-> {:query {:find []
"date" ['[?e :payment/date ?sort-date]] :in ['$]
"amount" ['[?e :payment/amount ?sort-amount]] :where []}
"status" ['[?e :payment/status ?sort-status]]} :args [db]}
args) (:sort args) (add-sorter-fields {"client" ['[?e :payment/client ?c]
(:exact-match-id args) '[?c :client/name ?sort-client]]
(merge-query {:query {:in ['?e] "vendor" ['[?e :payment/vendor ?v]
:where []} '[?v :vendor/name ?sort-vendor]]
:args [(:exact-match-id args)]}) "bank-account" ['[?e :payment/bank-account ?ba]
'[?ba :bank-account/name ?sort-bank-account]]
"check-number" ['[(get-else $ ?e :payment/check-number 0) ?sort-check-number]]
"date" ['[?e :payment/date ?sort-date]]
"amount" ['[?e :payment/amount ?sort-amount]]
"status" ['[?e :payment/status ?sort-status]]}
args)
(:exact-match-id args)
(merge-query {:query {:in ['?e]
:where []}
:args [(:exact-match-id args)]})
(limited-clients (:id args)) (limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]] (merge-query {:query {:in ['[?xx ...]]
:where ['[?e :payment/client ?xx]]} :where ['[?e :payment/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}) :args [(set (map :db/id (limited-clients (:id args))))]})
(:client-id args) (:client-id args)
(merge-query {:query {:in ['?client-id] (merge-query {:query {:in ['?client-id]
:where ['[?e :payment/client ?client-id]]} :where ['[?e :payment/client ?client-id]]}
:args [(:client-id args)]}) :args [(:client-id args)]})
(:client-code args) (:client-code args)
(merge-query {:query {:in ['?client-code] (merge-query {:query {:in ['?client-code]
:where ['[?e :payment/client ?client-id] :where ['[?e :payment/client ?client-id]
'[?client-id :client/code ?client-code]]} '[?client-id :client/code ?client-code]]}
:args [(:client-code args)]}) :args [(:client-code args)]})
(:vendor-id args) (:vendor-id args)
(merge-query {:query {:in ['?vendor-id] (merge-query {:query {:in ['?vendor-id]
:where ['[?e :payment/vendor ?vendor-id]]} :where ['[?e :payment/vendor ?vendor-id]]}
:args [(:vendor-id args)]}) :args [(:vendor-id args)]})
(:original-id args) (:original-id args)
(merge-query {:query {:in ['?original-id] (merge-query {:query {:in ['?original-id]
:where ['[?e :payment/client ?c] :where ['[?e :payment/client ?c]
'[?c :client/original-id ?original-id]]} '[?c :client/original-id ?original-id]]}
:args [(:original-id args)]}) :args [(:original-id args)]})
(:check-number args) (:check-number args)
(merge-query {:query {:in ['?check-number] (merge-query {:query {:in ['?check-number]
:where ['[?e :payment/check-number ?check-number]]} :where ['[?e :payment/check-number ?check-number]]}
:args [(:check-number args)]}) :args [(:check-number args)]})
(not-empty (:invoice-number args)) (not-empty (:invoice-number args))
(merge-query {:query {:in ['?invoice-number] (merge-query {:query {:in ['?invoice-number]
:where ['[?e :payment/invoices ?i] :where ['[?e :payment/invoices ?i]
'[?i :invoice/invoice-number ?invoice-number]]} '[?i :invoice/invoice-number ?invoice-number]]}
:args [(:invoice-number args)]}) :args [(:invoice-number args)]})
(:bank-account-id args) (:bank-account-id args)
(merge-query {:query {:in ['?bank-account-id] (merge-query {:query {:in ['?bank-account-id]
:where ['[?e :payment/bank-account ?bank-account-id]]} :where ['[?e :payment/bank-account ?bank-account-id]]}
:args [(:bank-account-id args)]}) :args [(:bank-account-id args)]})
(:amount-gte args) (:amount-gte args)
(merge-query {:query {:in ['?amount-gte] (merge-query {:query {:in ['?amount-gte]
:where ['[?e :payment/amount ?a] :where ['[?e :payment/amount ?a]
'[(>= ?a ?amount-gte)]]} '[(>= ?a ?amount-gte)]]}
:args [(:amount-gte args)]}) :args [(:amount-gte args)]})
(:amount-lte args) (:amount-lte args)
(merge-query {:query {:in ['?amount-lte] (merge-query {:query {:in ['?amount-lte]
:where ['[?e :payment/amount ?a] :where ['[?e :payment/amount ?a]
'[(<= ?a ?amount-lte)]]} '[(<= ?a ?amount-lte)]]}
:args [(:amount-lte args)]}) :args [(:amount-lte args)]})
(:amount args) (:amount args)
(merge-query {:query {:in ['?amount] (merge-query {:query {:in ['?amount]
:where ['[?e :payment/amount ?transaction-amount] :where ['[?e :payment/amount ?transaction-amount]
'[(iol-ion.query/dollars= ?transaction-amount ?amount)]]} '[(iol-ion.query/dollars= ?transaction-amount ?amount)]]}
:args [(:amount args)]}) :args [(:amount args)]})
(:status args) (:status args)
(merge-query {:query {:in ['?status] (merge-query {:query {:in ['?status]
:where ['[?e :payment/status ?status]]} :where ['[?e :payment/status ?status]]}
:args [(:status args)]}) :args [(:status args)]})
(:start (:date-range args)) (:start (:date-range args))
(merge-query {:query {:in '[?start-date] (merge-query {:query {:in '[?start-date]
:where ['[?e :payment/date ?date] :where ['[?e :payment/date ?date]
'[(>= ?date ?start-date)]]} '[(>= ?date ?start-date)]]}
:args [(c/to-date (:start (:date-range args)))]}) :args [(c/to-date (:start (:date-range args)))]})
(:end (:date-range args)) (:end (:date-range args))
(merge-query {:query {:in '[?end-date] (merge-query {:query {:in '[?end-date]
:where ['[?e :payment/date ?date] :where ['[?e :payment/date ?date]
'[(<= ?date ?end-date)]]} '[(<= ?date ?end-date)]]}
:args [(c/to-date (:end (:date-range args)))]}) :args [(c/to-date (:end (:date-range args)))]})
(:payment-type args) (:payment-type args)
(merge-query {:query {:in '[?payment-type] (merge-query {:query {:in '[?payment-type]
:where ['[?e :payment/type ?payment-type]]} :where ['[?e :payment/type ?payment-type]]}
:args [(:payment-type args)]}) :args [(:payment-type args)]})
check-number-like check-number-like
(merge-query {:query {:in '[?check-number-like] (merge-query {:query {:in '[?check-number-like]
:where ['[?e :payment/check-number ?check-number-like]]} :where ['[?e :payment/check-number ?check-number-like]]}
:args [check-number-like]}) :args [check-number-like]})
true true
(merge-query {:query {:find ['?sort-default '?e] (merge-query {:query {:find ['?sort-default '?e]
:where ['[?e :payment/date ?sort-default]]}}))] :where ['[?e :payment/date ?sort-default]]}})))]
(log/info query) (log/info query)

View File

@@ -46,131 +46,138 @@
([args] ([args]
(raw-graphql-ids (dc/db conn) args)) (raw-graphql-ids (dc/db conn) args))
([db args] ([db args]
(let [query (cond-> {:query {:find [] (let [query
:in ['$] (if (:exact-match-id args)
:where ['[?e :invoice/client]]} (cond-> {:query {:find '[?e]
:args [db]} :in '[$ ?e]
:where '[[?e :invoice/client ?c]]}
:args [db
(:exact-match-id args)]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :invoice/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}))
(cond-> {:query {:find []
:in ['$]
:where ['[?e :invoice/client]]}
:args [db]}
(:exact-match-id args) (limited-clients (:id args))
(merge-query {:query {:in ['?e] (merge-query {:query {:in ['[?xx ...]]
:where []} :where ['[?e :invoice/client ?xx]]}
:args [(:exact-match-id args)]}) :args [ (set (map :db/id (limited-clients (:id args))))]})
(limited-clients (:id args)) (:client-id args)
(merge-query {:query {:in ['[?xx ...]] (merge-query {:query {:in ['?client-id]
:where ['[?e :invoice/client ?xx]]} :where ['[?e :invoice/client ?client-id]]}
:args [ (set (map :db/id (limited-clients (:id args))))]}) :args [ (:client-id args)]})
(:client-id args)
(merge-query {:query {:in ['?client-id]
:where ['[?e :invoice/client ?client-id]]}
:args [ (:client-id args)]})
(:client-code args) (:client-code args)
(merge-query {:query {:in ['?client-code] (merge-query {:query {:in ['?client-code]
:where ['[?e :invoice/client ?client-id] :where ['[?e :invoice/client ?client-id]
'[?client-id :client/code ?client-code]]} '[?client-id :client/code ?client-code]]}
:args [ (:client-code args)]}) :args [ (:client-code args)]})
(:original-id args) (:original-id args)
(merge-query {:query {:in ['?original-id] (merge-query {:query {:in ['?original-id]
:where [ :where [
'[?e :invoice/client ?c] '[?e :invoice/client ?c]
'[?c :client/original-id ?original-id]]} '[?c :client/original-id ?original-id]]}
:args [ (cond-> (:original-id args) :args [ (cond-> (:original-id args)
(string? (:original-id args)) Long/parseLong )]}) (string? (:original-id args)) Long/parseLong )]})
(:start (:date-range args)) (merge-query {:query {:in '[?start-date] (:start (:date-range args)) (merge-query {:query {:in '[?start-date]
:where ['[?e :invoice/date ?date]
'[(>= ?date ?start-date)]]}
:args [(coerce/to-date (:start (:date-range args)))]})
(:end (:date-range args)) (merge-query {:query {:in '[?end-date]
:where ['[?e :invoice/date ?date] :where ['[?e :invoice/date ?date]
'[(>= ?date ?start-date)]]} '[(<= ?date ?end-date)]]}
:args [(coerce/to-date (:start (:date-range args)))]}) :args [(coerce/to-date (:end (:date-range args)))]})
(:end (:date-range args)) (merge-query {:query {:in '[?end-date] (:start (:due-range args)) (merge-query {:query {:in '[?start-due]
:where ['[?e :invoice/date ?date] :where ['[?e :invoice/due ?due]
'[(<= ?date ?end-date)]]} '[(>= ?due ?start-due)]]}
:args [(coerce/to-date (:end (:date-range args)))]}) :args [(coerce/to-date (:start (:due-range args)))]})
(:start (:due-range args)) (merge-query {:query {:in '[?start-due] (:end (:due-range args)) (merge-query {:query {:in '[?end-due]
:where ['[?e :invoice/due ?due] :where ['[?e :invoice/due ?due]
'[(>= ?due ?start-due)]]} '[(<= ?due ?end-due)]]}
:args [(coerce/to-date (:start (:due-range args)))]}) :args [(coerce/to-date (:end (:due-range args)))]})
(:end (:due-range args)) (merge-query {:query {:in '[?end-due] (:import-status args)
:where ['[?e :invoice/due ?due] (merge-query {:query {:in ['?import-status]
'[(<= ?due ?end-due)]]} :where ['[?e :invoice/import-status ?import-status]]}
:args [(coerce/to-date (:end (:due-range args)))]}) :args [ (keyword "import-status" (:import-status args))]})
(:status args)
(merge-query {:query {:in ['?status]
:where ['[?e :invoice/status ?status]]}
:args [ (:status args)]})
(:vendor-id args)
(merge-query {:query {:in ['?vendor-id]
:where ['[?e :invoice/vendor ?vendor-id]]}
:args [ (:vendor-id args)]})
(:import-status args) (:account-id args)
(merge-query {:query {:in ['?import-status] (merge-query {:query {:in ['?account-id]
:where ['[?e :invoice/import-status ?import-status]]} :where ['[?e :invoice/expense-accounts ?iea ?]
:args [ (keyword "import-status" (:import-status args))]}) '[?iea :invoice-expense-account/account ?account-id]]}
(:status args) :args [ (:account-id args)]})
(merge-query {:query {:in ['?status]
:where ['[?e :invoice/status ?status]]}
:args [ (:status args)]})
(:vendor-id args)
(merge-query {:query {:in ['?vendor-id]
:where ['[?e :invoice/vendor ?vendor-id]]}
:args [ (:vendor-id args)]})
(:account-id args) (:amount-gte args)
(merge-query {:query {:in ['?account-id] (merge-query {:query {:in ['?amount-gte]
:where ['[?e :invoice/expense-accounts ?iea ?] :where ['[?e :invoice/total ?total-filter]
'[?iea :invoice-expense-account/account ?account-id]]} '[(>= ?total-filter ?amount-gte)]]}
:args [ (:account-id args)]}) :args [(:amount-gte args)]})
(:amount-gte args) (:amount-lte args)
(merge-query {:query {:in ['?amount-gte] (merge-query {:query {:in ['?amount-lte]
:where ['[?e :invoice/total ?total-filter] :where ['[?e :invoice/total ?total-filter]
'[(>= ?total-filter ?amount-gte)]]} '[(<= ?total-filter ?amount-lte)]]}
:args [(:amount-gte args)]}) :args [(:amount-lte args)]})
(:amount-lte args) (seq (:invoice-number-like args))
(merge-query {:query {:in ['?amount-lte] (merge-query {:query {:in ['?invoice-number-like]
:where ['[?e :invoice/total ?total-filter] :where ['[?e :invoice/invoice-number ?invoice-number]
'[(<= ?total-filter ?amount-lte)]]} '[(.contains ^String ?invoice-number ?invoice-number-like)]]}
:args [(:amount-lte args)]}) :args [(:invoice-number-like args)]})
(seq (:invoice-number-like args)) (:scheduled-payments args)
(merge-query {:query {:in ['?invoice-number-like] (merge-query {:query {:in []
:where ['[?e :invoice/invoice-number ?invoice-number] :where ['[?e :invoice/scheduled-payment]]}
'[(.contains ^String ?invoice-number ?invoice-number-like)]]} :args []})
:args [(:invoice-number-like args)]})
(:scheduled-payments args) (:unresolved args)
(merge-query {:query {:in [] (merge-query {:query {:in []
:where ['[?e :invoice/scheduled-payment]]} :where ['(or-join [?e]
:args []}) (not [?e :invoice/expense-accounts ])
(and [?e :invoice/expense-accounts ?ea]
(not [?ea :invoice-expense-account/account])))]}
:args []})
(:unresolved args) (seq (:location args))
(merge-query {:query {:in [] (merge-query {:query {:in ['?location]
:where ['(or-join [?e] :where ['[?e :invoice/expense-accounts ?eas]
(not [?e :invoice/expense-accounts ]) '[?eas :invoice-expense-account/location ?location]]}
(and [?e :invoice/expense-accounts ?ea] :args [(:location args)]})
(not [?ea :invoice-expense-account/account])))]}
:args []})
(seq (:location args)) (:sort args) (add-sorter-fields {"client" ['[?e :invoice/client ?c]
(merge-query {:query {:in ['?location] '[?c :client/name ?sort-client]]
:where ['[?e :invoice/expense-accounts ?eas] "vendor" ['[?e :invoice/vendor ?v]
'[?eas :invoice-expense-account/location ?location]]} '[?v :vendor/name ?sort-vendor]]
:args [(:location args)]}) "description-original" ['[?e :transaction/description-original ?sort-description-original]]
"location" ['[?e :invoice/expense-accounts ?iea]
(:sort args) (add-sorter-fields {"client" ['[?e :invoice/client ?c] '[?iea :invoice-expense-account/location ?sort-location]]
'[?c :client/name ?sort-client]] "date" ['[?e :invoice/date ?sort-date]]
"vendor" ['[?e :invoice/vendor ?v] "due" ['[(get-else $ ?e :invoice/due #inst "2050-01-01") ?sort-due]]
'[?v :vendor/name ?sort-vendor]] "invoice-number" ['[?e :invoice/invoice-number ?sort-invoice-number]]
"description-original" ['[?e :transaction/description-original ?sort-description-original]] "total" ['[?e :invoice/total ?sort-total]]
"location" ['[?e :invoice/expense-accounts ?iea] "outstanding-balance" ['[?e :invoice/outstanding-balance ?sort-outstanding-balance]]}
'[?iea :invoice-expense-account/location ?sort-location]] args)
"date" ['[?e :invoice/date ?sort-date]] true
"due" ['[(get-else $ ?e :invoice/due #inst "2050-01-01") ?sort-due]] (merge-query {:query {:find ['?sort-default '?e ]
"invoice-number" ['[?e :invoice/invoice-number ?sort-invoice-number]] :where ['[?e :invoice/client]
"total" ['[?e :invoice/total ?sort-total]] '[?e :invoice/date ?sort-default]]}}) ))]
"outstanding-balance" ['[?e :invoice/outstanding-balance ?sort-outstanding-balance]]}
args)
true
(merge-query {:query {:find ['?sort-default '?e ]
:where ['[?e :invoice/client]
'[?e :invoice/date ?sort-default]]}}) )]
(->> (query2 query) (->> (query2 query)
(apply-sort-3 args) (apply-sort-3 args)
(apply-pagination args))))) (apply-pagination args)))))

View File

@@ -28,9 +28,33 @@
(update :expected-deposit first))) (update :expected-deposit first)))
cs))))) cs)))))
(def default-read '[* (def default-read '[:db/id
:sales-order/external-id,
:sales-order/location,
:sales-order/date,
:sales-order/total,
:sales-order/tax,
:sales-order/tip,
:sales-order/line-items,
:sales-order/discount,
:sales-order/returns,
:sales-order/service-charge,
:sales-order/vendor,
:sales-order/source,
:sales-order/reference-link,
{:sales-order/client [:client/name :db/id :client/code] {:sales-order/client [:client/name :db/id :client/code]
:sales-order/charges [* {:charge/processor [:db/ident]} {:expected-deposit/_charges [:db/id]}]}]) :sales-order/charges [
:charge/type-name,
:charge/total,
:charge/tax,
:charge/tip,
:charge/external-id,
:charge/note,
:charge/date,
:charge/client,
:charge/location,
:charge/reference-link,
{:charge/processor [:db/ident]} {:expected-deposit/_charges [:db/id]}]}])
(defn raw-graphql-ids [db args] (defn raw-graphql-ids [db args]
(let [visible-clients (visible-clients (:id args)) (let [visible-clients (visible-clients (:id args))
@@ -140,8 +164,8 @@
(defn get-graphql [args] (defn get-graphql [args]
(let [db (dc/db conn) (let [db (dc/db conn)
{ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)] {ids-to-retrieve :ids matching-count :count} (mu/trace ::get-sales-order-ids [] (raw-graphql-ids db args))]
[(->> (graphql-results ids-to-retrieve db args)) [(->> (mu/trace ::get-results [] (graphql-results ids-to-retrieve db args)))
matching-count matching-count
(summarize-orders ids-to-retrieve)])) (summarize-orders ids-to-retrieve)]))

View File

@@ -42,137 +42,143 @@
([args] (raw-graphql-ids (dc/db conn) args)) ([args] (raw-graphql-ids (dc/db conn) args))
([db args] ([db args]
(let [potential-duplicates (potential-duplicate-ids db args) (let [potential-duplicates (potential-duplicate-ids db args)
query (cond-> {:query {:find [] query
:in ['$ ] (if (:exact-match-id args)
:where []} (cond-> {:query {:find '[?e]
:args [db]} :in '[$ ?e]
:where '[[?e :transaction/client ?c]]}
:args [db
(:exact-match-id args)]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :transaction/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}))
(cond-> {:query {:find []
:in ['$ ]
:where []}
:args [db]}
(:potential-duplicates args) (:potential-duplicates args)
(merge-query {:query {:in '[[?e ...]]} (merge-query {:query {:in '[[?e ...]]}
:args [potential-duplicates]}) :args [potential-duplicates]})
(:exact-match-id args) (limited-clients (:id args))
(merge-query {:query {:in ['?e] (merge-query {:query {:in ['[?xx ...]]
:where []} :where ['[?e :transaction/client ?xx]]}
:args [(:exact-match-id args)]}) :args [(set (map :db/id (limited-clients (:id args))))]})
(limited-clients (:id args)) (:bank-account-id args)
(merge-query {:query {:in ['[?xx ...]] (merge-query {:query {:in ['?bank-account-id]
:where ['[?e :transaction/client ?xx]]} :where ['[?e :transaction/bank-account ?bank-account-id]]}
:args [(set (map :db/id (limited-clients (:id args))))]}) :args [(:bank-account-id args)]})
(:bank-account-id args) (:import-batch-id args)
(merge-query {:query {:in ['?bank-account-id] (merge-query {:query {:in ['?import-batch-id]
:where ['[?e :transaction/bank-account ?bank-account-id]]} :where ['[?import-batch-id :import-batch/entry ?e]]}
:args [(:bank-account-id args)]}) :args [(:import-batch-id args)]})
(:import-batch-id args) (:account-id args)
(merge-query {:query {:in ['?import-batch-id] (merge-query {:query {:in ['?account-id]
:where ['[?import-batch-id :import-batch/entry ?e]]} :where ['[?e :transaction/accounts ?accounts]
:args [(:import-batch-id args)]}) '[?accounts :transaction-account/account ?account-id]]}
:args [(:account-id args)]})
(:account-id args) (:client-id args)
(merge-query {:query {:in ['?account-id] (merge-query {:query {:in ['?client-id]
:where ['[?e :transaction/accounts ?accounts] :where ['[?e :transaction/client ?client-id]]}
'[?accounts :transaction-account/account ?account-id]]} :args [(:client-id args)]})
:args [(:account-id args)]})
(:client-id args) (:vendor-id args)
(merge-query {:query {:in ['?client-id] (merge-query {:query {:in ['?vendor-id]
:where ['[?e :transaction/client ?client-id]]} :where ['[?e :transaction/vendor ?vendor-id]]}
:args [(:client-id args)]}) :args [(:vendor-id args)]})
(:vendor-id args)
(merge-query {:query {:in ['?vendor-id]
:where ['[?e :transaction/vendor ?vendor-id]]}
:args [(:vendor-id args)]})
(:amount-gte args) (:amount-gte args)
(merge-query {:query {:in ['?amount-gte] (merge-query {:query {:in ['?amount-gte]
:where ['[?e :transaction/amount ?a] :where ['[?e :transaction/amount ?a]
'[(>= ?a ?amount-gte)]]} '[(>= ?a ?amount-gte)]]}
:args [(:amount-gte args)]}) :args [(:amount-gte args)]})
(:amount-lte args) (:amount-lte args)
(merge-query {:query {:in ['?amount-lte] (merge-query {:query {:in ['?amount-lte]
:where ['[?e :transaction/amount ?a] :where ['[?e :transaction/amount ?a]
'[(<= ?a ?amount-lte)]]} '[(<= ?a ?amount-lte)]]}
:args [(:amount-lte args)]}) :args [(:amount-lte args)]})
(:start (:date-range args)) (:start (:date-range args))
(merge-query {:query {:in ['?start-date] (merge-query {:query {:in ['?start-date]
:where ['[?e :transaction/date ?date] :where ['[?e :transaction/date ?date]
'[(>= ?date ?start-date)]]} '[(>= ?date ?start-date)]]}
:args [(coerce/to-date (:start (:date-range args)))]}) :args [(coerce/to-date (:start (:date-range args)))]})
(:end (:date-range args)) (:end (:date-range args))
(merge-query {:query {:in ['?end-date] (merge-query {:query {:in ['?end-date]
:where ['[?e :transaction/date ?date] :where ['[?e :transaction/date ?date]
'[(<= ?date ?end-date)]]} '[(<= ?date ?end-date)]]}
:args [(coerce/to-date (:end (:date-range args)))]}) :args [(coerce/to-date (:end (:date-range args)))]})
(:approval-status args) (:approval-status args)
(merge-query {:query {:in ['?approval-status] (merge-query {:query {:in ['?approval-status]
:where ['[?e :transaction/approval-status ?approval-status]]} :where ['[?e :transaction/approval-status ?approval-status]]}
:args [(:approval-status args)]}) :args [(:approval-status args)]})
(:client-code args) (:client-code args)
(merge-query {:query {:in ['?client-code] (merge-query {:query {:in ['?client-code]
:where ['[?e :transaction/client ?client-id] :where ['[?e :transaction/client ?client-id]
'[?client-id :client/code ?client-code]]} '[?client-id :client/code ?client-code]]}
:args [(:client-code args)]}) :args [(:client-code args)]})
(:original-id args) (:original-id args)
(merge-query {:query {:in ['?original-id] (merge-query {:query {:in ['?original-id]
:where ['[?e :transaction/client ?c] :where ['[?e :transaction/client ?c]
'[?c :client/original-id ?original-id]]} '[?c :client/original-id ?original-id]]}
:args [(:original-id args)]}) :args [(:original-id args)]})
(seq (:location args)) (seq (:location args))
(merge-query {:query {:in ['?location] (merge-query {:query {:in ['?location]
:where ['[?e :transaction/accounts ?tas] :where ['[?e :transaction/accounts ?tas]
'[?tas :transaction-account/location ?location]]} '[?tas :transaction-account/location ?location]]}
:args [(:location args)]}) :args [(:location args)]})
(:unresolved args) (:unresolved args)
(merge-query {:query {:where ['[?e :transaction/date] (merge-query {:query {:where ['[?e :transaction/date]
'(or-join [?e] '(or-join [?e]
(not [?e :transaction/accounts]) (not [?e :transaction/accounts])
(and [?e :transaction/accounts ?tas] (and [?e :transaction/accounts ?tas]
(not [?tas :transaction-account/account])))]}}) (not [?tas :transaction-account/account])))]}})
(:description args) (:description args)
(merge-query {:query {:in ['?description] (merge-query {:query {:in ['?description]
:where ['[?e :transaction/description-original ?do] :where ['[?e :transaction/description-original ?do]
'[(clojure.string/lower-case ?do) ?do2] '[(clojure.string/lower-case ?do) ?do2]
'[(.contains ?do2 ?description)]]} '[(.contains ?do2 ?description)]]}
:args [(clojure.string/lower-case (:description args))]}) :args [(clojure.string/lower-case (:description args))]})
(:sort args) (add-sorter-fields {"client" ['[?e :transaction/client ?c] (:sort args) (add-sorter-fields {"client" ['[?e :transaction/client ?c]
'[?c :client/name ?sort-client]] '[?c :client/name ?sort-client]]
"account" ['[?e :transaction/date] "account" ['[?e :transaction/date]
'(or-join [?e ?sort-account] '(or-join [?e ?sort-account]
(and [?e :transaction/bank-account ?c] (and [?e :transaction/bank-account ?c]
[?c :bank-account/name ?sort-account]) [?c :bank-account/name ?sort-account])
(and (and
(not [?e :transaction/bank-account]) (not [?e :transaction/bank-account])
[(ground "") ?sort-account]))] [(ground "") ?sort-account]))]
"description-original" ['[?e :transaction/description-original ?sort-description-original]] "description-original" ['[?e :transaction/description-original ?sort-description-original]]
"date" ['[?e :transaction/date ?sort-date]] "date" ['[?e :transaction/date ?sort-date]]
"vendor" ['(or-join [?e ?sort-vendor] "vendor" ['(or-join [?e ?sort-vendor]
(and [(missing? $ ?e :transaction/vendor)] (and [(missing? $ ?e :transaction/vendor)]
[?e :transaction/description-original ?sort-vendor]) [?e :transaction/description-original ?sort-vendor])
(and [?e :transaction/vendor ?v] (and [?e :transaction/vendor ?v]
[?v :vendor/name ?sort-vendor]))] [?v :vendor/name ?sort-vendor]))]
"amount" ['[?e :transaction/amount ?sort-amount]] "amount" ['[?e :transaction/amount ?sort-amount]]
"status" ['[?e :transaction/status ?sort-status]]} "status" ['[?e :transaction/status ?sort-status]]}
args) args)
true true
(merge-query {:query {:find ['?sort-default '?e] (merge-query {:query {:find ['?sort-default '?e]
:where ['[?e :transaction/id] :where ['[?e :transaction/id]
'[?e :transaction/date ?sort-default] '[?e :transaction/date ?sort-default]
'(not [?e :transaction/approval-status :transaction-approval-status/suppressed])]}}))] '(not [?e :transaction/approval-status :transaction-approval-status/suppressed])]}})))]
(log/info "query is" query) (log/info "query is" query)
(cond->> (query2 query) (cond->> (query2 query)
true (apply-sort-3 (assoc args :default-asc? false)) true (apply-sort-3 (assoc args :default-asc? false))

32
src/clj/auto_ap/solr.clj Normal file
View File

@@ -0,0 +1,32 @@
(ns auto-ap.solr
(:require [clojure.data.json :as json]
[clj-http.client :as client]
[config.core :refer [env]]))
(def solr-uri (:solr-uri env))
(defn index-documents [xs]
(client/post
(str solr-uri "/solr/invoices/update?commitWithin=15000")
{:headers {"Content-Type" "application/json"}
:method "POST"
:body (json/write-str xs)}))
(defn query [q]
(-> (client/post (str solr-uri "/solr/invoices/query")
{:body (json/write-str {"query" q
"fields" "id, date, amount, type, description, number, client_code, client_id, vendor_name"})
:headers {"Content-Type" "application/json"}
:as :json}
)
:body
:response
:docs))
(defn solr-delete []
(client/post
(str solr-uri "/solr/invoices/update?commitWithin=1000")
{:headers {"Content-Type" "application/json"}
:method "POST"
:body (json/write-str {"delete" {"query" "*:*"}})})
)

View File

@@ -6,6 +6,7 @@
[auto-ap.ssr.auth :as auth] [auto-ap.ssr.auth :as auth]
[auto-ap.ssr.transaction.insights :as insights] [auto-ap.ssr.transaction.insights :as insights]
[auto-ap.ssr.company.company-1099 :as company-1099] [auto-ap.ssr.company.company-1099 :as company-1099]
[auto-ap.ssr.search :as search]
[auto-ap.ssr.company-dropdown :as company-dropdown])) [auto-ap.ssr.company-dropdown :as company-dropdown]))
;; from auto-ap.ssr-routes, because they're shared ;; from auto-ap.ssr-routes, because they're shared
@@ -25,5 +26,6 @@
:transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-secure insights/insight-table)) :transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-secure insights/insight-table))
:transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-secure insights/transaction-rows)) :transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-secure insights/transaction-rows))
:transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-secure insights/approve)) :transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-secure insights/approve))
:transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-secure insights/explain))}) :transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-secure insights/explain))
:search (wrap-client-redirect-unauthenticated (wrap-secure search/dialog-contents))})

View File

@@ -0,0 +1,125 @@
(ns auto-ap.ssr.search
(:require
[auto-ap.graphql.utils :refer [can-see-client?]]
[auto-ap.ssr.utils :refer [html-response]]
[auto-ap.time :as atime]
[clj-http.client :as client]
[clojure.data.json :as json]
[clojure.string :as str]
[auto-ap.solr :as solr]))
(defn try-cleanse-date [d]
(try
(or
(some-> (atime/parse-utc d atime/normal-date) (atime/unparse atime/solr-date))
(some-> (atime/parse-utc d atime/iso-date) (atime/unparse atime/solr-date))
d)
(catch Exception _
d)))
(defn try-parse-number [n]
(if (re-find #"^[\-]?\d+\.\d+$" n )
(str (with-precision 2
(some-> n
(Double/parseDouble)
bigdec
(.setScale 2 java.math.RoundingMode/HALF_UP)
(double))))
n))
(defn q->solr-q [q]
(let [matches (re-seq #"(?:\".*?\"|\S)+" q)]
(str/join " AND "
(->> matches
(map (fn [m]
(cond (= "payment" m)
"type:payment"
(= "invoice" m)
"type:invoice"
(= "transaction" m)
"type:transaction"
:else
(str "_text_:\"" (try-parse-number (try-cleanse-date m)) ""\"))))))))
(defn search-results [q id]
(into []
(filter (fn [d]
(can-see-client? id (first (:client_id d)))))
(solr/query (q->solr-q q))))
(defn search-results* [q id]
(let [results (search-results q id)]
[:div
(if (seq results)
(for [doc results]
[:div.block
[:div.card
[:div.card-header.has-background-info-light
(cond (= "transaction" (:type doc))
[:div.card-header-icon.icon-task-list-text-1]
(= "invoice" (:type doc))
[:div.card-header-icon.icon-accounting-invoice-mail]
(= "payment" (:type doc))
[:div.card-header-icon.icon-check-payment-sign])
[:div.card-header-title (clojure.string/capitalize (:type doc))
" "
" "
[:span.tags.ml-3
[:span.tag.is-warning "client: " (:client_code doc)]
[:span.tag.is-info "amount: $" (first (:amount doc))]
(when-let [vendor-name (first (:vendor_name doc))]
[:span.tag.is-primary "vendor: " vendor-name])]]
[:a.card-header-icon.fa.fa-external-link {:href (str "/" (cond (= "invoice"
(:type doc))
"invoices"
(= "transaction"
(:type doc))
"transactions"
:else
"payments") "/?exact-match-id=" (:id doc))
:target "_blank"}]
]
[:div.card-content
[:span
[:strong (atime/unparse (atime/parse (:date doc) atime/solr-date) atime/normal-date)]
": "
(str (or (first (:description doc))
(first (:number doc))))]]]]
)
[:div.block "No results found."])]))
(defn dialog-contents [request]
(if-let [q (:q (:params request))]
(html-response (search-results* q (:identity request)))
(html-response
[:div#search {:style {:height "400px" :overflow "auto"}}
[:div.block
[:input#search-input.input {:type "search"
:placeholder "5/5/2034 Magheritas"
:name "q"
:hx-post "/search"
:hx-trigger "keyup changed delay:300ms, search"
:hx-target "#search-results"
:hx-indicator "#search"
:value (:q (:params request))
:autofocus true}]]
[:style
".htmx-request #search-results {display: none} .htmx-request .htmx-indicator { display: block !important; }"]
[:div#search-results
]
[:div.loader.is-loading.big.htmx-indicator {:style {:display "none"}}]])))

View File

@@ -4,9 +4,10 @@
[config.core :refer [env]] [config.core :refer [env]]
[hiccup2.core :as hiccup])) [hiccup2.core :as hiccup]))
(defn html-response [hiccup & {:keys [status] :or {status 200}}] (defn html-response [hiccup & {:keys [status headers] :or {status 200 headers {}}}]
{:status status {:status status
:headers {"Content-Type" "text/html"} :headers (into {"Content-Type" "text/html"}
headers)
:body (str :body (str
(hiccup/html (hiccup/html
{} {}

View File

@@ -14,9 +14,16 @@
(def normal-date "MM/dd/yyyy") (def normal-date "MM/dd/yyyy")
(def iso-date "yyyy-MM-dd") (def iso-date "yyyy-MM-dd")
(def solr-date "yyyy-MM-dd'T'HH:mm:ss'Z'")
(def standard-time "MM/dd/yyyy hh:mm aa") (def standard-time "MM/dd/yyyy hh:mm aa")
(defn parse-utc [v format]
(try
(f/parse (f/formatter format) v)
(catch Exception _
nil)))
(defn parse [v format] (defn parse [v format]
(try (try
(time/from-time-zone (f/parse (f/formatter format) v) (time/from-time-zone (f/parse (f/formatter format) v)

View File

@@ -4,6 +4,7 @@
[auto-ap.datomic :refer [conn pull-attr random-tempid]] [auto-ap.datomic :refer [conn pull-attr random-tempid]]
[auto-ap.ledger :as l ] [auto-ap.ledger :as l ]
[clj-http.core :as http] [clj-http.core :as http]
[clj-http.client :as client]
[auto-ap.server] [auto-ap.server]
[auto-ap.square.core :as square] [auto-ap.square.core :as square]
[auto-ap.square.core2 :as square2] [auto-ap.square.core2 :as square2]
@@ -24,12 +25,17 @@
[unilog.context :as lc] [unilog.context :as lc]
[com.brunobonacci.mulog :as mu] [com.brunobonacci.mulog :as mu]
[com.brunobonacci.mulog.buffer :as rb] [com.brunobonacci.mulog.buffer :as rb]
[datomic.api :as d]) [datomic.api :as d]
[clojure.data.json :as json]
[auto-ap.solr :as solr])
(:import (:import
(org.apache.commons.io.input BOMInputStream))) (org.apache.commons.io.input BOMInputStream)))
(defn println-event [item] (defn println-event [item]
(printf "%s - %s: %s\n" (:mulog/namespace item) (:mulog/event-name item) (printf "%s - %s:%s %s\n" (:mulog/namespace item) (:mulog/event-name item)
(if (:mulog/duration item)
(str " " (int (/ (:mulog/duration item) 1000000)) "ms")
"")
(pr-str (reduce (pr-str (reduce
(fn [acc [k v]] (fn [acc [k v]]
(assoc acc k v)) (assoc acc k v))
@@ -554,14 +560,96 @@
:separator \tab)))) :separator \tab))))
(defn fmt-amount [a]
(with-precision 2
(some-> a
bigdec
(.setScale 2 java.math.RoundingMode/HALF_UP)
(double))))
(defn index-solr (defn index-solr
[] []
) (doseq [batch (->> (dc/qseq {:query '[:find (pull ?i [:db/id :invoice/invoice-number
:invoice/total
{:invoice/client [:client/code :db/id]
:invoice/vendor [:vendor/name :db/id]}
:invoice/date])
:in $
:where [?i :invoice/invoice-number]
(not [?i :invoice/status :invoice-status/voided])]
:args [
(dc/db conn)]})
(map (fn [[i]]
{"id" (-> i :db/id)
"client_id" (-> i :invoice/client :db/id)
"client_code" (-> i :invoice/client :client/code)
"date" (some-> i :invoice/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :invoice/total fmt-amount)
"number" (-> i :invoice/invoice-number)
"vendor_name" (-> i :invoice/vendor :vendor/name)
"vendor_id" (-> i :invoice/vendor :db/id)
"type" "invoice"
}))
(partition-all 1000))]
(print ".")
(flush)
(solr/index-documents batch))
(doseq [batch (->> (dc/qseq {:query '[:find (pull ?i [:db/id :payment/check-number
:payment/amount
{:payment/client [:client/code :db/id]
:payment/vendor [:vendor/name :db/id]}
:payment/date])
:in $
:where [?i :payment/date]
(not [?i :payment/status :payment-status/voided])]
:args [(dc/db conn)]})
(map (fn [[i]]
{"id" (-> i :db/id)
"client_id" (-> i :payment/client :db/id)
"client_code" (-> i :payment/client :client/code)
"date" (some-> i :payment/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :payment/amount fmt-amount)
"description" (-> i :payment/check-number)
"vendor_name" (-> i :payment/vendor :vendor/name)
"vendor_id" (-> i :payment/vendor :db/id)
"type" "payment"}))
(partition-all 1000))]
(print ".")
(flush)
(solr/index-documents batch))
(doseq [batch (->> (dc/qseq {:query '[:find (pull ?i [:db/id :transaction/description-original
:transaction/amount
{:transaction/client [:client/code :db/id]
:transaction/vendor [:vendor/name :db/id]}
:transaction/date])
:in $
:where [?i :transaction/description-original]
(not [?i :transaction/approval-status :transaction-approval-status/suppressed])]
:args [(dc/db conn)]})
(map (fn [[i]]
{"id" (-> i :db/id)
"client_id" (-> i :transaction/client :db/id)
"client_code" (-> i :transaction/client :client/code)
"date" (some-> i :transaction/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :transaction/amount fmt-amount)
"description" (-> i :transaction/description-original)
"vendor_name" (-> i :transaction/vendor :vendor/name)
"vendor_id" (-> i :transaction/vendor :db/id)
"type" "transaction"}))
(partition-all 1000))]
(print ".")
(flush)
(solr/index-documents batch)
))
(defn setup-sales-orders [] (defn setup-sales-orders []
(doseq [n (->> (dc/qseq {:query '[:find ?s ?c :where [?s :sales-order/client ?c]] :args [(dc/db auto-ap.datomic/conn)]}) (doseq [n (->> (dc/qseq {:query '[:find ?s ?c :where [?s :sales-order/client ?c]] :args [(dc/db auto-ap.datomic/conn)]})
(map (fn [[s c]] (map (fn [[s c]]
{:db/id s :sales-order/client c})) {:db/id s :sales-order/client c}))
(partition-all 1000) (partition-all 1000))]
(take 10))] (print ".")
@(dc/transact auto-ap.datomic/conn n))) @(dc/transact auto-ap.datomic/conn n)))

View File

@@ -1,6 +1,7 @@
(ns auto-ap.ssr-routes) (ns auto-ap.ssr-routes)
(def routes {"logout" :logout (def routes {"logout" :logout
"search" :search
"admin" {"/history" {"" :admin-history "admin" {"/history" {"" :admin-history
"/" :admin-history "/" :admin-history
#"/search/?" :admin-history-search #"/search/?" :admin-history-search

View File

@@ -158,6 +158,7 @@
:else :else
{:db (-> db {:db (-> db
(assoc :active-route handler (assoc :active-route handler
:auto-ap.views.components.modal/state nil
:page-failure nil :page-failure nil
:menu nil :menu nil
:query-params params :query-params params

View File

@@ -4,6 +4,7 @@
[auto-ap.routes :as routes] [auto-ap.routes :as routes]
[auto-ap.subs :as subs] [auto-ap.subs :as subs]
[auto-ap.views.components.modal :as modal] [auto-ap.views.components.modal :as modal]
[auto-ap.views.components.search :as search]
[auto-ap.views.components.vendor-dialog :as vendor-dialog] [auto-ap.views.components.vendor-dialog :as vendor-dialog]
[auto-ap.views.utils [auto-ap.views.utils
:refer [active-when :refer [active-when
@@ -33,8 +34,7 @@
(println (.-activeElement js/document)) (println (.-activeElement js/document))
(when-not (.contains @!child (.-activeElement js/document)) (when-not (.contains @!child (.-activeElement js/document))
(re-frame/dispatch [::events/toggle-menu id]))) (re-frame/dispatch [::events/toggle-menu id])))
2)) 2))}
}
[:a {:class "navbar-link login" :on-click (fn [e] [:a {:class "navbar-link login" :on-click (fn [e]
(.preventDefault e) (.preventDefault e)
(.stopPropagation e) (.stopPropagation e)
@@ -166,14 +166,13 @@
(when-not is-initial-loading (when-not is-initial-loading
[:div.navbar-end [:div.navbar-end
(when (> (count @clients) 1) (when (> (count @clients) 1)
[client-dropdown])])] [client-dropdown])
])]
(when-not is-initial-loading (when-not is-initial-loading
[login-dropdown])] [login-dropdown])]
(when (= "admin" (:user/role @user))
[:div {:style {:position "fixed" :top "4px" :right "8px"}}
])))) [search/search-button ]])]))))
(defn appearing-side-bar [{:keys [visible?]} ] (defn appearing-side-bar [{:keys [visible?]} ]
@@ -188,6 +187,7 @@
[:div [:div
[modal/global-modal] [modal/global-modal]
[navbar ap] [navbar ap]
[:div {:class "columns has-shadow", :style {:margin-bottom "0px" :height "calc(100vh - 46px)" } :id "mail-app" } [:div {:class "columns has-shadow", :style {:margin-bottom "0px" :height "calc(100vh - 46px)" } :id "mail-app" }
[:aside {:class "column aside menu is-2 " } [:aside {:class "column aside menu is-2 " }
[:div.main.left-nav [:div.main.left-nav

View File

@@ -0,0 +1,30 @@
(ns auto-ap.views.components.search
(:require
[auto-ap.views.utils :refer [dispatch-event]]
[auto-ap.views.components.modal :as modal]
[reagent.core :as reagent]))
(defn search-dialog-body []
(let [a (atom nil)]
(reagent/create-class
{
:component-did-mount
(fn [this]
(.process js/htmx @a))
:should-component-update
(fn [this]
false)
:reagent-render
(fn []
[:div {:ref (fn [x] (reset! a x))
"hx-get" "/search"
"hx-trigger" "load"}
""])})))
(defn search-button []
[:i.fa.fa-search.button {:on-click
(dispatch-event [::modal/modal-requested
{:title "Search"
:body [search-dialog-body]
:class "semi-wide"}])}
#_[:i.fa.fa-search]])

View File

@@ -190,7 +190,8 @@
(defn content [] (defn content []
(let [is-admin? @(re-frame/subscribe [::subs/is-admin?])] (let [is-admin? @(re-frame/subscribe [::subs/is-admin?])
_ @(re-frame/subscribe [::data-page/params ::page])]
[:div [:div
[:h1.title "Transactions"] [:h1.title "Transactions"]
[status/status-notification {:statuses [[::status/single ::delete-selected] [status/status-notification {:statuses [[::status/single ::delete-selected]

View File

@@ -0,0 +1,2 @@
#!/bin/sh
ssh -L 2049:172.31.38.113:2049 3.213.115.86 -L 8983:solr-prod-cloud.local:8983 -L 4334:datomic-iol-dev.local:4334

View File

@@ -55,15 +55,10 @@ resource "aws_ecs_service" "integreat_app" {
} }
capacity_provider_strategy { capacity_provider_strategy {
base = 0 base = 1
capacity_provider = "FARGATE_SPOT" capacity_provider = "FARGATE_SPOT"
weight = 5 weight = 5
} }
capacity_provider_strategy {
base = 1
capacity_provider = "FARGATE"
weight = 1
}
deployment_circuit_breaker { deployment_circuit_breaker {
enable = false enable = false
@@ -457,7 +452,6 @@ module "load_historical_sales_job" {
memory = 4096 memory = 4096
cpu = 1024 cpu = 1024
} }
*/
module "restore_from_backup_job" { module "restore_from_backup_job" {
source = "./background-job/" source = "./background-job/"
@@ -483,3 +477,4 @@ module "ntg_job" {
memory = 4096 memory = 4096
cpu = 1024 cpu = 1024
} }
*/

View File

@@ -0,0 +1,62 @@
[
{
"environment": [
{
"name": "DD_ENV",
"value": "prod-cloud"
},
{
"name": "DD_SERVICE",
"value": "solr"
}
],
"essential": true,
"image": "solr",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/solr-prod-cloud",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
},
"dockerLabels": {
"com.datadoghq.tags.env": "prod-cloud",
"com.datadoghq.tags.service": "solr"
},
"mountPoints": [],
"name": "solr",
"portMappings": [
{
"containerPort": 8983,
"hostPort": 8983,
"protocol": "tcp"
}
],
"volumesFrom": [],
"mountPoints": [
{
"sourceVolume": "solr-storage",
"containerPath": "/var/solr",
"readOnly": false
}
]
},
{
"environment": [
{
"name": "DD_API_KEY",
"value": "ce10d932c47b358e81081ae67bd8c112"
},
{
"name": "ECS_FARGATE",
"value": "true"
}
],
"essential": true,
"image": "public.ecr.aws/datadog/agent:latest",
"name": "datadog-agent"
}
]

97
terraform/solr.tf Normal file
View File

@@ -0,0 +1,97 @@
resource "aws_efs_file_system" "solr_storage" {
creation_token = "solr_storage-${var.stage}"
tags = {
Name = "solr_storage_${var.stage}"
}
}
resource "aws_ecs_task_definition" "solr" {
family = "solr_${var.stage}"
container_definitions = file("${var.stage}-solr-taskdef.json")
memory = 4096
cpu = 1024
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
execution_role_arn = var.execution_role_arn
task_role_arn = var.task_role_arn
volume {
name = "solr-storage"
efs_volume_configuration {
file_system_id = aws_efs_file_system.solr_storage.id
root_directory = "/"
/*
authorization_config {
access_point_id = aws_efs_access_point.test.id
iam = "ENABLED"
}
*/
}
}
}
resource "aws_ecs_service" "solr" {
name = "solr_app_${var.stage}"
cluster = var.ecs_cluster
task_definition = aws_ecs_task_definition.solr.arn
desired_count = 1
deployment_controller {
type = "ECS"
}
scheduling_strategy = "REPLICA"
platform_version = "LATEST"
network_configuration {
assign_public_ip = true
security_groups = [ "sg-004e5855310c453a3", "sg-02d167406b1082698"]
subnets = [ "subnet-5e675761", "subnet-8519fde2", "subnet-89bab8d4" ]
}
service_registries {
container_port = 0
port = 0
registry_arn = aws_service_discovery_service.solr.arn
}
capacity_provider_strategy {
base = 1
capacity_provider = "FARGATE_SPOT"
weight = 5
}
deployment_circuit_breaker {
enable = false
rollback = false
}
wait_for_steady_state = true
timeouts {}
lifecycle {
ignore_changes = [task_definition]
}
}
resource "aws_service_discovery_service" "solr" {
name = "solr-${var.stage}"
dns_config {
namespace_id = var.local_namespace
dns_records {
ttl = 10
type = "A"
}
routing_policy = "MULTIVALUE"
}
health_check_custom_config {
failure_threshold = 1
}
}

View File

@@ -1,7 +1,7 @@
{ {
"version": 4, "version": 4,
"terraform_version": "1.3.8", "terraform_version": "1.4.3",
"serial": 78, "serial": 104,
"lineage": "cf731bb4-8fb3-47af-6e29-22030e089d96", "lineage": "cf731bb4-8fb3-47af-6e29-22030e089d96",
"outputs": { "outputs": {
"aws_access_key_id": { "aws_access_key_id": {
@@ -94,14 +94,9 @@
"attributes": { "attributes": {
"capacity_provider_strategy": [ "capacity_provider_strategy": [
{ {
"base": 0, "base": 1,
"capacity_provider": "FARGATE_SPOT", "capacity_provider": "FARGATE_SPOT",
"weight": 5 "weight": 5
},
{
"base": 1,
"capacity_provider": "FARGATE",
"weight": 1
} }
], ],
"cluster": "arn:aws:ecs:us-east-1:679918342773:cluster/default", "cluster": "arn:aws:ecs:us-east-1:679918342773:cluster/default",
@@ -164,7 +159,7 @@
], ],
"tags": {}, "tags": {},
"tags_all": {}, "tags_all": {},
"task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod-cloud:17", "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod-cloud:51",
"timeouts": { "timeouts": {
"delete": null "delete": null
}, },
@@ -180,6 +175,90 @@
} }
] ]
}, },
{
"mode": "managed",
"type": "aws_ecs_service",
"name": "solr",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"capacity_provider_strategy": [
{
"base": 1,
"capacity_provider": "FARGATE_SPOT",
"weight": 5
}
],
"cluster": "arn:aws:ecs:us-east-1:679918342773:cluster/default",
"deployment_circuit_breaker": [
{
"enable": false,
"rollback": false
}
],
"deployment_controller": [
{
"type": "ECS"
}
],
"deployment_maximum_percent": 200,
"deployment_minimum_healthy_percent": 100,
"desired_count": 1,
"enable_ecs_managed_tags": false,
"enable_execute_command": false,
"force_new_deployment": null,
"health_check_grace_period_seconds": 0,
"iam_role": "aws-service-role",
"id": "arn:aws:ecs:us-east-1:679918342773:service/default/solr_app_prod-cloud",
"launch_type": "",
"load_balancer": [],
"name": "solr_app_prod-cloud",
"network_configuration": [
{
"assign_public_ip": true,
"security_groups": [
"sg-004e5855310c453a3",
"sg-02d167406b1082698"
],
"subnets": [
"subnet-5e675761",
"subnet-8519fde2",
"subnet-89bab8d4"
]
}
],
"ordered_placement_strategy": [],
"placement_constraints": [],
"platform_version": "LATEST",
"propagate_tags": "NONE",
"scheduling_strategy": "REPLICA",
"service_registries": [
{
"container_name": "",
"container_port": 0,
"port": 0,
"registry_arn": "arn:aws:servicediscovery:us-east-1:679918342773:service/srv-smnd6gtc2jtbnkvu"
}
],
"tags": null,
"tags_all": {},
"task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod-cloud:3",
"timeouts": {
"delete": null
},
"wait_for_steady_state": true
},
"sensitive_attributes": [],
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiZGVsZXRlIjoxMjAwMDAwMDAwMDAwfX0=",
"dependencies": [
"aws_ecs_task_definition.solr",
"aws_service_discovery_service.solr"
]
}
]
},
{ {
"mode": "managed", "mode": "managed",
"type": "aws_ecs_task_definition", "type": "aws_ecs_task_definition",
@@ -218,6 +297,105 @@
} }
] ]
}, },
{
"mode": "managed",
"type": "aws_ecs_task_definition",
"name": "solr",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod-cloud:3",
"container_definitions": "[{\"cpu\":0,\"dockerLabels\":{\"com.datadoghq.tags.env\":\"prod-cloud\",\"com.datadoghq.tags.service\":\"solr\"},\"environment\":[{\"name\":\"DD_ENV\",\"value\":\"prod-cloud\"},{\"name\":\"DD_SERVICE\",\"value\":\"solr\"}],\"essential\":true,\"image\":\"solr\",\"logConfiguration\":{\"logDriver\":\"awslogs\",\"options\":{\"awslogs-group\":\"/ecs/solr-prod-cloud\",\"awslogs-region\":\"us-east-1\",\"awslogs-stream-prefix\":\"ecs\"}},\"mountPoints\":[{\"containerPath\":\"/var/solr\",\"readOnly\":false,\"sourceVolume\":\"solr-storage\"}],\"name\":\"solr\",\"portMappings\":[{\"containerPort\":8983,\"hostPort\":8983,\"protocol\":\"tcp\"}],\"volumesFrom\":[]},{\"cpu\":0,\"environment\":[{\"name\":\"DD_API_KEY\",\"value\":\"ce10d932c47b358e81081ae67bd8c112\"},{\"name\":\"ECS_FARGATE\",\"value\":\"true\"}],\"essential\":true,\"image\":\"public.ecr.aws/datadog/agent:latest\",\"mountPoints\":[],\"name\":\"datadog-agent\",\"portMappings\":[],\"volumesFrom\":[]}]",
"cpu": "1024",
"ephemeral_storage": [],
"execution_role_arn": "arn:aws:iam::679918342773:role/ecsTaskExecutionRole",
"family": "solr_prod-cloud",
"id": "solr_prod-cloud",
"inference_accelerator": [],
"ipc_mode": "",
"memory": "4096",
"network_mode": "awsvpc",
"pid_mode": "",
"placement_constraints": [],
"proxy_configuration": [],
"requires_compatibilities": [
"FARGATE"
],
"revision": 3,
"runtime_platform": [],
"tags": {},
"tags_all": {},
"task_role_arn": "arn:aws:iam::679918342773:role/datomic-ddb",
"volume": [
{
"docker_volume_configuration": [],
"efs_volume_configuration": [
{
"authorization_config": [],
"file_system_id": "fs-0a72af98fd255b75e",
"root_directory": "/",
"transit_encryption": "",
"transit_encryption_port": 0
}
],
"fsx_windows_file_server_volume_configuration": [],
"host_path": "",
"name": "solr-storage"
}
]
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"aws_efs_file_system.solr_storage"
]
}
]
},
{
"mode": "managed",
"type": "aws_efs_file_system",
"name": "solr_storage",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"arn": "arn:aws:elasticfilesystem:us-east-1:679918342773:file-system/fs-0a72af98fd255b75e",
"availability_zone_id": "",
"availability_zone_name": "",
"creation_token": "solr_storage-prod-cloud",
"dns_name": "fs-0a72af98fd255b75e.efs.us-east-1.amazonaws.com",
"encrypted": false,
"id": "fs-0a72af98fd255b75e",
"kms_key_id": "",
"lifecycle_policy": [],
"number_of_mount_targets": 6,
"owner_id": "679918342773",
"performance_mode": "generalPurpose",
"provisioned_throughput_in_mibps": 0,
"size_in_bytes": [
{
"value": 6739968,
"value_in_ia": 0,
"value_in_standard": 6739968
}
],
"tags": {
"Name": "solr_storage_prod-cloud"
},
"tags_all": {
"Name": "solr_storage_prod-cloud"
},
"throughput_mode": "bursting"
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
},
{ {
"mode": "managed", "mode": "managed",
"type": "aws_iam_access_key", "type": "aws_iam_access_key",
@@ -634,7 +812,7 @@
"lifecycle_rule": [], "lifecycle_rule": [],
"logging": [], "logging": [],
"object_lock_configuration": [], "object_lock_configuration": [],
"policy": "{\"Id\":\"Policy1526084187222\",\"Statement\":[{\"Action\":[\"s3:GetObject\"],\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com/*\",\"Sid\":\"Stmt1526084185514\"},{\"Action\":\"s3:*\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::679918342773:role/datomic-ddb\"},\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com\",\"Sid\":\"AllowReadForProd\"}],\"Version\":\"2012-10-17\"}", "policy": "{\"Id\":\"Policy1526084187222\",\"Statement\":[{\"Action\":[\"s3:GetObject\"],\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com/*\",\"Sid\":\"Stmt1526084185514\"},{\"Action\":\"s3:*\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::679918342773:role/datomic-ddb\"},\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com\",\"Sid\":\"AllowReadForProd\"},{\"Action\":\"s3:*\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::679918342773:role/http-proxy\"},\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com\",\"Sid\":\"AllowReadForProdProxy\"}],\"Version\":\"2012-10-17\"}",
"region": "us-east-1", "region": "us-east-1",
"replication_configuration": [], "replication_configuration": [],
"request_payer": "BucketOwner", "request_payer": "BucketOwner",
@@ -900,6 +1078,47 @@
} }
] ]
}, },
{
"mode": "managed",
"type": "aws_service_discovery_service",
"name": "solr",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"arn": "arn:aws:servicediscovery:us-east-1:679918342773:service/srv-smnd6gtc2jtbnkvu",
"description": "",
"dns_config": [
{
"dns_records": [
{
"ttl": 10,
"type": "A"
}
],
"namespace_id": "ns-gv2z744em7myo2jp",
"routing_policy": "MULTIVALUE"
}
],
"force_destroy": false,
"health_check_config": [],
"health_check_custom_config": [
{
"failure_threshold": 1
}
],
"id": "srv-smnd6gtc2jtbnkvu",
"name": "solr-prod-cloud",
"namespace_id": "ns-gv2z744em7myo2jp",
"tags": {},
"tags_all": {}
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
},
{ {
"mode": "managed", "mode": "managed",
"type": "aws_ses_receipt_rule", "type": "aws_ses_receipt_rule",
@@ -1075,45 +1294,6 @@
"private": "bnVsbA==" "private": "bnVsbA=="
} }
] ]
},
{
"module": "module.restore_from_backup_job",
"mode": "managed",
"type": "aws_ecs_task_definition",
"name": "background_taskdef",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/restore_from_backup_prod_cloud:3",
"container_definitions": "[{\"cpu\":0,\"dockerLabels\":{\"com.datadoghq.tags.env\":\"prod-cloud\",\"com.datadoghq.tags.service\":\"restore-from-backup\"},\"environment\":[{\"name\":\"DD_CONTAINER_ENV_AS_TAGS\",\"value\":\"{\\\"INTEGREAT_JOB\\\":\\\"background_job\\\"}\"},{\"name\":\"DD_ENV\",\"value\":\"prod-cloud\"},{\"name\":\"DD_SERVICE\",\"value\":\"restore-from-backup\"},{\"name\":\"INTEGREAT_JOB\",\"value\":\"restore-from-backup\"},{\"name\":\"config\",\"value\":\"/usr/local/config/prod-cloud-background-worker.edn\"}],\"essential\":true,\"image\":\"679918342773.dkr.ecr.us-east-1.amazonaws.com/integreat-cloud:prod-cloud\",\"logConfiguration\":{\"logDriver\":\"awslogs\",\"options\":{\"awslogs-group\":\"/ecs/integreat-app-prod\",\"awslogs-region\":\"us-east-1\",\"awslogs-stream-prefix\":\"ecs\"}},\"mountPoints\":[],\"name\":\"integreat-app\",\"portMappings\":[{\"containerPort\":9000,\"hostPort\":9000,\"protocol\":\"tcp\"},{\"containerPort\":9090,\"hostPort\":9090,\"protocol\":\"tcp\"}],\"volumesFrom\":[]},{\"cpu\":0,\"environment\":[{\"name\":\"DD_API_KEY\",\"value\":\"ce10d932c47b358e81081ae67bd8c112\"},{\"name\":\"ECS_FARGATE\",\"value\":\"true\"}],\"essential\":true,\"image\":\"public.ecr.aws/datadog/agent:latest\",\"mountPoints\":[],\"name\":\"datadog-agent\",\"portMappings\":[],\"volumesFrom\":[]}]",
"cpu": "4096",
"ephemeral_storage": [],
"execution_role_arn": "arn:aws:iam::679918342773:role/ecsTaskExecutionRole",
"family": "restore_from_backup_prod_cloud",
"id": "restore_from_backup_prod_cloud",
"inference_accelerator": [],
"ipc_mode": "",
"memory": "8192",
"network_mode": "awsvpc",
"pid_mode": "",
"placement_constraints": [],
"proxy_configuration": [],
"requires_compatibilities": [
"FARGATE"
],
"revision": 3,
"runtime_platform": [],
"tags": null,
"tags_all": {},
"task_role_arn": "arn:aws:iam::679918342773:role/datomic-ddb",
"volume": []
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ=="
}
]
} }
], ],
"check_results": null "check_results": null

View File

@@ -1,7 +1,7 @@
{ {
"version": 4, "version": 4,
"terraform_version": "1.3.8", "terraform_version": "1.4.3",
"serial": 72, "serial": 98,
"lineage": "cf731bb4-8fb3-47af-6e29-22030e089d96", "lineage": "cf731bb4-8fb3-47af-6e29-22030e089d96",
"outputs": { "outputs": {
"aws_access_key_id": { "aws_access_key_id": {
@@ -94,14 +94,9 @@
"attributes": { "attributes": {
"capacity_provider_strategy": [ "capacity_provider_strategy": [
{ {
"base": 0, "base": 1,
"capacity_provider": "FARGATE_SPOT", "capacity_provider": "FARGATE_SPOT",
"weight": 5 "weight": 5
},
{
"base": 1,
"capacity_provider": "FARGATE",
"weight": 1
} }
], ],
"cluster": "arn:aws:ecs:us-east-1:679918342773:cluster/default", "cluster": "arn:aws:ecs:us-east-1:679918342773:cluster/default",
@@ -164,7 +159,7 @@
], ],
"tags": {}, "tags": {},
"tags_all": {}, "tags_all": {},
"task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod-cloud:16", "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod-cloud:51",
"timeouts": { "timeouts": {
"delete": null "delete": null
}, },
@@ -180,6 +175,91 @@
} }
] ]
}, },
{
"mode": "managed",
"type": "aws_ecs_service",
"name": "solr",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"capacity_provider_strategy": [
{
"base": 1,
"capacity_provider": "FARGATE_SPOT",
"weight": 5
}
],
"cluster": "arn:aws:ecs:us-east-1:679918342773:cluster/default",
"deployment_circuit_breaker": [
{
"enable": false,
"rollback": false
}
],
"deployment_controller": [
{
"type": "ECS"
}
],
"deployment_maximum_percent": 200,
"deployment_minimum_healthy_percent": 100,
"desired_count": 1,
"enable_ecs_managed_tags": false,
"enable_execute_command": false,
"force_new_deployment": null,
"health_check_grace_period_seconds": 0,
"iam_role": "aws-service-role",
"id": "arn:aws:ecs:us-east-1:679918342773:service/default/solr_app_prod-cloud",
"launch_type": "",
"load_balancer": [],
"name": "solr_app_prod-cloud",
"network_configuration": [
{
"assign_public_ip": true,
"security_groups": [
"sg-004e5855310c453a3",
"sg-02d167406b1082698"
],
"subnets": [
"subnet-5e675761",
"subnet-8519fde2",
"subnet-89bab8d4"
]
}
],
"ordered_placement_strategy": [],
"placement_constraints": [],
"platform_version": "LATEST",
"propagate_tags": "NONE",
"scheduling_strategy": "REPLICA",
"service_registries": [
{
"container_name": "",
"container_port": 0,
"port": 0,
"registry_arn": "arn:aws:servicediscovery:us-east-1:679918342773:service/srv-cmwdohq6dvf3pbjv"
}
],
"tags": null,
"tags_all": {},
"task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod-cloud:3",
"timeouts": {
"delete": null
},
"wait_for_steady_state": true
},
"sensitive_attributes": [],
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiZGVsZXRlIjoxMjAwMDAwMDAwMDAwfX0=",
"dependencies": [
"aws_ecs_task_definition.solr",
"aws_efs_file_system.solr_storage",
"aws_service_discovery_service.service"
]
}
]
},
{ {
"mode": "managed", "mode": "managed",
"type": "aws_ecs_task_definition", "type": "aws_ecs_task_definition",
@@ -218,6 +298,105 @@
} }
] ]
}, },
{
"mode": "managed",
"type": "aws_ecs_task_definition",
"name": "solr",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod-cloud:3",
"container_definitions": "[{\"cpu\":0,\"dockerLabels\":{\"com.datadoghq.tags.env\":\"prod-cloud\",\"com.datadoghq.tags.service\":\"solr\"},\"environment\":[{\"name\":\"DD_ENV\",\"value\":\"prod-cloud\"},{\"name\":\"DD_SERVICE\",\"value\":\"solr\"}],\"essential\":true,\"image\":\"solr\",\"logConfiguration\":{\"logDriver\":\"awslogs\",\"options\":{\"awslogs-group\":\"/ecs/solr-prod-cloud\",\"awslogs-region\":\"us-east-1\",\"awslogs-stream-prefix\":\"ecs\"}},\"mountPoints\":[{\"containerPath\":\"/var/solr\",\"readOnly\":false,\"sourceVolume\":\"solr-storage\"}],\"name\":\"solr\",\"portMappings\":[{\"containerPort\":8983,\"hostPort\":8983,\"protocol\":\"tcp\"}],\"volumesFrom\":[]},{\"cpu\":0,\"environment\":[{\"name\":\"DD_API_KEY\",\"value\":\"ce10d932c47b358e81081ae67bd8c112\"},{\"name\":\"ECS_FARGATE\",\"value\":\"true\"}],\"essential\":true,\"image\":\"public.ecr.aws/datadog/agent:latest\",\"mountPoints\":[],\"name\":\"datadog-agent\",\"portMappings\":[],\"volumesFrom\":[]}]",
"cpu": "1024",
"ephemeral_storage": [],
"execution_role_arn": "arn:aws:iam::679918342773:role/ecsTaskExecutionRole",
"family": "solr_prod-cloud",
"id": "solr_prod-cloud",
"inference_accelerator": [],
"ipc_mode": "",
"memory": "4096",
"network_mode": "awsvpc",
"pid_mode": "",
"placement_constraints": [],
"proxy_configuration": [],
"requires_compatibilities": [
"FARGATE"
],
"revision": 3,
"runtime_platform": [],
"tags": null,
"tags_all": {},
"task_role_arn": "arn:aws:iam::679918342773:role/datomic-ddb",
"volume": [
{
"docker_volume_configuration": [],
"efs_volume_configuration": [
{
"authorization_config": [],
"file_system_id": "fs-0a72af98fd255b75e",
"root_directory": "/",
"transit_encryption": "",
"transit_encryption_port": null
}
],
"fsx_windows_file_server_volume_configuration": [],
"host_path": "",
"name": "solr-storage"
}
]
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"aws_efs_file_system.solr_storage"
]
}
]
},
{
"mode": "managed",
"type": "aws_efs_file_system",
"name": "solr_storage",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"arn": "arn:aws:elasticfilesystem:us-east-1:679918342773:file-system/fs-0a72af98fd255b75e",
"availability_zone_id": "",
"availability_zone_name": "",
"creation_token": "solr_storage-prod-cloud",
"dns_name": "fs-0a72af98fd255b75e.efs.us-east-1.amazonaws.com",
"encrypted": false,
"id": "fs-0a72af98fd255b75e",
"kms_key_id": "",
"lifecycle_policy": [],
"number_of_mount_targets": 1,
"owner_id": "679918342773",
"performance_mode": "generalPurpose",
"provisioned_throughput_in_mibps": 0,
"size_in_bytes": [
{
"value": 6144,
"value_in_ia": 0,
"value_in_standard": 6144
}
],
"tags": {
"Name": "solr_storage_prod-cloud"
},
"tags_all": {
"Name": "solr_storage_prod-cloud"
},
"throughput_mode": "bursting"
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
},
{ {
"mode": "managed", "mode": "managed",
"type": "aws_iam_access_key", "type": "aws_iam_access_key",
@@ -634,7 +813,7 @@
"lifecycle_rule": [], "lifecycle_rule": [],
"logging": [], "logging": [],
"object_lock_configuration": [], "object_lock_configuration": [],
"policy": "{\"Id\":\"Policy1526084187222\",\"Statement\":[{\"Action\":[\"s3:GetObject\"],\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com/*\",\"Sid\":\"Stmt1526084185514\"},{\"Action\":\"s3:*\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::679918342773:role/datomic-ddb\"},\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com\",\"Sid\":\"AllowReadForProd\"}],\"Version\":\"2012-10-17\"}", "policy": "{\"Id\":\"Policy1526084187222\",\"Statement\":[{\"Action\":[\"s3:GetObject\"],\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com/*\",\"Sid\":\"Stmt1526084185514\"},{\"Action\":\"s3:*\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::679918342773:role/datomic-ddb\"},\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com\",\"Sid\":\"AllowReadForProd\"},{\"Action\":\"s3:*\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::679918342773:role/http-proxy\"},\"Resource\":\"arn:aws:s3:::data.prod-cloud.app.integreatconsult.com\",\"Sid\":\"AllowReadForProdProxy\"}],\"Version\":\"2012-10-17\"}",
"region": "us-east-1", "region": "us-east-1",
"replication_configuration": [], "replication_configuration": [],
"request_payer": "BucketOwner", "request_payer": "BucketOwner",
@@ -900,6 +1079,47 @@
} }
] ]
}, },
{
"mode": "managed",
"type": "aws_service_discovery_service",
"name": "solr",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"arn": "arn:aws:servicediscovery:us-east-1:679918342773:service/srv-smnd6gtc2jtbnkvu",
"description": "",
"dns_config": [
{
"dns_records": [
{
"ttl": 10,
"type": "A"
}
],
"namespace_id": "ns-gv2z744em7myo2jp",
"routing_policy": "MULTIVALUE"
}
],
"force_destroy": false,
"health_check_config": [],
"health_check_custom_config": [
{
"failure_threshold": 1
}
],
"id": "srv-smnd6gtc2jtbnkvu",
"name": "solr-prod-cloud",
"namespace_id": "ns-gv2z744em7myo2jp",
"tags": null,
"tags_all": {}
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
},
{ {
"mode": "managed", "mode": "managed",
"type": "aws_ses_receipt_rule", "type": "aws_ses_receipt_rule",
@@ -1075,45 +1295,6 @@
"private": "bnVsbA==" "private": "bnVsbA=="
} }
] ]
},
{
"module": "module.restore_from_backup_job",
"mode": "managed",
"type": "aws_ecs_task_definition",
"name": "background_taskdef",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/restore_from_backup_prod_cloud:2",
"container_definitions": "[{\"cpu\":0,\"dockerLabels\":{\"com.datadoghq.tags.env\":\"prod-cloud\",\"com.datadoghq.tags.service\":\"restore-from-backup\"},\"environment\":[{\"name\":\"DD_CONTAINER_ENV_AS_TAGS\",\"value\":\"{\\\"INTEGREAT_JOB\\\":\\\"background_job\\\"}\"},{\"name\":\"DD_ENV\",\"value\":\"prod-cloud\"},{\"name\":\"DD_SERVICE\",\"value\":\"restore-from-backup\"},{\"name\":\"INTEGREAT_JOB\",\"value\":\"restore-from-backup\"},{\"name\":\"config\",\"value\":\"/usr/local/config/prod-cloud-background-worker.edn\"}],\"essential\":true,\"image\":\"679918342773.dkr.ecr.us-east-1.amazonaws.com/integreat-cloud:prod-cloud\",\"logConfiguration\":{\"logDriver\":\"awslogs\",\"options\":{\"awslogs-group\":\"/ecs/integreat-background-worker-prod-cloud\",\"awslogs-region\":\"us-east-1\",\"awslogs-stream-prefix\":\"ecs\"}},\"mountPoints\":[],\"name\":\"integreat-app\",\"portMappings\":[{\"containerPort\":9000,\"hostPort\":9000,\"protocol\":\"tcp\"},{\"containerPort\":9090,\"hostPort\":9090,\"protocol\":\"tcp\"}],\"volumesFrom\":[]},{\"cpu\":0,\"environment\":[{\"name\":\"DD_API_KEY\",\"value\":\"ce10d932c47b358e81081ae67bd8c112\"},{\"name\":\"ECS_FARGATE\",\"value\":\"true\"}],\"essential\":true,\"image\":\"public.ecr.aws/datadog/agent:latest\",\"mountPoints\":[],\"name\":\"datadog-agent\",\"portMappings\":[],\"volumesFrom\":[]}]",
"cpu": "4096",
"ephemeral_storage": [],
"execution_role_arn": "arn:aws:iam::679918342773:role/ecsTaskExecutionRole",
"family": "restore_from_backup_prod_cloud",
"id": "restore_from_backup_prod_cloud",
"inference_accelerator": [],
"ipc_mode": "",
"memory": "8192",
"network_mode": "awsvpc",
"pid_mode": "",
"placement_constraints": [],
"proxy_configuration": [],
"requires_compatibilities": [
"FARGATE"
],
"revision": 2,
"runtime_platform": [],
"tags": null,
"tags_all": {},
"task_role_arn": "arn:aws:iam::679918342773:role/datomic-ddb",
"volume": []
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ=="
}
]
} }
], ],
"check_results": null "check_results": null