mirror of
https://github.com/penpot/penpot.git
synced 2025-06-06 21:41:37 +02:00
♻️ Move teams queries and mutations to commands
This commit is contained in:
parent
be5053ce22
commit
7a9172560d
23 changed files with 993 additions and 653 deletions
|
@ -9,8 +9,8 @@
|
|||
[app.db :as db]
|
||||
[app.rpc.commands.comments :as cmd.comments]
|
||||
[app.rpc.commands.files :as cmd.files]
|
||||
[app.rpc.commands.teams :as teams]
|
||||
[app.rpc.doc :as-alias doc]
|
||||
[app.rpc.queries.teams :as teams]
|
||||
[app.util.services :as sv]
|
||||
[clojure.spec.alpha :as s]))
|
||||
|
||||
|
|
|
@ -8,38 +8,38 @@
|
|||
(:require
|
||||
[app.common.spec :as us]
|
||||
[app.db :as db]
|
||||
[app.rpc.commands.files :as cmd.files]
|
||||
[app.rpc.commands.search :as cmd.search]
|
||||
[app.rpc.commands.files :as files]
|
||||
[app.rpc.commands.search :as search]
|
||||
[app.rpc.commands.teams :as teams]
|
||||
[app.rpc.doc :as-alias doc]
|
||||
[app.rpc.helpers :as rph]
|
||||
[app.rpc.queries.projects :as projects]
|
||||
[app.rpc.queries.teams :as teams]
|
||||
[app.util.services :as sv]
|
||||
[clojure.spec.alpha :as s]))
|
||||
|
||||
;; --- Query: Project Files
|
||||
|
||||
(s/def ::project-files ::cmd.files/get-project-files)
|
||||
(s/def ::project-files ::files/get-project-files)
|
||||
|
||||
(sv/defmethod ::project-files
|
||||
{::doc/added "1.1"
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id project-id] :as params}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(projects/check-read-permissions! conn profile-id project-id)
|
||||
(cmd.files/get-project-files conn project-id)))
|
||||
(files/get-project-files conn project-id)))
|
||||
|
||||
;; --- Query: File (By ID)
|
||||
|
||||
(s/def ::components-v2 ::us/boolean)
|
||||
(s/def ::file
|
||||
(s/and ::cmd.files/get-file
|
||||
(s/and ::files/get-file
|
||||
(s/keys :opt-un [::components-v2])))
|
||||
|
||||
(defn get-file
|
||||
[conn id features]
|
||||
(let [file (cmd.files/get-file conn id features)
|
||||
thumbs (cmd.files/get-object-thumbnails conn id)]
|
||||
(let [file (files/get-file conn id features)
|
||||
thumbs (files/get-object-thumbnails conn id)]
|
||||
(assoc file :thumbnails thumbs)))
|
||||
|
||||
(sv/defmethod ::file
|
||||
|
@ -48,19 +48,19 @@
|
|||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id id features components-v2] :as params}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(let [perms (cmd.files/get-permissions pool profile-id id)
|
||||
(let [perms (files/get-permissions pool profile-id id)
|
||||
;; BACKWARD COMPATIBILTY with the components-v2 parameter
|
||||
features (cond-> (or features #{})
|
||||
components-v2 (conj "components/v2"))]
|
||||
|
||||
(cmd.files/check-read-permissions! perms)
|
||||
(files/check-read-permissions! perms)
|
||||
(-> (get-file conn id features)
|
||||
(assoc :permissions perms)))))
|
||||
|
||||
;; --- QUERY: page
|
||||
|
||||
(s/def ::page
|
||||
(s/and ::cmd.files/get-page
|
||||
(s/and ::files/get-page
|
||||
(s/keys :opt-un [::components-v2])))
|
||||
|
||||
(sv/defmethod ::page
|
||||
|
@ -77,18 +77,18 @@
|
|||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id file-id features components-v2] :as params}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(cmd.files/check-read-permissions! conn profile-id file-id)
|
||||
(files/check-read-permissions! conn profile-id file-id)
|
||||
(let [;; BACKWARD COMPATIBILTY with the components-v2 parameter
|
||||
features (cond-> (or features #{})
|
||||
components-v2 (conj "components/v2"))
|
||||
params (assoc params :features features)]
|
||||
|
||||
(cmd.files/get-page conn params))))
|
||||
(files/get-page conn params))))
|
||||
|
||||
;; --- QUERY: file-data-for-thumbnail
|
||||
|
||||
(s/def ::file-data-for-thumbnail
|
||||
(s/and ::cmd.files/get-file-data-for-thumbnail
|
||||
(s/and ::files/get-file-data-for-thumbnail
|
||||
(s/keys :opt-un [::components-v2])))
|
||||
|
||||
(sv/defmethod ::file-data-for-thumbnail
|
||||
|
@ -98,18 +98,18 @@
|
|||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id file-id features components-v2] :as props}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(cmd.files/check-read-permissions! conn profile-id file-id)
|
||||
(files/check-read-permissions! conn profile-id file-id)
|
||||
(let [;; BACKWARD COMPATIBILTY with the components-v2 parameter
|
||||
features (cond-> (or features #{})
|
||||
components-v2 (conj "components/v2"))
|
||||
file (cmd.files/get-file conn file-id features)]
|
||||
file (files/get-file conn file-id features)]
|
||||
{:file-id file-id
|
||||
:revn (:revn file)
|
||||
:page (cmd.files/get-file-data-for-thumbnail conn file)})))
|
||||
:page (files/get-file-data-for-thumbnail conn file)})))
|
||||
|
||||
;; --- Query: Shared Library Files
|
||||
|
||||
(s/def ::team-shared-files ::cmd.files/get-team-shared-files)
|
||||
(s/def ::team-shared-files ::files/get-team-shared-files)
|
||||
|
||||
(sv/defmethod ::team-shared-files
|
||||
{::doc/added "1.3"
|
||||
|
@ -117,37 +117,37 @@
|
|||
[{:keys [pool] :as cfg} {:keys [profile-id team-id] :as params}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.files/get-team-shared-files conn params)))
|
||||
(files/get-team-shared-files conn params)))
|
||||
|
||||
|
||||
;; --- Query: File Libraries used by a File
|
||||
|
||||
(s/def ::file-libraries ::cmd.files/get-file-libraries)
|
||||
(s/def ::file-libraries ::files/get-file-libraries)
|
||||
|
||||
(sv/defmethod ::file-libraries
|
||||
{::doc/added "1.3"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id file-id features] :as params}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(cmd.files/check-read-permissions! conn profile-id file-id)
|
||||
(cmd.files/get-file-libraries conn file-id features)))
|
||||
(files/check-read-permissions! conn profile-id file-id)
|
||||
(files/get-file-libraries conn file-id features)))
|
||||
|
||||
|
||||
;; --- Query: Files that use this File library
|
||||
|
||||
(s/def ::library-using-files ::cmd.files/get-library-file-references)
|
||||
(s/def ::library-using-files ::files/get-library-file-references)
|
||||
|
||||
(sv/defmethod ::library-using-files
|
||||
{::doc/added "1.13"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id file-id] :as params}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(cmd.files/check-read-permissions! conn profile-id file-id)
|
||||
(cmd.files/get-library-file-references conn file-id)))
|
||||
(files/check-read-permissions! conn profile-id file-id)
|
||||
(files/get-library-file-references conn file-id)))
|
||||
|
||||
;; --- QUERY: team-recent-files
|
||||
|
||||
(s/def ::team-recent-files ::cmd.files/get-team-recent-files)
|
||||
(s/def ::team-recent-files ::files/get-team-recent-files)
|
||||
|
||||
(sv/defmethod ::team-recent-files
|
||||
{::doc/added "1.0"
|
||||
|
@ -155,30 +155,30 @@
|
|||
[{:keys [pool] :as cfg} {:keys [profile-id team-id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.files/get-team-recent-files conn team-id)))
|
||||
(files/get-team-recent-files conn team-id)))
|
||||
|
||||
|
||||
;; --- QUERY: get file thumbnail
|
||||
|
||||
(s/def ::file-thumbnail ::cmd.files/get-file-thumbnail)
|
||||
(s/def ::file-thumbnail ::files/get-file-thumbnail)
|
||||
|
||||
(sv/defmethod ::file-thumbnail
|
||||
{::doc/added "1.13"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool]} {:keys [profile-id file-id revn]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(cmd.files/check-read-permissions! conn profile-id file-id)
|
||||
(-> (cmd.files/get-file-thumbnail conn file-id revn)
|
||||
(rph/with-http-cache cmd.files/long-cache-duration))))
|
||||
(files/check-read-permissions! conn profile-id file-id)
|
||||
(-> (files/get-file-thumbnail conn file-id revn)
|
||||
(rph/with-http-cache files/long-cache-duration))))
|
||||
|
||||
|
||||
;; --- QUERY: search files
|
||||
|
||||
(s/def ::search-files ::cmd.search/search-files)
|
||||
(s/def ::search-files ::search/search-files)
|
||||
|
||||
(sv/defmethod ::search-files
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool]} {:keys [search-term] :as params}]
|
||||
(when search-term
|
||||
(cmd.search/search-files pool params)))
|
||||
(search/search-files pool params)))
|
||||
|
|
|
@ -9,13 +9,14 @@
|
|||
[app.common.spec :as us]
|
||||
[app.db :as db]
|
||||
[app.rpc.commands.files :as files]
|
||||
[app.rpc.commands.teams :as teams]
|
||||
[app.rpc.queries.projects :as projects]
|
||||
[app.rpc.queries.teams :as teams]
|
||||
[app.util.services :as sv]
|
||||
[clojure.spec.alpha :as s]))
|
||||
|
||||
;; --- Query: Team Font Variants
|
||||
|
||||
;; FIXME: PLEASE RIGHT NOW
|
||||
;; TODO: deprecated, should be removed on 1.7.x
|
||||
|
||||
(s/def ::team-id ::us/uuid)
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
(:require
|
||||
[app.common.spec :as us]
|
||||
[app.db :as db]
|
||||
[app.rpc.commands.teams :as teams]
|
||||
[app.rpc.permissions :as perms]
|
||||
[app.rpc.queries.teams :as teams]
|
||||
[app.util.services :as sv]
|
||||
[clojure.spec.alpha :as s]))
|
||||
|
||||
|
|
|
@ -6,244 +6,82 @@
|
|||
|
||||
(ns app.rpc.queries.teams
|
||||
(:require
|
||||
[app.common.exceptions :as ex]
|
||||
[app.common.spec :as us]
|
||||
[app.db :as db]
|
||||
[app.rpc.permissions :as perms]
|
||||
[app.rpc.queries.profile :as profile]
|
||||
[app.rpc.commands.teams :as cmd.teams]
|
||||
[app.rpc.doc :as-alias doc]
|
||||
[app.util.services :as sv]
|
||||
[clojure.spec.alpha :as s]))
|
||||
|
||||
;; --- Team Edition Permissions
|
||||
|
||||
(def ^:private sql:team-permissions
|
||||
"select tpr.is_owner,
|
||||
tpr.is_admin,
|
||||
tpr.can_edit
|
||||
from team_profile_rel as tpr
|
||||
join team as t on (t.id = tpr.team_id)
|
||||
where tpr.profile_id = ?
|
||||
and tpr.team_id = ?
|
||||
and t.deleted_at is null")
|
||||
|
||||
(defn get-permissions
|
||||
[conn profile-id team-id]
|
||||
(let [rows (db/exec! conn [sql:team-permissions profile-id team-id])
|
||||
is-owner (boolean (some :is-owner rows))
|
||||
is-admin (boolean (some :is-admin rows))
|
||||
can-edit (boolean (some :can-edit rows))]
|
||||
(when (seq rows)
|
||||
{:is-owner is-owner
|
||||
:is-admin (or is-owner is-admin)
|
||||
:can-edit (or is-owner is-admin can-edit)
|
||||
:can-read true})))
|
||||
|
||||
(def has-edit-permissions?
|
||||
(perms/make-edition-predicate-fn get-permissions))
|
||||
|
||||
(def has-read-permissions?
|
||||
(perms/make-read-predicate-fn get-permissions))
|
||||
|
||||
(def check-edition-permissions!
|
||||
(perms/make-check-fn has-edit-permissions?))
|
||||
|
||||
(def check-read-permissions!
|
||||
(perms/make-check-fn has-read-permissions?))
|
||||
|
||||
;; --- Query: Teams
|
||||
|
||||
(declare retrieve-teams)
|
||||
|
||||
(s/def ::profile-id ::us/uuid)
|
||||
(s/def ::teams
|
||||
(s/keys :req-un [::profile-id]))
|
||||
(s/def ::teams ::cmd.teams/get-teams)
|
||||
|
||||
(sv/defmethod ::teams
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(retrieve-teams conn profile-id)))
|
||||
|
||||
(def sql:teams
|
||||
"select t.*,
|
||||
tp.is_owner,
|
||||
tp.is_admin,
|
||||
tp.can_edit,
|
||||
(t.id = ?) as is_default
|
||||
from team_profile_rel as tp
|
||||
join team as t on (t.id = tp.team_id)
|
||||
where t.deleted_at is null
|
||||
and tp.profile_id = ?
|
||||
order by tp.created_at asc")
|
||||
|
||||
(defn process-permissions
|
||||
[team]
|
||||
(let [is-owner (:is-owner team)
|
||||
is-admin (:is-admin team)
|
||||
can-edit (:can-edit team)
|
||||
permissions {:type :membership
|
||||
:is-owner is-owner
|
||||
:is-admin (or is-owner is-admin)
|
||||
:can-edit (or is-owner is-admin can-edit)}]
|
||||
(-> team
|
||||
(dissoc :is-owner :is-admin :can-edit)
|
||||
(assoc :permissions permissions))))
|
||||
|
||||
(defn retrieve-teams
|
||||
[conn profile-id]
|
||||
(let [defaults (profile/retrieve-additional-data conn profile-id)]
|
||||
(->> (db/exec! conn [sql:teams (:default-team-id defaults) profile-id])
|
||||
(mapv process-permissions))))
|
||||
(cmd.teams/retrieve-teams conn profile-id)))
|
||||
|
||||
;; --- Query: Team (by ID)
|
||||
|
||||
(declare retrieve-team)
|
||||
|
||||
(s/def ::id ::us/uuid)
|
||||
(s/def ::team
|
||||
(s/keys :req-un [::profile-id ::id]))
|
||||
(s/def ::team ::cmd.teams/get-team)
|
||||
|
||||
(sv/defmethod ::team
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(retrieve-team conn profile-id id)))
|
||||
|
||||
(defn retrieve-team
|
||||
[conn profile-id team-id]
|
||||
(let [defaults (profile/retrieve-additional-data conn profile-id)
|
||||
sql (str "WITH teams AS (" sql:teams ") SELECT * FROM teams WHERE id=?")
|
||||
result (db/exec-one! conn [sql (:default-team-id defaults) profile-id team-id])]
|
||||
(when-not result
|
||||
(ex/raise :type :not-found
|
||||
:code :team-does-not-exist))
|
||||
(process-permissions result)))
|
||||
|
||||
(cmd.teams/retrieve-team conn profile-id id)))
|
||||
|
||||
;; --- Query: Team Members
|
||||
|
||||
(declare retrieve-team-members)
|
||||
|
||||
(s/def ::team-id ::us/uuid)
|
||||
(s/def ::team-members
|
||||
(s/keys :req-un [::profile-id ::team-id]))
|
||||
(s/def ::team-members ::cmd.teams/get-team-members)
|
||||
|
||||
(sv/defmethod ::team-members
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id team-id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(check-read-permissions! conn profile-id team-id)
|
||||
(retrieve-team-members conn team-id)))
|
||||
|
||||
(def sql:team-members
|
||||
"select tp.*,
|
||||
p.id,
|
||||
p.email,
|
||||
p.fullname as name,
|
||||
p.fullname as fullname,
|
||||
p.photo_id,
|
||||
p.is_active
|
||||
from team_profile_rel as tp
|
||||
join profile as p on (p.id = tp.profile_id)
|
||||
where tp.team_id = ?")
|
||||
|
||||
(defn retrieve-team-members
|
||||
[conn team-id]
|
||||
(db/exec! conn [sql:team-members team-id]))
|
||||
|
||||
(cmd.teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.teams/retrieve-team-members conn team-id)))
|
||||
|
||||
;; --- Query: Team Users
|
||||
|
||||
(declare retrieve-users)
|
||||
(declare retrieve-team-for-file)
|
||||
|
||||
(s/def ::file-id ::us/uuid)
|
||||
(s/def ::team-users
|
||||
(s/and (s/keys :req-un [::profile-id]
|
||||
:opt-un [::team-id ::file-id])
|
||||
#(or (:team-id %) (:file-id %))))
|
||||
(s/def ::team-users ::cmd.teams/get-team-users)
|
||||
|
||||
(sv/defmethod ::team-users
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id team-id file-id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(if team-id
|
||||
(do
|
||||
(check-read-permissions! conn profile-id team-id)
|
||||
(retrieve-users conn team-id))
|
||||
(let [{team-id :id} (retrieve-team-for-file conn file-id)]
|
||||
(check-read-permissions! conn profile-id team-id)
|
||||
(retrieve-users conn team-id)))))
|
||||
|
||||
;; This is a similar query to team members but can contain more data
|
||||
;; because some user can be explicitly added to project or file (not
|
||||
;; implemented in UI)
|
||||
|
||||
(def sql:team-users
|
||||
"select pf.id, pf.fullname, pf.photo_id
|
||||
from profile as pf
|
||||
inner join team_profile_rel as tpr on (tpr.profile_id = pf.id)
|
||||
where tpr.team_id = ?
|
||||
union
|
||||
select pf.id, pf.fullname, pf.photo_id
|
||||
from profile as pf
|
||||
inner join project_profile_rel as ppr on (ppr.profile_id = pf.id)
|
||||
inner join project as p on (ppr.project_id = p.id)
|
||||
where p.team_id = ?
|
||||
union
|
||||
select pf.id, pf.fullname, pf.photo_id
|
||||
from profile as pf
|
||||
inner join file_profile_rel as fpr on (fpr.profile_id = pf.id)
|
||||
inner join file as f on (fpr.file_id = f.id)
|
||||
inner join project as p on (f.project_id = p.id)
|
||||
where p.team_id = ?")
|
||||
|
||||
(def sql:team-by-file
|
||||
"select p.team_id as id
|
||||
from project as p
|
||||
join file as f on (p.id = f.project_id)
|
||||
where f.id = ?")
|
||||
|
||||
(defn retrieve-users
|
||||
[conn team-id]
|
||||
(db/exec! conn [sql:team-users team-id team-id team-id]))
|
||||
|
||||
(defn retrieve-team-for-file
|
||||
[conn file-id]
|
||||
(->> [sql:team-by-file file-id]
|
||||
(db/exec-one! conn)))
|
||||
(cmd.teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.teams/retrieve-users conn team-id))
|
||||
(let [{team-id :id} (cmd.teams/retrieve-team-for-file conn file-id)]
|
||||
(cmd.teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.teams/retrieve-users conn team-id)))))
|
||||
|
||||
;; --- Query: Team Stats
|
||||
|
||||
(declare retrieve-team-stats)
|
||||
|
||||
(s/def ::team-stats
|
||||
(s/keys :req-un [::profile-id ::team-id]))
|
||||
(s/def ::team-stats ::cmd.teams/get-team-stats)
|
||||
|
||||
(sv/defmethod ::team-stats
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id team-id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(check-read-permissions! conn profile-id team-id)
|
||||
(retrieve-team-stats conn team-id)))
|
||||
|
||||
(def sql:team-stats
|
||||
"select (select count(*) from project where team_id = ?) as projects,
|
||||
(select count(*) from file as f join project as p on (p.id = f.project_id) where p.team_id = ?) as files")
|
||||
|
||||
(defn retrieve-team-stats
|
||||
[conn team-id]
|
||||
(db/exec-one! conn [sql:team-stats team-id team-id]))
|
||||
|
||||
(cmd.teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.teams/retrieve-team-stats conn team-id)))
|
||||
|
||||
;; --- Query: Team invitations
|
||||
|
||||
(s/def ::team-id ::us/uuid)
|
||||
(s/def ::team-invitations
|
||||
(s/keys :req-un [::profile-id ::team-id]))
|
||||
|
||||
(def sql:team-invitations
|
||||
"select email_to as email, role, (valid_until < now()) as expired
|
||||
from team_invitation where team_id = ? order by valid_until desc")
|
||||
(s/def ::team-invitations ::cmd.teams/get-team-invitations)
|
||||
|
||||
(sv/defmethod ::team-invitations
|
||||
{::doc/added "1.0"
|
||||
::doc/deprecated "1.17"}
|
||||
[{:keys [pool] :as cfg} {:keys [profile-id team-id]}]
|
||||
(with-open [conn (db/open pool)]
|
||||
(check-read-permissions! conn profile-id team-id)
|
||||
(->> (db/exec! conn [sql:team-invitations team-id])
|
||||
(mapv #(update % :role keyword)))))
|
||||
(cmd.teams/check-read-permissions! conn profile-id team-id)
|
||||
(cmd.teams/get-team-invitations conn team-id)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue