diff --git a/backend/src/app/srepl.clj b/backend/src/app/srepl.clj index 5885fa3696..31177cf7ac 100644 --- a/backend/src/app/srepl.clj +++ b/backend/src/app/srepl.clj @@ -30,7 +30,7 @@ :init repl-init :read ccs/repl-read)) -(defn json-prepl +(defn json-repl [] (let [out *out* lock (locks/create)] @@ -61,7 +61,7 @@ [[type _] {:keys [::flag port host] :as cfg}] (when (contains? cf/flags flag) (let [accept (case type - ::prepl 'app.srepl/json-prepl + ::prepl 'app.srepl/json-repl ::urepl 'app.srepl/user-repl) params {:address host :port port diff --git a/backend/src/app/srepl/ext.clj b/backend/src/app/srepl/ext.clj index 7394912576..a37804f119 100644 --- a/backend/src/app/srepl/ext.clj +++ b/backend/src/app/srepl/ext.clj @@ -8,37 +8,70 @@ "PREPL API for external usage (CLI or ADMIN)" (:require [app.auth :as auth] + [app.common.exceptions :as ex] [app.common.uuid :as uuid] [app.db :as db] - [app.rpc.commands.auth :as cmd.auth])) + [app.rpc.commands.auth :as cmd.auth] + [app.util.json :as json] + [cuerdas.core :as str])) (defn- get-current-system [] (or (deref (requiring-resolve 'app.main/system)) (deref (requiring-resolve 'user/system)))) -(defn derive-password - [password] - (auth/derive-password password)) +(defmulti ^:private run-json-cmd* ::cmd) -(defn create-profile - [fullname, email, password] +(defn run-json-cmd + "Entry point with external tools integrations that uses PREPL + interface for interacting with running penpot backend." + [data] + (let [data (json/decode data) + params (merge {::cmd (keyword (:cmd data "default"))} + (:params data))] + (run-json-cmd* params))) + +(defmethod run-json-cmd* :create-profile + [{:keys [fullname email password is-active] + :or {is-active true}}] (when-let [system (get-current-system)] (db/with-atomic [conn (:app.db/pool system)] (let [params {:id (uuid/next) :email email :fullname fullname - :is-active true + :is-active is-active :password password - :props {}} - - profile (->> (cmd.auth/create-profile conn params) - (cmd.auth/create-profile-relations conn))] - - (str (:id profile)))))) - + :props {}}] + (->> (cmd.auth/create-profile conn params) + (cmd.auth/create-profile-relations conn)))))) +(defmethod run-json-cmd* :update-profile + [{:keys [fullname email password is-active]}] + (when-let [system (get-current-system)] + (db/with-atomic [conn (:app.db/pool system)] + (let [params (cond-> {} + (some? fullname) + (assoc :fullname fullname) + (some? password) + (assoc :password (auth/derive-password password)) + (some? is-active) + (assoc :is-active is-active))] + (when (seq params) + (let [res (db/update! conn :profile + params + {:email email + :deleted-at nil} + {:return-keys false})] + (pos? (:next.jdbc/update-count res)))))))) +(defmethod run-json-cmd* :derive-password + [{:keys [password]}] + (auth/derive-password password)) +(defmethod run-json-cmd* :default + [{:keys [::cmd]}] + (ex/raise :type :internal + :code :not-implemented + :hint (str/ffmt "command '%' not implemented" (name cmd))))