bump versions of things, switch from embedded to user-provided config

"embedded" as in, included in built uberjars. config must now be
specified via the cli using the "--config" option

this necessitated some additional changes to how different components
are instantiated for each of the different run actions (e.g. "web",
"scrape-prices") and also for dev tasks like migrate/rollback. using
mount now to handle component start/stop and dependency management.

some cljs dependencies not updated yet as things like the views
libraries are not yet updated the new sente version
This commit is contained in:
Gered 2018-06-07 19:02:10 -04:00
parent 85e5f104ca
commit 94317bdf7e
17 changed files with 233 additions and 226 deletions

1
.gitignore vendored
View file

@ -20,3 +20,4 @@ pom.xml.asc
/profiles.clj /profiles.clj
/resources/public/cljs /resources/public/cljs
/.repl /.repl
/images

19
env/dev/src/user.clj vendored
View file

@ -1,19 +0,0 @@
(ns user
(:use
mtgcoll.core)
(:require
[ragtime.repl :as ragtime]
[mtgcoll.config :as config]
[mtgcoll.db :as db]))
(defn migrate [& args]
(config/load! "config.edn")
(db/setup-config!)
(println "Running migrations on" (:subname @db/db))
(ragtime/migrate (db/get-ragtime-config)))
(defn rollback [& args]
(config/load! "config.edn")
(db/setup-config!)
(println "Rolling back migrations on" (:subname @db/db))
(ragtime/rollback (db/get-ragtime-config) (or (first args) 1)))

27
profiles/dev/src/user.clj Normal file
View file

