diff --git a/src/clj/auto_ap/ssr/users.clj b/src/clj/auto_ap/ssr/users.clj index 7c6d5b2c..ba184315 100644 --- a/src/clj/auto_ap/ssr/users.clj +++ b/src/clj/auto_ap/ssr/users.clj @@ -23,7 +23,8 @@ [config.core :refer [env]] [datomic.api :as dc] [malli.core :as mc] - [malli.transform :as mt2])) + [malli.transform :as mt2] + [manifold.time :as mt])) (defn filters [request] [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" @@ -245,22 +246,14 @@ (let [user (some-> request :params :user-id - not-empty - Long/parseLong (#(dc/pull (dc/db conn) default-read %))) - new-clients (map #(Long/parseLong %) - (cond-> (get form-params "clients") - (string? (get form-params "clients")) vector)) - _ @(dc/transact conn [ [:upsert-entity {:db/id (:db/id user) :user/role (keyword "user-role" (get form-params "role")) - :user/clients new-clients}]]) + :user/clients (some-> request :params :clients)}]]) user (some-> request :params :user-id - not-empty - Long/parseLong (#(dc/pull (dc/db conn) default-read %)))] (html-response @@ -272,8 +265,6 @@ (let [user (some-> request :params :user-id - not-empty - Long/parseLong (#(dc/pull (dc/db conn) default-read %)))] (html-response (com/modal @@ -324,27 +315,70 @@ [:div])]])))) -(def form-schema - (mc/schema - [:map - [:id nat-int?] - [:client-ids [:vector nat-int?]] - [:role [:enum :user-role/admin :user-role/test]]])) +(defn forced-vector [x] + [:vector {:decode/json {:enter (fn [x] + (if (sequential? x) + x + [x]) + )}} + x]) -#_(mc/coerce - form-schema - {"id" "1230812" - "client-ids" ["123"] - "role" "admin"} - mt2/json-transformer) +(def entity-id (mc/schema nat-int?)) -#_(mt2/coerck) +(defn wrap-schema-decode [handler & {:keys [form query params]}] + (fn [{:keys [form-params query-params] :as request}] + (try + (handler (cond-> request + (and (:params request) params) + (assoc :params + (mc/coerce + params + (:params request) + (mt2/transformer + (mt2/key-transformer {:encode name :decode keyword}) + mt2/string-transformer + mt2/json-transformer) )) + + (and form form-params) + (assoc :parsed-form-params + (mc/coerce + form + form-params + (mt2/transformer + (mt2/key-transformer {:encode name :decode keyword}) + mt2/string-transformer + mt2/json-transformer) )) + + (and query query-params) + (assoc :parsed-query-params + (mc/coerce + form + form-params + (mt2/transformer + (mt2/key-transformer {:encode name :decode keyword}) + mt2/string-transformer + mt2/json-transformer) )))) + (catch Exception e + {:status 400 + :body "error"})))) (def key->handler - {:users (wrap-admin (helper/page-route grid-page)) - :user-table (wrap-admin (helper/table-route grid-page)) - :user-edit-save (wrap-client-redirect-unauthenticated (wrap-admin user-edit-save)) - :user-edit-dialog (wrap-client-redirect-unauthenticated (wrap-admin user-edit-dialog)) + {:users (wrap-admin (helper/page-route grid-page)) + :user-table (wrap-admin (helper/table-route grid-page)) + :user-edit-save (-> user-edit-save + wrap-admin + wrap-client-redirect-unauthenticated + (wrap-schema-decode + :params (mc/schema + [:map + [:user-id nat-int?] + [:clients (forced-vector entity-id)] + [:role [:enum {:decode/string #(keyword "user-role" %)} :user-role/admin :user-role/manager :user-role/power-user :user-role/user :user-role/none]]]))) + :user-edit-dialog (-> user-edit-dialog + wrap-admin + wrap-client-redirect-unauthenticated + (wrap-schema-decode + :params (mc/schema [:map [:user-id entity-id]]))) :user-impersonate (wrap-client-redirect-unauthenticated (wrap-admin impersonate))})