mirror of
https://github.com/penpot/penpot.git
synced 2025-12-11 22:14:05 +01:00
Mainly removes an inconsistent use of path params and normalize all routes to use query params for make it extensible without breaking urls.
111 lines
4.0 KiB
Clojure
111 lines
4.0 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC
|
|
|
|
(ns app.rpc.commands.viewer
|
|
(:require
|
|
[app.common.exceptions :as ex]
|
|
[app.common.features :as cfeat]
|
|
[app.common.schema :as sm]
|
|
[app.config :as cf]
|
|
[app.db :as db]
|
|
[app.rpc :as-alias rpc]
|
|
[app.rpc.commands.comments :as comments]
|
|
[app.rpc.commands.files :as files]
|
|
[app.rpc.commands.teams :as teams]
|
|
[app.rpc.cond :as-alias cond]
|
|
[app.rpc.doc :as-alias doc]
|
|
[app.util.services :as sv]))
|
|
|
|
;; --- QUERY: View Only Bundle
|
|
|
|
(defn- remove-not-allowed-pages
|
|
[data allowed]
|
|
(-> data
|
|
(update :pages (fn [pages] (filterv #(contains? allowed %) pages)))
|
|
(update :pages-index select-keys allowed)))
|
|
|
|
(defn- get-view-only-bundle
|
|
[{:keys [::db/conn] :as cfg} {:keys [profile-id file-id ::perms] :as params}]
|
|
(let [file (files/get-file cfg file-id)
|
|
|
|
project (db/get conn :project
|
|
{:id (:project-id file)}
|
|
{:columns [:id :name :team-id]})
|
|
|
|
team (-> (db/get conn :team {:id (:team-id project)})
|
|
(teams/decode-row))
|
|
|
|
members (into #{} (->> (teams/get-team-members conn (:team-id project))
|
|
(map :id)))
|
|
|
|
perms (assoc perms :in-team (contains? members profile-id))
|
|
|
|
_ (-> (cfeat/get-team-enabled-features cf/flags team)
|
|
(cfeat/check-client-features! (:features params))
|
|
(cfeat/check-file-features! (:features file)))
|
|
|
|
file (cond-> file
|
|
(= :share-link (:type perms))
|
|
(update :data remove-not-allowed-pages (:pages perms))
|
|
|
|
:always
|
|
(update :data select-keys [:id :options :pages :pages-index :components]))
|
|
|
|
libs (files/get-file-libraries conn file-id)
|
|
users (comments/get-file-comments-users conn file-id profile-id)
|
|
links (->> (db/query conn :share-link {:file-id file-id})
|
|
(mapv (fn [row]
|
|
(-> row
|
|
(update :pages db/decode-pgarray #{})
|
|
;; NOTE: the flags are deprecated but are still present
|
|
;; on the table on old rows. The flags are pgarray and
|
|
;; for avoid decoding it (because they are no longer used
|
|
;; on frontend) we just dissoc the column attribute from
|
|
;; row.
|
|
(dissoc :flags)))))
|
|
|
|
fonts (db/query conn :team-font-variant
|
|
{:team-id (:id team)
|
|
:deleted-at nil})]
|
|
|
|
{:users users
|
|
:fonts fonts
|
|
:project project
|
|
:share-links links
|
|
:libraries libs
|
|
:file file
|
|
:team (assoc team :permissions perms)
|
|
:permissions perms}))
|
|
|
|
(def schema:get-view-only-bundle
|
|
[:map {:title "get-view-only-bundle"}
|
|
[:file-id ::sm/uuid]
|
|
[:share-id {:optional true} ::sm/uuid]
|
|
[:features {:optional true} ::cfeat/features]])
|
|
|
|
(sv/defmethod ::get-view-only-bundle
|
|
{::rpc/auth false
|
|
::doc/added "1.17"
|
|
::sm/params schema:get-view-only-bundle}
|
|
[system {:keys [::rpc/profile-id file-id share-id] :as params}]
|
|
(db/run! system
|
|
(fn [{:keys [::db/conn] :as system}]
|
|
(let [perms (files/get-permissions conn profile-id file-id share-id)
|
|
params (-> params
|
|
(assoc ::perms perms)
|
|
(assoc :profile-id profile-id))]
|
|
|
|
;; When we have neither profile nor share, we just return a not
|
|
;; found response to the user.
|
|
(when-not perms
|
|
(ex/raise :type :not-found
|
|
:code :object-not-found
|
|
:hint "object not found"))
|
|
|
|
(get-view-only-bundle system params)))))
|
|
|
|
|