@ -0,0 +1,27 @@
(ns user
(:use
mtgcoll.core)
(:require
[mount.core :as mount]
[ragtime.repl :as ragtime]
[mtgcoll.cli :as cli]
[mtgcoll.config :as config]
[mtgcoll.db :as db]))
(defn migrate [& args]
(let [{:keys [errors] :as args} (cli/parse-args args)]
(when errors
(cli/show-error! errors)
(System/exit 1))
(mount/start-with-args args #'config/app-config #'db/db)
(println "Running migrations on" (:subname db/db))
(ragtime/migrate (db/get-ragtime-config))))
(defn rollback [& args]
(let [{:keys [errors] :as args} (cli/parse-args args)]
(when errors
(cli/show-error! errors)
(System/exit 1))
(mount/start-with-args args #'config/app-config #'db/db)
(println "Rolling back migrations on" (:subname db/db))
(ragtime/rollback (db/get-ragtime-config) (or (first args) 1))))

View file

@ -4,42 +4,43 @@
:license {:name "MIT License" :license {:name "MIT License"
:url "http://opensource.org/licenses/MIT"} :url "http://opensource.org/licenses/MIT"}
:dependencies [[org.clojure/clojure "1.8.0"] :dependencies [[cheshire "5.6.1"]
[org.clojure/clojurescript "1.8.51"] [clj-http "3.8.0"]
[ring "1.4.0"] [cljsjs/chartjs "2.0.1-0"]
[ring/ring-defaults "0.2.0"] [cljsjs/showdown "1.4.2-0"]
[compojure "1.4.0"]
[org.immutant/web "2.1.4"]
[org.clojure/tools.logging "0.3.1"]
[org.clojure/tools.cli "0.3.5"]
[org.clojure/java.jdbc "0.6.1"]
[org.postgresql/postgresql "9.4.1208.jre7"]
[com.taoensso/sente "1.8.1"] [com.taoensso/sente "1.8.1"]
[compojure "1.6.0"]
[enlive "1.1.6"]
[gered/config "0.1"]
[gered/views "1.5"] [gered/views "1.5"]
[gered/views.sql "0.1"]
[gered/views.reagent "0.1"] [gered/views.reagent "0.1"]
[gered/views.reagent.sente "0.1"] [gered/views.reagent.sente "0.1"]
[gered/views.sql "0.1"]
[gered/webtools "0.1.1"] [gered/webtools "0.1.1"]
[gered/webtools.reagent "0.1.1"] [gered/webtools.reagent "0.1.1"]
[hiccup "1.0.5"] [hiccup "1.0.5"]
[reagent "0.6.0-alpha2"]
[secretary "1.2.3"]
[clj-http "2.2.0"]
[honeysql "0.7.0"] [honeysql "0.7.0"]
[ring-middleware-format "0.7.0"]
[ragtime "0.6.0"]
[enlive "1.1.6"]
[slugger "1.0.1"]
[cheshire "5.6.1"]
[cljsjs/chartjs "2.0.1-0"]
[cljsjs/showdown "1.4.2-0"]
[luminus/ring-ttl-session "0.3.1"] [luminus/ring-ttl-session "0.3.1"]
[mount "0.1.12"]
[org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.8.51"]
[org.clojure/java.jdbc "0.6.1"]
[org.clojure/tools.cli "0.3.5"]
[org.clojure/tools.logging "0.4.1"]
[org.clojure/tools.nrepl "0.2.13"]
[org.immutant/web "2.1.9"]
[org.postgresql/postgresql "9.4.1208.jre7"]
[org.webjars/bootstrap "3.3.6"]
[ragtime "0.6.0"]
[reagent "0.6.0"]
[ring "1.6.3"]
[ring-middleware-format "0.7.0"]
[ring-webjars "0.2.0"]
[ring/ring-defaults "0.3.1" :exclusions [javax.servlet/servlet-api]]
[secretary "1.2.3"]
[slugger "1.0.1"]]
[gered/config "0.1"]] :plugins [[lein-cljsbuild "1.1.7"]]
:plugins [[lein-cljsbuild "1.1.3"]
[lein-figwheel "0.5.4-1"]]
:main mtgcoll.core :main mtgcoll.core
@ -48,35 +49,42 @@
:clean-targets ^{:protect false} [:target-path :clean-targets ^{:protect false} [:target-path
[:cljsbuild :builds :main :compiler :output-dir] [:cljsbuild :builds :main :compiler :output-dir]
[:cljsbuild :builds :main :compiler :output-to]] [:cljsbuild :builds :main :compiler :output-to]]
:cljsbuild {:builds {:main
{:source-paths ["src"]
:figwheel true
:compiler {:main mtgcoll.client.core
:output-to "resources/public/cljs/app.js"
:output-dir "resources/public/cljs/target"
:asset-path "cljs/target"
:source-map true
:optimizations :none
:pretty-print true}}}}
:profiles {:dev {:source-paths ["env/dev/src"] :cljsbuild {:builds
:resource-paths ["env/dev/resources"] {:main
:dependencies [[pjstadig/humane-test-output "0.8.0"]] {:source-paths ["src"]
:compiler {:asset-path "cljs/target"
:main mtgcoll.client.core
:optimizations :none
:output-dir "resources/public/cljs/target"
:output-to "resources/public/cljs/app.js"
:pretty-print true
:source-map true}}}}
:profiles {:dev {:source-paths ["profiles/dev/src"]
:resource-paths ["profiles/dev/resources"]
:dependencies [[binaryage/devtools "0.9.4"]
[pjstadig/humane-test-output "0.8.0"]]
:injections [(require 'pjstadig.humane-test-output) :injections [(require 'pjstadig.humane-test-output)
(pjstadig.humane-test-output/activate!)] (pjstadig.humane-test-output/activate!)]
:cljsbuild {:builds {:main {:source-paths ["env/dev/src"]}}}} :cljsbuild {:builds
{:main
{:source-paths ["profiles/dev/src"]
:compiler {:preloads [devtools.preload]}}}}}
:uberjar {:env {} :uberjar {:source-paths ["profiles/uberjar/src"]
:aot :all :resource-paths ["profiles/uberjar/resources"]
:hooks [leiningen.cljsbuild] :aot :all
:cljsbuild {:jar true :hooks [leiningen.cljsbuild]
:figwheel false :omit-source true
:builds {:main :cljsbuild {:jar true
{:compiler ^:replace {:output-to "resources/public/cljs/app.js" :builds {:main
:optimizations :advanced {:compiler ^:replace {:optimizations :advanced
:pretty-print false}}}}}} :output-to "resources/public/cljs/app.js"
:pretty-print false}}}}}}
:aliases {"uberjar" ["do" ["clean"] ["uberjar"]] :aliases {"launch" ["run" "--" "--config" "my-config.edn"]
"uberjar" ["do" ["clean"] ["uberjar"]]
"cljsdev" ["do" ["cljsbuild" "once"] ["cljsbuild" "auto"]] "cljsdev" ["do" ["cljsbuild" "once"] ["cljsbuild" "auto"]]
"migrate" ["run" "-m" "user/migrate"] "migrate" ["run" "-m" "user/migrate" "--" "--config" "my-config.edn"]
"rollback" ["run" "-m" "user/rollback"]}) "rollback" ["run" "-m" "user/rollback" "--" "--config" "my-config.edn"]})

View file

@ -41,22 +41,24 @@
(str "Invalid options/arguments.\n" (str "Invalid options/arguments.\n"
(string/join \newline errors))) (string/join \newline errors)))
(defn- exit (defn show-help!
[status msg] [{:keys [summary] :as parsed-cli}]
(println msg) (println (->usage-string summary)))
(System/exit status))
(defn parse-cli-args (defn show-error!
[{:keys [errors] :as parsed-cli}]
(println (->error-msg errors)))
(defn parse-args
[args] [args]
(let [{:keys [options arguments errors summary] :as parsed-cli} (cli/parse-opts args cli-options) (let [{:keys [options arguments errors summary] :as parsed-cli} (cli/parse-opts args cli-options)
arguments (or (seq arguments) ["web"]) arguments (or (seq arguments) ["web"])
action (first arguments) action (first arguments)
arguments (rest arguments) arguments (rest arguments)
valid-action? (boolean (some #{action} (map first actions)))] valid-action? (boolean (some #{action} (map first actions)))]
(cond {:options options
(:help options) (exit 0 (->usage-string summary)) :action (keyword action)
(not valid-action?) (exit 1 (->usage-string summary)) :arguments arguments
errors (exit 1 (->error-msg errors))) :summary summary
{:options options :errors errors
:action (keyword action) :valid-action? valid-action?}))
:arguments arguments}))

View file

@ -1,14 +1,20 @@
(ns mtgcoll.config (ns mtgcoll.config
(:refer-clojure :exclude [get]) (:refer-clojure :exclude [get])
(:require (:require
[config.core :as cfg])) [clojure.java.io :as io]
[clojure.tools.logging :as log]
[config.core :as config]
[mount.core :as mount :refer [defstate]]))
(defonce app-config (atom {})) (defstate app-config
:start (let [config-file (get-in (mount/args) [:options :config])]
(defn load! (if (and config-file
[config-file] (.exists (io/file config-file)))
(reset! app-config (cfg/load (or config-file (System/getenv "config"))))) (do
(log/info (str "Loading app config from " config-file))
(config/load config-file {}))
(throw (Exception. "No config file specified or does not exist.")))))
(defn get (defn get
[& ks] [& ks]
(apply cfg/get @app-config ks)) (apply config/get app-config ks))

View file

@ -2,21 +2,22 @@
(:gen-class) (:gen-class)
(:require (:require
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[clojure.tools.nrepl.server :as nrepl-server]
[compojure.core :refer [routes GET POST]] [compojure.core :refer [routes GET POST]]
[compojure.route :as route] [compojure.route :as route]
[immutant.web :as immutant] [immutant.web :as immutant]
[mount.core :as mount :refer [defstate]]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]] [ring.middleware.defaults :refer [wrap-defaults site-defaults]]
[ring.middleware.format :refer [wrap-restful-format]] [ring.middleware.format :refer [wrap-restful-format]]
[ring.middleware.reload :refer [wrap-reload]]
[ring-ttl-session.core :refer [ttl-memory-store]] [ring-ttl-session.core :refer [ttl-memory-store]]
[taoensso.sente.server-adapters.immutant :refer [sente-web-server-adapter]] [taoensso.sente.server-adapters.immutant :refer [sente-web-server-adapter]]
[mtgcoll.cli :as cli]
[mtgcoll.cli :refer [parse-cli-args]]
[mtgcoll.config :as config] [mtgcoll.config :as config]
[mtgcoll.db :as db] [mtgcoll.db :as db]
[mtgcoll.models.mtgjson :refer [load-mtgjson-data!]] [mtgcoll.models.mtgjson :refer [load-mtgjson-data!]]
[mtgcoll.scrapers.image-assets :refer [download-gatherer-set-images! download-gatherer-symbol-images!]] [mtgcoll.scrapers.image-assets :refer [download-gatherer-set-images! download-gatherer-symbol-images!]]
[mtgcoll.scrapers.prices :refer [update-prices!]] [mtgcoll.scrapers.prices :refer [update-prices!]]
[mtgcoll.views.core :as views]
[mtgcoll.views.sente :as sente] [mtgcoll.views.sente :as sente]
[mtgcoll.routes.main-page :refer [main-page-routes]] [mtgcoll.routes.main-page :refer [main-page-routes]]
[mtgcoll.routes.images :refer [image-routes]] [mtgcoll.routes.images :refer [image-routes]]
@ -24,29 +25,6 @@
[mtgcoll.routes.lists :refer [list-routes]] [mtgcoll.routes.lists :refer [list-routes]]
[mtgcoll.routes.auth :refer [auth-routes]])) [mtgcoll.routes.auth :refer [auth-routes]]))
(defn init
[]
(log/info "Starting up web application ...")
(when (config/get :dev?)
(log/info "Running in development environment."))
(db/setup-config!)
(db/verify-connection)
(sente/init!)
(views/init!)
(log/info "Application init finished."))
(defn shutdown
[]
(log/info "Shutting down ...")
(views/shutdown!)
(sente/shutdown!)
(log/info "Application stopped."))
(def handler (def handler
(-> (routes (-> (routes
auth-routes auth-routes
@ -60,55 +38,71 @@
(sente/wrap-sente "/chsk") (sente/wrap-sente "/chsk")
(wrap-defaults (assoc-in site-defaults [:session :store] (ttl-memory-store (* 60 30)))))) (wrap-defaults (assoc-in site-defaults [:session :store] (ttl-memory-store (* 60 30))))))
(defn start-server! (defstate ^{:on-reload :noop} http-server
[] :start (let [options (merge
(init) {:host "localhost"
(let [options (merge :port 8080
{:port 8080 :path "/"
:host "localhost" :virtual-host nil
:path "/" :dispatch? nil}
:virtual-host nil (config/get :http))]
:dispatch? true} (log/info "Starting HTTP server: " options)
(config/get :web))] (immutant/run (if (config/get :dev?)
(if (config/get :dev?) (wrap-reload #'handler)
; why the fuck would anyone assume that if you are running in "development mode" you automatically #'handler)
; want a new browser window/tab to be opened each time the web server is started? AND not provide an options))
; option to disable this annoying-as-fuck behaviour. :stop (do
; i mean, jesus christ, it's obviously _not_ possible that i might already have a browser open that i (log/info "Stopping HTTP server")
; might prefer to keep reusing ... ! (immutant/stop http-server)))
(with-redefs [clojure.java.browse/browse-url (fn [_])]
(immutant/run-dmc #'handler options))
(immutant/run #'handler options))))
(defn stop-server! (defstate ^{:on-reload :noop} repl-server
[] :start (when-let [nrepl-config (config/get :nrepl)]
(if (immutant/stop) (let [port (or (:port nrepl-config) 4000)]
(shutdown))) (log/info "Starting nREPL server on port: " port)
(nrepl-server/start-server :port port)))
:stop (when repl-server
(log/info "Stopping nREPL server")
(nrepl-server/stop-server repl-server)))
(defn -main (defn -main
[& args] [& args]
(let [{:keys [options action arguments]} (parse-cli-args args)] (let [{:keys [options action arguments errors valid-action?] :as args} (cli/parse-args args)]
(config/load! (:config options)) (cond
(db/setup-config!) (or (:help options)
(db/verify-connection) (not valid-action?))
(case action (cli/show-help! args)
:web
errors
(do (do
(start-server!) (cli/show-error! errors)
(.addShutdownHook (Runtime/getRuntime) (Thread. ^Runnable stop-server!))) (System/exit 1))
:setup-db :else
(db/initialize-database!) (case action
:web
(do
(mount/start-with-args args)
(.addShutdownHook (Runtime/getRuntime) (Thread. ^Runnable mount/stop)))
:load-json :setup-db
(load-mtgjson-data! (first arguments)) (do
(mount/start-with-args args #'config/app-config, #'db/db)
(db/initialize-database!))
:scrape-prices :load-json
(if (seq arguments) (do
(update-prices! (first arguments)) (mount/start-with-args args #'config/app-config, #'db/db)
(update-prices!)) (load-mtgjson-data! (first arguments)))
:scrape-images :scrape-prices
(do (do
(download-gatherer-set-images!) (mount/start-with-args args #'config/app-config, #'db/db)
(download-gatherer-symbol-images!))))) (if (seq arguments)
(update-prices! (first arguments))
(update-prices!)))
:scrape-images
(do
(mount/start-with-args args #'config/app-config, #'db/db)
(download-gatherer-set-images!)
(download-gatherer-symbol-images!))))))

View file

@ -1,26 +1,27 @@
(ns mtgcoll.db (ns mtgcoll.db
(:require (:require
[clojure.java.jdbc :as sql] [clojure.java.jdbc :as sql]
[clojure.tools.logging :as log]
[mount.core :refer [defstate]]
[ragtime.jdbc :as jdbc] [ragtime.jdbc :as jdbc]
[ragtime.repl :as ragtime] [ragtime.repl :as ragtime]
[mtgcoll.config :as config])) [mtgcoll.config :as config]))
(defonce db (atom nil)) (defstate db
:start (let [db {:classname "org.postgresql.Driver"
(defn setup-config! :subprotocol "postgresql"
[] :subname (str "//" (config/get :db :host) ":" (or (config/get :db :port) 5432) "/" (config/get :db :name))
(reset! db {:classname "org.postgresql.Driver" :user (config/get :db :username)
:subprotocol "postgresql" :password (config/get :db :password)}]
:subname (str "//" (config/get :db :host) ":" (or (config/get :db :port) 5432) "/" (config/get :db :name)) (log/info "Using DB: " (:subname db))
:user (config/get :db :username) (sql/query db "select 1")
:password (config/get :db :password)})) db)
:stop (do
(defn verify-connection (log/info "Stopping DB: " (:subname db))
[] nil))
(sql/query @db "select 1"))
(defn get-ragtime-config [] (defn get-ragtime-config []
{:datastore (jdbc/sql-database @db) {:datastore (jdbc/sql-database db)
:migrations (jdbc/load-resources "migrations")}) :migrations (jdbc/load-resources "migrations")})
(defn initialize-database! (defn initialize-database!

View file

@ -6,9 +6,9 @@
(defn get-card-image-info (defn get-card-image-info
[card-id] [card-id]
(sql/query @db ["select set_code, image_name (sql/query db ["select set_code, image_name
from cards from cards
where id = ?" card-id] where id = ?" card-id]
{:result-set-fn first})) {:result-set-fn first}))
(defn get-matching-card-ids (defn get-matching-card-ids
@ -26,13 +26,13 @@
[:= :number number])) [:= :number number]))
(remove nil? x) (remove nil? x)
(vec x))}] (vec x))}]
(seq (sql/query @db (hsql/format q) {:row-fn :id})))) (seq (sql/query db (hsql/format q) {:row-fn :id}))))
(defn update-price! (defn update-price!
[card-id price-source price online?] [card-id price-source price online?]
;; written assuming postgresql server is _not_ 9.5+ (so, without access to UPSERT functionality) ;; written assuming postgresql server is _not_ 9.5+ (so, without access to UPSERT functionality)
(sql/with-db-transaction (sql/with-db-transaction
[dt @db] [dt db]
(let [num-updates (first (let [num-updates (first
(sql/execute! (sql/execute!
dt dt

View file

@ -12,7 +12,7 @@
public-only? (nil? user-id)] public-only? (nil? user-id)]
(with-view-transaction (with-view-transaction
view-system view-system
[dt @db] [dt db]
(if-not (first (jdbc/query dt ["select count(*) from lists where id = ? and is_public in (true, ?)" list-id public-only?])) (if-not (first (jdbc/query dt ["select count(*) from lists where id = ? and is_public in (true, ?)" list-id public-only?]))
(throw (new Exception (str "Not authorized to update list:" list-id))) (throw (new Exception (str "Not authorized to update list:" list-id)))
(let [num-updates (first (let [num-updates (first

View file

@ -6,7 +6,7 @@
(defn add-list! (defn add-list!
[name public? requires-qualities?] [name public? requires-qualities?]
(let [result (vexec! view-system @db (let [result (vexec! view-system db
["insert into lists ["insert into lists
(name, is_public, require_qualities) (name, is_public, require_qualities)
values values
@ -17,14 +17,14 @@
(defn remove-list! (defn remove-list!
[list-id] [list-id]
(vexec! view-system @db (vexec! view-system db
["delete from lists ["delete from lists
where id = ?" where id = ?"
(int list-id)])) (int list-id)]))
(defn update-list-name! (defn update-list-name!
[list-id name] [list-id name]
(vexec! view-system @db (vexec! view-system db
["update lists ["update lists
set name = ? set name = ?
where id = ?" where id = ?"
@ -32,7 +32,7 @@
(defn update-list-note! (defn update-list-note!
[list-id note] [list-id note]
(vexec! view-system @db (vexec! view-system db
["update lists ["update lists
set notes = ? set notes = ?
where id = ?" where id = ?"
@ -40,7 +40,7 @@
(defn update-list-visibility! (defn update-list-visibility!
[list-id public?] [list-id public?]
(vexec! view-system @db (vexec! view-system db
["update lists ["update lists
set is_public = ? set is_public = ?
where id = ?" where id = ?"

View file

@ -26,7 +26,7 @@
(doseq [[_ m] json-data] (doseq [[_ m] json-data]
(try (try
(sql/insert! (sql/insert!
@db db
:sets :sets
{:code (:code m) {:code (:code m)
:name (:name m) :name (:name m)
@ -72,7 +72,7 @@
variations (:variations card)] variations (:variations card)]
(try (try
(sql/with-db-transaction (sql/with-db-transaction
[db-con @db] [db-con db]
(sql/insert! (sql/insert!
db-con db-con
:cards :cards
@ -127,7 +127,7 @@
[] []
(println "Filling in card IDs for card variations") (println "Filling in card IDs for card variations")
(sql/execute! (sql/execute!
@db db
["update card_variations ["update card_variations
set variant_card_id = (select c.id set variant_card_id = (select c.id
from cards c from cards c

View file

@ -5,4 +5,4 @@
(defn get-set-codes (defn get-set-codes
[] []
(seq (sql/query @db ["select code, gatherer_code from sets order by code"]))) (seq (sql/query db ["select code, gatherer_code from sets order by code"])))

View file

@ -30,7 +30,7 @@
(defn- get-gatherer-set-codes (defn- get-gatherer-set-codes
[] []
(sql/query @db ["select code, gatherer_code from sets order by code"])) (sql/query db ["select code, gatherer_code from sets order by code"]))
(defn- download-set-image (defn- download-set-image
[size {:keys [code gatherer_code]}] [size {:keys [code gatherer_code]}]

View file

@ -1,18 +1,15 @@
(ns mtgcoll.scrapers.prices (ns mtgcoll.scrapers.prices
(:require (:require
[views.core :as views]
[views.sql.core :refer [hint-type]] [views.sql.core :refer [hint-type]]
[mtgcoll.views.core :refer [view-system]] [mtgcoll.views.core :refer [view-system]]
[mtgcoll.models.cards :as cards] [mtgcoll.models.cards :as cards]
[mtgcoll.models.sets :as sets] [mtgcoll.models.sets :as sets]
[mtgcoll.scrapers.protocols :refer [scrape]] [mtgcoll.scrapers.protocols :refer [scrape]]
[mtgcoll.scrapers.registered :refer [price-scrapers]] [mtgcoll.scrapers.registered :refer [price-scrapers]]))
[mtgcoll.db :as db]))
(defn update-prices! (defn update-prices!
([source] ([source]
(println "Updating" source "card prices.") (println "Updating" source "card prices.")
(db/verify-connection)
(if-let [price-scraper (get price-scrapers source)] (if-let [price-scraper (get price-scrapers source)]
(do (do
(doseq [{:keys [code gatherer_code] :as set} (sets/get-set-codes)] (doseq [{:keys [code gatherer_code] :as set} (sets/get-set-codes)]

View file

@ -1,10 +1,11 @@
(ns mtgcoll.views.core (ns mtgcoll.views.core
(:require (:require
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[views.reagent.sente.server :as vr]
[views.core :as views]
[views.sql.view :refer [view]]
[honeysql.format :as fmt] [honeysql.format :as fmt]
[mount.core :refer [defstate]]
[views.core :as views]
[views.reagent.sente.server :as vr]
[views.sql.view :refer [view]]
[mtgcoll.db :refer [db]] [mtgcoll.db :refer [db]]
[mtgcoll.auth :as auth] [mtgcoll.auth :as auth]
[mtgcoll.views.sente :refer [sente-socket]] [mtgcoll.views.sente :refer [sente-socket]]
@ -15,11 +16,9 @@
[mtgcoll.views.functions.prices :as prices] [mtgcoll.views.functions.prices :as prices]
[mtgcoll.views.functions.statistics :as statistics])) [mtgcoll.views.functions.statistics :as statistics]))
(defonce view-system (atom {}))
(defn get-db (defn get-db
[_] [_]
@db) db)
(def views (def views
[(view :card-info get-db #'cards/card-info {:result-set-fn first}) [(view :card-info get-db #'cards/card-info {:result-set-fn first})
@ -94,17 +93,15 @@
user-profile (get-in request [:session :user])] user-profile (get-in request [:session :user])]
(log/warn "Unauthorized view subscription attempt: " view-id ", " parameters " - user profile: " user-profile))) (log/warn "Unauthorized view subscription attempt: " view-id ", " parameters " - user profile: " user-profile)))
(defn init! (defstate view-system
[] :start (let [vs (atom nil)]
(vr/init! view-system @sente-socket (vr/init! vs sente-socket
{:views views {:views views
:use-default-sente-router? true :use-default-sente-router? true
:auth-fn view-auth-fn :auth-fn view-auth-fn
:on-unauth-fn view-on-unauth-fn})) :on-unauth-fn view-on-unauth-fn})
vs)
(defn shutdown! :stop (views/shutdown! view-system))
[]
(views/shutdown! view-system))
(defmethod fmt/fn-handler "ilike" (defmethod fmt/fn-handler "ilike"
[_ col qstr] [_ col qstr]

View file

@ -1,9 +1,15 @@
(ns mtgcoll.views.sente (ns mtgcoll.views.sente
(:require (:require
[mount.core :refer [defstate]]
[taoensso.sente :as sente] [taoensso.sente :as sente]
[taoensso.sente.server-adapters.immutant :refer [sente-web-server-adapter]])) [taoensso.sente.server-adapters.immutant :refer [sente-web-server-adapter]]))
(defonce sente-socket (atom {})) (defstate sente-socket
:start (sente/make-channel-socket!
sente-web-server-adapter
{:user-id-fn (fn [request] (get-in request [:params :client-id]))
:handshake-data-fn (fn [request]
{:user (get-in request [:session :user])})}))
(defn wrap-sente (defn wrap-sente
[handler uri] [handler uri]
@ -11,19 +17,6 @@
(let [uri-match? (.startsWith (str (:uri request)) uri) (let [uri-match? (.startsWith (str (:uri request)) uri)
method (:request-method request)] method (:request-method request)]
(cond (cond
(and uri-match? (= :get method)) ((:ajax-get-or-ws-handshake-fn @sente-socket) request) (and uri-match? (= :get method)) ((:ajax-get-or-ws-handshake-fn sente-socket) request)
(and uri-match? (= :post method)) ((:ajax-post-fn @sente-socket) request) (and uri-match? (= :post method)) ((:ajax-post-fn sente-socket) request)
:else (handler request))))) :else (handler request)))))
(defn init!
[]
(reset! sente-socket
(sente/make-channel-socket!
sente-web-server-adapter
{:user-id-fn (fn [request] (get-in request [:params :client-id]))
:handshake-data-fn (fn [request]
{:user (get-in request [:session :user])})})))
(defn shutdown!
[]
(reset! sente-socket {}))