diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index b8a7417d2..52cf69b91 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -239,6 +239,7 @@ 'app.rpc.commands.comments 'app.rpc.commands.management 'app.rpc.commands.verify-token + 'app.rpc.commands.search 'app.rpc.commands.auth 'app.rpc.commands.ldap 'app.rpc.commands.demo diff --git a/backend/src/app/rpc/commands/search.clj b/backend/src/app/rpc/commands/search.clj new file mode 100644 index 000000000..23fd19bef --- /dev/null +++ b/backend/src/app/rpc/commands/search.clj @@ -0,0 +1,68 @@ +;; 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.search + (:require + [app.common.spec :as us] + [app.db :as db] + [app.rpc.doc :as-alias doc] + [app.util.services :as sv] + [clojure.spec.alpha :as s])) + +(def ^:private sql:search-files + "with projects as ( + select p.* + from project as p + inner join team_profile_rel as tpr on (tpr.team_id = p.team_id) + where tpr.profile_id = ? + and p.team_id = ? + and (p.deleted_at is null or p.deleted_at > now()) + and (tpr.is_admin = true or + tpr.is_owner = true or + tpr.can_edit = true) + union + select p.* + from project as p + inner join project_profile_rel as ppr on (ppr.project_id = p.id) + where ppr.profile_id = ? + and p.team_id = ? + and (p.deleted_at is null or p.deleted_at > now()) + and (ppr.is_admin = true or + ppr.is_owner = true or + ppr.can_edit = true) + ) + select distinct + f.id, + f.project_id, + f.created_at, + f.modified_at, + f.name, + f.is_shared + from file as f + inner join projects as pr on (f.project_id = pr.id) + where f.name ilike ('%' || ? || '%') + order by f.created_at asc") + +(defn search-files + [conn {:keys [profile-id team-id search-term] :as params}] + (db/exec! conn [sql:search-files + profile-id team-id + profile-id team-id + search-term])) + +(s/def ::profile-id ::us/uuid) +(s/def ::team-id ::us/uuid) +(s/def ::search-files ::us/string) + +(s/def ::search-files + (s/keys :req-un [::profile-id ::team-id] + :opt-un [::search-term])) + +(sv/defmethod ::search-files + {::doc/added "1.17"} + [{:keys [pool]} {:keys [search-term] :as params}] + (when search-term + (search-files pool params))) diff --git a/backend/src/app/rpc/queries/files.clj b/backend/src/app/rpc/queries/files.clj index 58025328f..0672e5f89 100644 --- a/backend/src/app/rpc/queries/files.clj +++ b/backend/src/app/rpc/queries/files.clj @@ -9,6 +9,7 @@ [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.doc :as-alias doc] [app.rpc.helpers :as rph] [app.rpc.queries.projects :as projects] @@ -169,3 +170,15 @@ (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)))) + + +;; --- QUERY: search files + +(s/def ::search-files ::cmd.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))) diff --git a/frontend/src/app/main/data/dashboard.cljs b/frontend/src/app/main/data/dashboard.cljs index 595a1029a..0b4d26e8d 100644 --- a/frontend/src/app/main/data/dashboard.cljs +++ b/frontend/src/app/main/data/dashboard.cljs @@ -193,7 +193,7 @@ (watch [_ state _] (let [team-id (:current-team-id state) params (assoc params :team-id team-id)] - (->> (rp/query! :search-files params) + (->> (rp/cmd! :search-files params) (rx/map search-result-fetched)))))) ;; --- EVENT: files diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index d0876afba..67993a419 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -16,6 +16,7 @@ (derive :get-file-object-thumbnails ::query) (derive :get-file-libraries ::query) (derive :get-file-fragment ::query) +(derive :search-files ::query) (defn handle-response [{:keys [status body] :as response}]