Implement recent files (back and front).

This commit is contained in:
Andrey Antukh 2019-12-11 12:15:06 +01:00
parent 4dad6bef40
commit 44e120d382
6 changed files with 72 additions and 42 deletions

View file

@ -7,9 +7,11 @@
(ns uxbox.services.queries.project-files
(:require
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[promesa.core :as p]
[uxbox.db :as db]
[uxbox.services.queries :as sq]
[uxbox.services.util :as su]
[uxbox.util.blob :as blob]
[uxbox.util.spec :as us]))
@ -22,7 +24,7 @@
(s/def ::project-id ::us/uuid)
(s/def ::user ::us/uuid)
(def ^:private sql:generic-project-files
(su/defsql sql:generic-project-files
"select pf.*,
array_agg(pp.id) as pages
from project_files as pf
@ -31,21 +33,42 @@
left join project_pages as pp on (pf.id = pp.file_id)
where pu.user_id = $1
and pu.can_edit = true
group by pf.id
order by pf.created_at asc")
group by pf.id")
;; --- Query: Project Files
(def ^:private sql:project-files
(str "with files as (" sql:generic-project-files ")"
" select * from files where project_id = $2"))
(declare retrieve-recent-files)
(declare retrieve-project-files)
(s/def ::project-files
(s/keys :req-un [::user ::project-id]))
(s/keys :req-un [::user]
:opt-un [::project-id]))
(sq/defquery ::project-files
[{:keys [user project-id] :as params}]
(-> (db/query db/pool [sql:project-files user project-id])
[{:keys [project-id] :as params}]
(if (nil? project-id)
(retrieve-recent-files db/pool params)
(retrieve-project-files db/pool params)))
(def ^:private sql:project-files
(str "with files as (" sql:generic-project-files ")"
" select * from files where project_id = $2"
" order by created_at asc"))
(defn retrieve-project-files
[conn {:keys [user project-id]}]
(-> (db/query conn [sql:project-files user project-id])
(p/then' (partial mapv decode-row))))
(su/defsql sql:recent-files
"with files as (~{sql:generic-project-files})
select * from files
order by modified_at desc
limit $2")
(defn retrieve-recent-files
[conn {:keys [user]}]
(-> (db/query conn [sql:recent-files user 20])
(p/then' (partial mapv decode-row))))
;; --- Query: Project File (By ID)

View file

@ -10,6 +10,7 @@
[promesa.core :as p]
[uxbox.db :as db]
[uxbox.services.queries :as sq]
[uxbox.services.util :as su]
[uxbox.util.blob :as blob]
[uxbox.util.spec :as us]))
@ -24,33 +25,20 @@
;; --- Query: Projects
;; (def ^:private projects-sql
;; "select distinct on (p.id, p.created_at)
;; p.*,
;; array_agg(pg.id) over (
;; partition by p.id
;; order by pg.created_at
;; range between unbounded preceding and unbounded following
;; ) as pages
;; from projects as p
;; left join pages as pg
;; on (pg.project_id = p.id)
;; where p.user_id = $1
;; order by p.created_at asc")
(def ^:private projects-sql
(su/defsql sql:projects
"select p.*
from project_users as pu
inner join projects as p on (p.id = pu.project_id)
where pu.can_edit = true
and pu.user_id = $1;")
and pu.user_id = $1
order by p.created_at asc")
(s/def ::projects
(s/keys :req-un [::user]))
(sq/defquery ::projects
[{:keys [user] :as params}]
(-> (db/query db/pool [projects-sql user])
(-> (db/query db/pool [sql:projects user])
(p/then' (partial mapv decode-row))))
;; --- Helpers

View file

@ -7,6 +7,7 @@
(ns uxbox.services.util
(:require
[clojure.tools.logging :as log]
[cuerdas.core :as str]
[vertx.core :as vc]
[uxbox.core :refer [system]]
[uxbox.util.uuid :as uuid]
@ -24,6 +25,10 @@
;; (log/info "service" type "processed in" elapsed)
;; data))})
(defmacro defsql
[sym str]
`(def ~sym (str/istr ~str)))
(defn raise-not-found-if-nil
[v]
(if (nil? v)