File tree Expand file tree Collapse file tree 8 files changed +104
-12
lines changed Expand file tree Collapse file tree 8 files changed +104
-12
lines changed Original file line number Diff line number Diff line change 1- {:known-macros [mount.core/defstate]}
1+ {:known-macros [mount.core/defstate
2+ toucan.models/defmodel]}
Original file line number Diff line number Diff line change 1010 [org.postgresql/postgresql " 42.2.6" ]
1111 [org.flywaydb/flyway-core " 5.2.4" ]
1212 [com.taoensso/timbre " 4.10.0" ]
13- [cheshire " 5.9.0" ]]
13+ [cheshire " 5.9.0" ]
14+ [toucan " 1.14.0" ]]
1415 :main ^:skip-aot wheel.core
1516 :target-path " target/%s"
1617 :profiles {:uberjar {:aot :all }
Original file line number Diff line number Diff line change 1+ CREATE TYPE event_level AS ENUM (
2+ ' info' , ' debug' ,
3+ ' error' , ' warn' ,
4+ ' fatal' );
5+
6+ CREATE TYPE channel_name AS ENUM (
7+ ' tata-cliq' , ' amazon' , ' flipkart' );
8+
9+ CREATE TABLE event (
10+ id UUID PRIMARY KEY ,
11+ parent_id UUID REFERENCES event(id),
12+ level event_level NOT NULL ,
13+ name TEXT NOT NULL ,
14+ channel_id TEXT NOT NULL ,
15+ channel_name channel_name NOT NULL ,
16+ timestamp TIMESTAMP WITH TIME ZONE NOT NULL
17+ );
Original file line number Diff line number Diff line change 11(ns wheel.infra.database
22 (:require [wheel.infra.config :as config]
33 [mount.core :as mount]
4- [hikari-cp.core :as hikari])
5- (:import [org.flywaydb.core Flyway]))
4+ [hikari-cp.core :as hikari]
5+ [toucan.db :as db]
6+ [toucan.models :as models])
7+ (:import [org.flywaydb.core Flyway]
8+ [org.postgresql.util PGobject]))
69
710(defn- make-datasource []
811 (hikari/make-datasource (config/database )))
1821 load
1922 migrate))
2023
24+ (defn- pg-object-fn [pg-enum-type]
25+ (fn [value]
26+ (doto (PGobject. )
27+ (.setType pg-enum-type)
28+ (.setValue (name value)))))
29+
30+ (defn- configure-toucan []
31+ (db/set-default-db-connection! {:datasource datasource})
32+ (models/set-root-namespace! 'wheel.model)
33+ (db/set-default-automatically-convert-dashes-and-underscores! true )
34+ (models/add-type! :event-level
35+ :in (pg-object-fn " event_level" )
36+ :out keyword)
37+ (models/add-type! :channel-name
38+ :in (pg-object-fn " channel_name" )
39+ :out keyword))
40+
41+ (mount/defstate toucan
42+ :start (configure-toucan ))
43+
2144(comment
22- (mount/start )
45+ (user/reset )
2346 (migrate )
2447 (mount/stop ))
Original file line number Diff line number Diff line change 22 (:require [taoensso.timbre :as timbre]
33 [cheshire.core :as json]
44 [clojure.spec.alpha :as s]
5- [wheel.middleware.event :as event]))
5+ [wheel.middleware.event :as event]
6+ [wheel.infra.log-appender.database :as database]))
67
78(defn- json-output [{:keys [msg_]}]
89 (let [event (read-string (force msg_))]
910 (json/generate-string event)))
1011
1112(defn init []
12- (timbre/merge-config! {:output-fn json-output}))
13+ (timbre/merge-config! {:output-fn json-output
14+ :appenders {:database database/appender}}))
1315
1416(defn write! [{:keys [level]
1517 :as event}]
3335 (write! {:level :info :name :foo })
3436 (s/check-asserts false )
3537 (s/assert ::event/event {:level :info :name :foo })
36- (write! {:name :ranging /succeeded
38+ (write! {:name :deranging /succeeded
3739 :type :domain
3840 :level :info
39- :channel-id 1
40- :timestamp " 2019-10-01T21:56+05:30"
41- :id #uuid " 8e70f4df-fc3d-4474-8ee9-33f4c87bf934"
42- :parent-id #uuid " 20c84be2-7ec2-4127-8d39-a9cb4065a9ce"
41+ :channel-id " UB"
42+ :timestamp " 2019-10-04T15:56+05:30"
43+ :id (java.util.UUID/randomUUID )
4344 :channel-name :tata-cliq })
4445 )
Original file line number Diff line number Diff line change 1+ (ns wheel.infra.log-appender.database
2+ (:require [wheel.model.event :as event]))
3+
4+ (defn- append-to-db [{:keys [msg_]}]
5+ (let [evnt (read-string (force msg_))]
6+ (when (= :domain (:type evnt))
7+ (event/create! evnt))))
8+
9+ (def appender {:enabled? true
10+ :output-fn :inherit
11+ :async? true
12+ :fn append-to-db})
Original file line number Diff line number Diff line change 2626
2727(s/def ::event (s/multi-spec event-type :type ))
2828
29+ (defn domain? [event]
30+ (and (s/valid? ::event event) (= :domain (:type event))))
31+
2932(comment
3033 (s/valid?
3134 ::event
Original file line number Diff line number Diff line change 1+ (ns wheel.model.event
2+ (:require [toucan.models :as models]
3+ [clojure.spec.alpha :as s]
4+ [toucan.db :as db]
5+ [wheel.middleware.event :as event])
6+ (:import [java.time OffsetDateTime]
7+ [java.time.format DateTimeFormatter]))
8+
9+ (models/defmodel Event :event
10+ models /IModel
11+ (types [_]
12+ {:name :keyword
13+ :channel-name :channel-name
14+ :level :event-level }))
15+
16+ (defn- timestamp->offset-date-time [timestamp]
17+ (OffsetDateTime/parse timestamp DateTimeFormatter/ISO_OFFSET_DATE_TIME))
18+
19+ (defn create! [new-event]
20+ {:pre [(s/assert ::event/event new-event)
21+ (s/assert event/domain? new-event)]}
22+ (as-> new-event evt
23+ (update evt :timestamp timestamp->offset-date-time)
24+ (dissoc evt :type )
25+ (db/insert! Event evt)))
26+
27+ (comment
28+ (create! {:name :ranging/succeeded
29+ :type :domain
30+ :channel-id " UA"
31+ :level :info
32+ :timestamp " 2019-10-01T12:30+05:30"
33+ :id (java.util.UUID/randomUUID )
34+ :channel-name :tata-cliq }))
You can’t perform that action at this time.
0 commit comments