mirror of
https://github.com/penpot/penpot.git
synced 2025-05-31 21:31:38 +02:00
✨ Implement recent files (back and front).
This commit is contained in:
parent
4dad6bef40
commit
44e120d382
6 changed files with 72 additions and 42 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue