Sort posts by creation date, most recent first

This commit is contained in:
arne 2025-11-18 20:20:10 +01:00
commit 54d35961d1
2 changed files with 26 additions and 11 deletions

View file

@ -349,7 +349,7 @@
refresh-id (js/Date.now)] refresh-id (js/Date.now)]
(swap! state update-in [:section/posts :loading] conj refresh-id) (swap! state update-in [:section/posts :loading] conj refresh-id)
(-> (js/Promise.all #js [(db/count! ::db/posts) (-> (js/Promise.all #js [(db/count! ::db/posts)
(-> (db/open-cursor! ::db/posts db/all "prev") (-> (db/open-cursor! ::db/posts "created_at" db/all "prev")
(db/transduce-cursor xform))]) (db/transduce-cursor xform))])
(.then (fn [[total displayed-posts]] (.then (fn [[total displayed-posts]]
(swap! state update :section/posts #(-> (assoc % :total total) (swap! state update :section/posts #(-> (assoc % :total total)
@ -407,12 +407,15 @@
;; database ;; database
(def db-version 1) (def db-version 2)
(def migrations (def migrations
{1 (fn migration-0001 [db] {1 (fn migration-0001 [db _]
(db/create-object-store! db ::db/application {:keyPath "id"}) (db/create-object-store! db ::db/application {:keyPath "id"})
(db/create-object-store! db ::db/posts {:keyPath "id"}))}) (db/create-object-store! db ::db/posts {:keyPath "id"}))
2 (fn migration-0002 [_ txn]
(-> (db/open-store txn ::db/posts "readwrite")
(db/create-index! "created_at" "created_at" {:unique false})))})
;; go go go ;; go go go

View file

@ -21,25 +21,34 @@
(.addEventListener "upgradeneeded" (.addEventListener "upgradeneeded"
(fn [ev] (fn [ev]
(let [db (.-result request) (let [db (.-result request)
old-version (.-oldVersion ev)] old-version (.-oldVersion ev)
txn (-> ev .-target .-transaction)]
(js/console.log ::upgradeneeded ev db) (js/console.log ::upgradeneeded ev db)
(doseq [version (range (inc old-version) (inc db-version)) (doseq [version (range (inc old-version) (inc db-version))
:let [migration (migrations version)]] :let [migration (migrations version)]]
(migration db))))) (migration db txn)))))
; we don't add a listener for "blocked" events because we handle "versionchange" above ; we don't add a listener for "blocked" events because we handle "versionchange" above
(.addEventListener "error" (fn [ev] (reject (.-result request) ev)))))))) (.addEventListener "error" (fn [ev] (reject (.-result request) ev))))))))
(defn open-store (defn open-store
([db store-id] ([db-or-txn store-id]
(open-store db store-id "readonly")) (open-store db-or-txn store-id "readonly"))
([db store-id permissions] ([db-or-txn store-id permissions]
(let [store-id (str store-id) ; simplifies using keywords as store identifiers (let [store-id (str store-id) ; simplifies using keywords as store identifiers
txn (.transaction db store-id permissions)] txn (if (instance? js/IDBTransaction db-or-txn)
db-or-txn
(.transaction db-or-txn store-id permissions))]
(.objectStore txn store-id)))) (.objectStore txn store-id))))
(defn create-object-store! [db store-id key-opts] (defn create-object-store! [db store-id key-opts]
(.createObjectStore db (str store-id) (clj->js key-opts))) (.createObjectStore db (str store-id) (clj->js key-opts)))
(defn create-index!
([store idx-name fields]
(create-index! store idx-name fields {}))
([store idx-name fields opts]
(.createIndex store (str idx-name) (clj->js fields) (clj->js opts))))
(defn- promisify [request] (defn- promisify [request]
(js/Promise. (fn [resolve reject] (js/Promise. (fn [resolve reject]
(doto request (doto request
@ -70,7 +79,10 @@
([store-id key-range] (open-cursor! store-id key-range "next")) ([store-id key-range] (open-cursor! store-id key-range "next"))
([store-id key-range direction] ([store-id key-range direction]
(let [store (open-store @+db+ store-id)] (let [store (open-store @+db+ store-id)]
(.openCursor store key-range direction)))) (.openCursor store key-range direction)))
([store-id idx-name key-range direction]
(let [store (open-store @+db+ store-id)]
(.openCursor (.index store (str idx-name)) key-range direction))))
#_(defn logging [f] #_(defn logging [f]
(let [n (volatile! 0)] (let [n (volatile! 0)]