Skip to content

Instantly share code, notes, and snippets.

@shegeley
Created December 5, 2024 18:23
Show Gist options
  • Save shegeley/a9d819bfbc27084e28ffeb65b44695da to your computer and use it in GitHub Desktop.
Save shegeley/a9d819bfbc27084e28ffeb65b44695da to your computer and use it in GitHub Desktop.
clojurescript: sequelize, expresss, cljs.core.async sample code
(ns backend.core
(:require ["sequelize" :refer (Sequelize DataTypes)]
[cljs.core.async :refer [go]]
[cljs.core.async.interop :refer-macros [<p!]]
["express" :as express]))
(def port 1337)
(defn env [x & [default]]
(or (aget (.. js/process -env) x) default))
(def db {:user (env "POSTGRES_USER" "user")
:database (env "POSTGRES_DB" "database")
:password (env "POSTGRES_PASSWORD" "password")
:host "localhost"
:port (env "POSTGRES_PORT" "5432")})
(defn ->json [x]
(.stringify js/JSON x))
(def uri (str "postgres://" (db :user) ":" (db :password) "@" (db :host) ":" (db :port) "/" (db :database)))
(def sqlz (new Sequelize uri))
(def User
(. sqlz define "User"
(clj->js {:amount
{:type (. DataTypes REAL)
:allowNull false
:defaultValue 10000
:validate {:min 0}}})))
(let [options (clj->js {:force true})]
(go
(<p! (. sqlz sync options))
(<p! (. User sync options))
(<p! (. User create (clj->js {})))))
(def app (express))
(. app use (express/json))
(defn handler [req res]
(let [id (.. req -params -id)
body (.. req -body)]
(go (try
(let [user (<p! (. User findByPk (js/Number id)))
user* (<p! (. user update body))]
(<p! (. res send (->json user*))))
(catch js/Error e (.log js/console (ex-cause e)))))))
(. app get "*" (fn [_ res] (. res send "kek")))
(. app post "/user/update/:id" handler)
(defn ^:export main! [] (. app listen port))
{:deps true
:nrepl {:port 9000}
:builds
{:backend
{:target :node-script
:output-to "out/backend/main.js"
:output-dir "out/backend"
:compiler-options {:output-feature-set :es6}
:main backend.core/main!}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment