Improve pages fetching on dashboard.

This commit is contained in:
Andrey Antukh 2019-11-27 19:54:25 +01:00
parent 426677935e
commit 761a3c102f
4 changed files with 14 additions and 14 deletions

View file

@ -59,8 +59,8 @@
;; --- Pages creation ;; --- Pages creation
(def create-page-sql (def create-page-sql
"insert into pages (id, user_id, project_id, name, data, metadata) "insert into pages (id, user_id, project_id, name, ordering, data, metadata)
values ($1, $2, $3, $4, $5, $6) values ($1, $2, $3, $4, $5, $6, $7)
returning *;") returning *;")
(defn create-page (defn create-page
@ -79,6 +79,7 @@
(mk-uuid "user" uid) (mk-uuid "user" uid)
(mk-uuid "project" pjid uid) (mk-uuid "project" pjid uid)
(str "page " paid) (str "page " paid)
paid
(blob/encode data) (blob/encode data)
(blob/encode {})]))) (blob/encode {})])))

View file

@ -36,15 +36,19 @@
[{:keys [user] :as params}] [{:keys [user] :as params}]
(let [sql "select distinct on (p.id, p.created_at) (let [sql "select distinct on (p.id, p.created_at)
p.*, p.*,
first_value(pg.id) array_agg(pg.id) over (
over (partition by p.id order by pg.created_at) partition by p.id
as ref_page_id order by pg.created_at
range between unbounded preceding and unbounded following
) as pages
from projects as p from projects as p
right join pages as pg right join pages as pg
on (pg.project_id = p.id) on (pg.project_id = p.id)
where p.user_id = $1 where p.user_id = $1
order by p.created_at asc"] order by p.created_at asc"]
(db/query db/pool [sql user]))) (-> (db/query db/pool [sql user])
(p/then (fn [rows]
(mapv #(update % :pages vec) rows))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Mutations ;; Mutations

View file

@ -75,11 +75,6 @@
(update [_ state] (update [_ state]
(reduce assoc-project state projects)))) (reduce assoc-project state projects))))
;; ptk/WatchEvent
;; (watch [_ state stream]
;; (->> (rx/from-coll (map :id projects))
;; (rx/map udp/fetch-pages))))
(defn projects-fetched? (defn projects-fetched?
[v] [v]
(= ::projects-fetched (ptk/type v))) (= ::projects-fetched (ptk/type v)))
@ -177,8 +172,8 @@
(ptk/reify ::go-to (ptk/reify ::go-to
ptk/WatchEvent ptk/WatchEvent
(watch [_ state stream] (watch [_ state stream]
(let [page-id (get-in state [:projects id :ref-page-id])] (let [page-ids (get-in state [:projects id :pages])]
(let [params {:project id :page page-id}] (let [params {:project id :page (first page-ids)}]
(rx/of (rt/nav :workspace/page params))))))) (rx/of (rt/nav :workspace/page params)))))))

View file

@ -80,7 +80,7 @@
;; Activate loaded if page is not fetched. ;; Activate loaded if page is not fetched.
(when-not page (reset! st/loader true)) (when-not page (reset! st/loader true))
(rx/merge (rx/merge
;; TODO: the `fetch-pages` should fetch a limited set of attrs ;; TODO: the `fetch-pages` should fetch a limited set of attrs?
(rx/of (udp/fetch-page page-id)) (rx/of (udp/fetch-page page-id))
(rx/of (udp/fetch-pages project-id)) (rx/of (udp/fetch-pages project-id))
(->> stream (->> stream