Skip to content

Commit

Permalink
refactor(wip): use new log component with trace capabilities
Browse files Browse the repository at this point in the history
  • Loading branch information
J0sueTM committed Oct 24, 2024
1 parent f6463cf commit 5a7a935
Show file tree
Hide file tree
Showing 11 changed files with 406 additions and 288 deletions.
108 changes: 54 additions & 54 deletions deps.edn
Original file line number Diff line number Diff line change
@@ -1,80 +1,80 @@
{:paths ["src" "resources"]
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
;; front
com.fbeyer/refx {:mvn/version "0.0.49"}
lilactown/helix {:mvn/version "0.1.9"}
funcool/promesa {:mvn/version "9.0.494"}
metosin/reitit-schema {:mvn/version "0.5.18"}
metosin/reitit-frontend {:mvn/version "0.5.18"}
lambdaisland/fetch {:mvn/version "1.1.60"}
com.fbeyer/refx {:mvn/version "0.0.49"}
lilactown/helix {:mvn/version "0.1.9"}
funcool/promesa {:mvn/version "9.0.494"}
metosin/reitit-schema {:mvn/version "0.5.18"}
metosin/reitit-frontend {:mvn/version "0.5.18"}
lambdaisland/fetch {:mvn/version "1.1.60"}

;; back
com.moclojer/components {:mvn/version "0.1.0"}
com.cognitect.aws/api {:mvn/version "0.8.561"}
com.cognitect.aws/endpoints {:mvn/version "1.1.12.230"}
com.cognitect.aws/s3 {:mvn/version "822.2.1145.0"}
org.clojure/core.async {:mvn/version "1.6.681"}
buddy/buddy-sign {:mvn/version "3.5.351"}
slugify/slugify {:mvn/version "0.0.1"}
cheshire/cheshire {:mvn/version "5.11.0"}
clj-http/clj-http {:mvn/version "3.12.3"}
com.github.seancorfield/honeysql {:mvn/version "2.6.1147"}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.939"}
com.stuartsierra/component {:mvn/version "1.1.0"}
ch.qos.logback/logback-classic {:mvn/version "1.5.6"}
com.moclojer/components {:mvn/version "0.1.4"}
com.cognitect.aws/api {:mvn/version "0.8.561"}
com.cognitect.aws/endpoints {:mvn/version "1.1.12.230"}
com.cognitect.aws/s3 {:mvn/version "822.2.1145.0"}
org.clojure/core.async {:mvn/version "1.6.681"}
buddy/buddy-sign {:mvn/version "3.5.351"}
slugify/slugify {:mvn/version "0.0.1"}
cheshire/cheshire {:mvn/version "5.11.0"}
clj-http/clj-http {:mvn/version "3.12.3"}
com.github.seancorfield/honeysql {:mvn/version "2.6.1147"}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.939"}
com.stuartsierra/component {:mvn/version "1.1.0"}
ch.qos.logback/logback-classic {:mvn/version "1.5.6"}

viesti/timbre-json-appender {:mvn/version "0.2.13"}
com.fzakaria/slf4j-timbre {:mvn/version "0.3.21"}
com.taoensso/timbre {:mvn/version "6.3.1"}
metosin/malli {:mvn/version "0.11.0"}
metosin/muuntaja {:mvn/version "0.6.8"}
org.bouncycastle/bcprov-jdk15on {:mvn/version "1.70"}
selmer/selmer {:mvn/version "1.12.55"}
io.forward/yaml {:mvn/version "1.0.11"}
io.github.cljazz/supabase {:git/sha "a850ed47eb0daa8303f206ea60bd4b3bf59e1e0a"
:git/url "https://github.com/cljazz/supabase-clj"}
babashka/process {:mvn/version "0.5.22"}}
viesti/timbre-json-appender {:mvn/version "0.2.13"}
com.fzakaria/slf4j-timbre {:mvn/version "0.3.21"}
com.taoensso/timbre {:mvn/version "6.3.1"}
metosin/malli {:mvn/version "0.11.0"}
metosin/muuntaja {:mvn/version "0.6.8"}
org.bouncycastle/bcprov-jdk15on {:mvn/version "1.70"}
selmer/selmer {:mvn/version "1.12.55"}
io.forward/yaml {:mvn/version "1.0.11"}
io.github.cljazz/supabase {:git/sha "a850ed47eb0daa8303f206ea60bd4b3bf59e1e0a"
:git/url "https://github.com/cljazz/supabase-clj"}
babashka/process {:mvn/version "0.5.22"}}

:aliases
{;; frontend
:front-dev {:extra-paths ["test/front"]
:extra-deps {cider/cider-nrepl {:mvn/version "0.28.6"}
thheller/shadow-cljs {:mvn/version "2.20.10"}}}
:extra-deps {cider/cider-nrepl {:mvn/version "0.28.6"}
thheller/shadow-cljs {:mvn/version "2.20.10"}}}

:local-components {:extra-deps {com.moclojer/components
{:local/root "../components"}}}
:local-clj-rq {:extra-deps {com.moclojer/rq
{:local/root "../clj-rq"}}}
:local-clj-rq {:extra-deps {com.moclojer/rq
{:local/root "../clj-rq"}}}

;; backend
:back-dev {:extra-paths ["test/back"]
:extra-deps {org.clojars.bigsy/pg-embedded-clj {:mvn/version "1.0.0"}
lambdaisland/kaocha {:mvn/version "1.70.1086"}
lambdaisland/kaocha-cloverage {:mvn/version "1.0.75"}
nubank/matcher-combinators {:mvn/version "3.5.1"}
nubank/state-flow {:mvn/version "5.14.2"}}}
:back-dev {:extra-paths ["test/back"]
:extra-deps {org.clojars.bigsy/pg-embedded-clj {:mvn/version "1.0.0"}
lambdaisland/kaocha {:mvn/version "1.70.1086"}
lambdaisland/kaocha-cloverage {:mvn/version "1.0.75"}
nubank/matcher-combinators {:mvn/version "3.5.1"}
nubank/state-flow {:mvn/version "5.14.2"}}}
;; clj -M:test
:test {:extra-paths ["test/back"]
:extra-deps {org.clojars.bigsy/pg-embedded-clj {:mvn/version "1.0.0"}
lambdaisland/kaocha {:mvn/version "1.70.1086"}
lambdaisland/kaocha-cloverage {:mvn/version "1.0.75"}
nubank/matcher-combinators {:mvn/version "3.5.1"}
nubank/state-flow {:mvn/version "5.14.2"}}
:main-opts ["-m" "kaocha.runner" "--no-capture-output"]}
:test {:extra-paths ["test/back"]
:extra-deps {org.clojars.bigsy/pg-embedded-clj {:mvn/version "1.0.0"}
lambdaisland/kaocha {:mvn/version "1.70.1086"}
lambdaisland/kaocha-cloverage {:mvn/version "1.0.75"}
nubank/matcher-combinators {:mvn/version "3.5.1"}
nubank/state-flow {:mvn/version "5.14.2"}}
:main-opts ["-m" "kaocha.runner" "--no-capture-output"]}
;; clj -:clojure-lsp
:clojure-lsp {:replace-deps {com.github.clojure-lsp/clojure-lsp-standalone {:mvn/version "2022.09.01-15.27.31"}}
:main-opts ["-m" "clojure-lsp.main"]}
:main-opts ["-m" "clojure-lsp.main"]}
;; clj -M:migratus
:migratus {:main-opts ["-m" "com.moclojer.components.migrations"]}
:migratus {:main-opts ["-m" "com.moclojer.components.migrations"]}
;; clj -X:run
:run {:main-opts ["-m" "back.api.server"]
:exec-fn back.api.server/-main}
:run {:main-opts ["-m" "back.api.server"]
:exec-fn back.api.server/-main}

:env/test {}

;; clj -M:nrepl
:nrepl {:extra-deps {cider/cider-nrepl {:mvn/version "0.30.0"}}
:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}
:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}

:build {:deps {io.github.clojure/tools.build {:mvn/version "0.9.4"}}
:build {:deps {io.github.clojure/tools.build {:mvn/version "0.9.4"}}
:ns-default build}}}
5 changes: 5 additions & 0 deletions resources/back/config.edn
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
:prod "prod"
:default "prod"}
:dsn #or [#env SENTRY_AUTH_TOKEN "foobar"]}
:opensearch {:username #or [#env OPENSEARCH_USERNAME "foobar"]
:password #or [#env OPENSEARCH_PASSWORD "foobar"]
:host #or [#env OPENSEARCH_HOST "foobar.com"]
:port #or [#env OPENSEARCH_PORT 25060]
:index #or [#env OPENSEARCH_INDEX "moclojer-api-test-logs"]}
:cloud-providers
{:digital-ocean {:base-url "https://api.digitalocean.com/v2"
:token #or [#env DO_TOKEN "foobar"]
Expand Down
170 changes: 97 additions & 73 deletions src/back/api/controllers/mocks.clj
Original file line number Diff line number Diff line change
@@ -1,140 +1,164 @@
(ns back.api.controllers.mocks
(:require [back.api.adapters.mocks :as adapter.mocks]
[back.api.db.mocks :as db.mocks]
[back.api.logic.mocks :as logic.mocks]
[back.api.ports.producers :as ports.producers]
[com.moclojer.components.logs :as logs]))
(:require
[back.api.adapters.mocks :as adapter.mocks]
[back.api.db.mocks :as db.mocks]
[back.api.logic.mocks :as logic.mocks]
[back.api.ports.producers :as ports.producers]
[com.moclojer.components.logs :as logs]))

(defn create-mock!
[user-id mock {:keys [database mq]} ctx]
(logs/log :info "creating mock"
:ctx (merge ctx
{:mock mock
:user-id user-id}))
(let [owner (assoc {:user-id (parse-uuid (str user-id))}
:org-id (parse-uuid (str (:org-id mock))))
?existing-mock (-> (select-keys mock [:wildcard :subdomain])
(merge owner)
(logic.mocks/->db-by-wildcard)
(db.mocks/get-mock-by-wildcard database ctx))]
(if (seq ?existing-mock)
(throw (ex-info "Mock with given wildcard and subdomain invalid"
{:status-code 412
:cause :invalid-wildcard
:value (adapter.mocks/->wire ?existing-mock)}))
(let [new-mock (-> (logic.mocks/create (merge mock owner))
(db.mocks/insert! database ctx)
(adapter.mocks/->wire))]
(ports.producers/generate-single-yml! (:id new-mock) mq ctx)
(when (:enabled new-mock)
(ports.producers/create-domain! (logic.mocks/pack-domain new-mock)
mq ctx))
new-mock))))
(logs/trace
::create-mock!
{:mock-id (:id mock)
:user-id user-id}
(let [owner (assoc {:user-id (parse-uuid (str user-id))}
:org-id (parse-uuid (str (:org-id mock))))
?existing-mock (-> (select-keys mock [:wildcard :subdomain])
(merge owner)
(logic.mocks/->db-by-wildcard)
(db.mocks/get-mock-by-wildcard database ctx))]
(if (seq ?existing-mock)
(throw (ex-info "Mock with given wildcard and subdomain invalid"
{:status-code 412
:cause :invalid-wildcard
:value (adapter.mocks/->wire ?existing-mock)}))
(let [new-mock (-> (logic.mocks/create (merge mock owner))
(db.mocks/insert! database ctx)
(adapter.mocks/->wire))]
(ports.producers/generate-single-yml! (:id new-mock) mq ctx)
(when (:enabled new-mock)
(ports.producers/create-domain! (logic.mocks/pack-domain new-mock)
mq ctx))
new-mock)))))

(defn wildcard-available?
[mock {:keys [database]} ctx]
(-> (logic.mocks/->db-by-wildcard mock)
(db.mocks/get-mock-by-wildcard database ctx)
(empty?)))
(logs/trace
::wildcard-available?
{:mock-wildcard (:wildcard mock)}
(-> (logic.mocks/->db-by-wildcard mock)
(db.mocks/get-mock-by-wildcard database ctx)
(empty?))))

(defn update-mock!
[id content {:keys [database mq]} ctx]
(if-let [mock (db.mocks/get-mock-by-id id database ctx)]
(let [updated-mock (-> mock
(logic.mocks/update {:content content})
(db.mocks/update! database ctx)
(adapter.mocks/->wire))
->wired-old-mock (adapter.mocks/->wire mock)]
(logs/trace
::update-mock!
{:mock-id id
:content-hash (hash content)}
(let [updated-mock (-> (logic.mocks/update mock {:content content})
(db.mocks/update! database ctx)
(adapter.mocks/->wire))
->wired-old-mock (adapter.mocks/->wire mock)]

(ports.producers/generate-single-yml! (:id updated-mock) mq ctx)
(ports.producers/generate-single-yml! (:id updated-mock) mq ctx)

(when (and (= (:dns-status ->wired-old-mock) "offline")
(:enabled ->wired-old-mock))
(ports.producers/create-domain! (logic.mocks/pack-domain ->wired-old-mock)
mq
ctx))
(when (and (= (:dns-status ->wired-old-mock) "offline")
(:enabled ->wired-old-mock))
(ports.producers/create-domain!
(logic.mocks/pack-domain ->wired-old-mock) mq ctx))

updated-mock)
updated-mock))
(throw (ex-info "Mock with given id invalid"
{:status-code 412
:cause :invalid-id}))))

(defn get-mocks
[{:keys [uuid username]} {:keys [database]} ctx]
(logs/log :info "retrieving mocks"
:ctx (merge ctx {:user/uuid uuid
:user/username username}))
(logic.mocks/group
(->> (db.mocks/get-mocks (parse-uuid (str uuid)) database ctx)
(map adapter.mocks/->wire))
username))
(logs/trace
::get-mocks {:user-id uuid}
(logic.mocks/group
(->> (db.mocks/get-mocks (parse-uuid (str uuid)) database ctx)
(map adapter.mocks/->wire))
username)))

(defn publish-mock!
[id {:keys [database mq]} ctx]
(-> (db.mocks/get-mock-by-id id database ctx)
logic.mocks/publish
(db.mocks/update! database ctx)
(adapter.mocks/->wire)
:id
(ports.producers/generate-single-yml! mq ctx))
(logs/trace
::publish-mock!
{:mock-id id}
(-> (db.mocks/get-mock-by-id id database ctx)
logic.mocks/publish
(db.mocks/update! database ctx)
(adapter.mocks/->wire)
:id
(ports.producers/generate-single-yml! mq ctx)))
true)

(defn unpublish-mock!
[id {:keys [database mq]} ctx]
(-> (db.mocks/get-mock-by-id id database ctx)
(logs/trace
::unpublish-mock!
{:mock-id id}
(-> (db.mocks/get-mock-by-id id database ctx)
logic.mocks/unpublish
(db.mocks/update! database ctx)
(adapter.mocks/->wire)
:id
(ports.producers/generate-single-yml! mq ctx))
(ports.producers/generate-single-yml! mq ctx)))
true)

(defn delete-mock!
[{:keys [user-id]} id {:keys [database mq]} ctx]
(logs/log :info "deleting mock"
:ctx (assoc ctx :mock-id id))
(if-let [{:keys [id org-id user-id] :as ?mock}
(some-> (db.mocks/get-mocks user-id database ctx)
(logic.mocks/filter-by-id id)
(adapter.mocks/->wire))]
(do
(db.mocks/delete-mock-by-id id database ctx)
(ports.producers/delete-single-yml! id (or org-id user-id) mq ctx)
(ports.producers/delete-domain! (logic.mocks/pack-domain ?mock) mq ctx)
true)
(logs/trace
::delete-mock!
{:user-id user-id
:mock-id id}
(do
(db.mocks/delete-mock-by-id id database ctx)
(ports.producers/delete-single-yml! id (or org-id user-id) mq ctx)
(ports.producers/delete-domain! (logic.mocks/pack-domain ?mock) mq ctx)
true))
(throw (ex-info "No mock found with given id"
{:status-code 400
:cause :invalid-id
:value :id}))))

(defn get-mock-publication-status
[id db ctx]
(if-let [mock (db.mocks/get-mock-by-id (parse-uuid (str id)) db ctx)]
(logs/trace
::get-mock-pub-status
{:mock-id id}
(if-let [mock (db.mocks/get-mock-by-id (parse-uuid (str id)) db ctx)]
(-> (adapter.mocks/->wire mock)
(select-keys [:dns-status :unification-status]))
(throw (ex-info "No mock found with given id"
{:status-code 400
:cause :invalid-id
:value id}))))
:value id})))))

(defn update-mock-dns-status!
[domain new-status db ctx]
(if-let [mock (-> (logic.mocks/unpack-domain domain)
(logic.mocks/->db-by-wildcard)
(db.mocks/get-mock-by-wildcard db ctx))]
(-> (logic.mocks/update-dns-status mock new-status)
(select-keys [:mock/id :mock/dns_status])
(db.mocks/update! db ctx))
(logs/trace
::update-mock-dns-status!
{:mock-domain domain
:new-status new-status}
(-> (logic.mocks/update-dns-status mock new-status)
(select-keys [:mock/id :mock/dns_status])
(db.mocks/update! db ctx)))
(throw (ex-info "No mock found with given domain"
{:cause :invalid-domain
:value domain}))))

(defn update-mock-unification-status!
[mock-id new-status db ctx]
(if-let [mock (db.mocks/get-mock-by-id (parse-uuid (str mock-id)) db ctx)]
(-> (logic.mocks/update-unification-status mock new-status)
(select-keys [:mock/id :mock/unification_status])
(db.mocks/update! db ctx))
(logs/trace
::update-mock-unif-status!
{:mock-id mock-id
:new-status new-status}
(-> (logic.mocks/update-unification-status mock new-status)
(select-keys [:mock/id :mock/unification_status])
(db.mocks/update! db ctx)))
(throw (ex-info "No mock found with given id"
{:status-code 400
:cause :invalid-id
Expand Down
Loading

0 comments on commit 5a7a935

Please sign in to comment.