Adds manager type, blocks certain permissions

This commit is contained in:
Bryce Covert
2020-05-29 07:14:40 -07:00
parent e77e02137c
commit d9bf9867e4
19 changed files with 122 additions and 92 deletions

View File

@@ -256,7 +256,9 @@
{:db/ident :forecasted-transaction/identifier {:db/ident :forecasted-transaction/identifier
:db/doc "An identifier for this forcasted transaction, e.g., 'RENT'" :db/doc "An identifier for this forcasted transaction, e.g., 'RENT'"
:db/valueType :db.type/string :db/valueType :db.type/string
:db/cardinality :db.cardinality/one}]]}}] :db/cardinality :db.cardinality/one}]]}
:auto-ap/add-manager-schema {:txes [[{:db/ident :user-role/manager}]]}}
]
(println "Conforming database...") (println "Conforming database...")
(c/ensure-conforms conn norms-map) (c/ensure-conforms conn norms-map)
(when (not (seq args)) (when (not (seq args))

View File

@@ -18,8 +18,7 @@
:in ['$] :in ['$]
:where []} :where []}
:args [(d/db (d/connect uri))]} :args [(d/db (d/connect uri))]}
(add-arg '?e id ['?e]) (add-arg '?e id ['?e]))]
(doto println))]
(->> (d/query query) (->> (d/query query)
(map first) (map first)
@@ -47,7 +46,6 @@
(let [new-user-trans @(d/transact (d/connect uri) [(cond-> new-user (let [new-user-trans @(d/transact (d/connect uri) [(cond-> new-user
true (assoc :db/id "user") true (assoc :db/id "user")
is-first-user? (assoc :user/role :user-role/admin))])] is-first-user? (assoc :user/role :user-role/admin))])]
(println new-user-trans)
(get-by-id (-> new-user-trans :tempids (get "user"))))))) (get-by-id (-> new-user-trans :tempids (get "user")))))))
(defn raw-graphql [args] (defn raw-graphql [args]

View File

@@ -824,9 +824,8 @@
(defn get-user [context args value] (defn get-user [context args value]
(assert-admin (:id context)) (assert-admin (:id context))
(doto (let [users (d-users/get-graphql args)] (let [users (d-users/get-graphql args)]
(->graphql users)) (->graphql users)))
println))
(defn get-vendor [context args value] (defn get-vendor [context args value]
(->graphql (->graphql

View File

@@ -5,10 +5,6 @@
[auto-ap.graphql.utils :refer [->graphql assert-admin can-see-client?]] [auto-ap.graphql.utils :refer [->graphql assert-admin can-see-client?]]
[clojure.string :as str])) [clojure.string :as str]))
#_(def role->datomic-role {":none" :user-role/none
":admin" :user-role/admin
":user" :user-role/user})
(defn assert-client-code-is-unique [code] (defn assert-client-code-is-unique [code]
(when (seq (d/query {:query {:find '[?id] (when (seq (d/query {:query {:find '[?id]
:in ['$ '?code] :in ['$ '?code]

View File

@@ -6,6 +6,7 @@
(def role->datomic-role {":none" :user-role/none (def role->datomic-role {":none" :user-role/none
":admin" :user-role/admin ":admin" :user-role/admin
":manager" :user-role/manager
":user" :user-role/user}) ":user" :user-role/user})
(defn edit-user [context {:keys [edit_user] :as args} value] (defn edit-user [context {:keys [edit_user] :as args} value]

View File

@@ -72,7 +72,7 @@
(= (:user/role id) "admin") (= (:user/role id) "admin")
nil nil
(= (:user/role id) "user") (#{"manager" "user"} (:user/role id))
(:user/clients id []))) (:user/clients id [])))
(defn result->page [results result-count key args] (defn result->page [results result-count key args]

View File

@@ -11,7 +11,11 @@
(defn upsert-vendor [context {{:keys [id name hidden terms code print_as primary_contact secondary_contact address default_account_id invoice_reminder_schedule terms_overrides account_overrides] :as in} :vendor} value] (defn upsert-vendor [context {{:keys [id name hidden terms code print_as primary_contact secondary_contact address default_account_id invoice_reminder_schedule terms_overrides account_overrides] :as in} :vendor} value]
(when id (when id
(assert-admin (:id context))) (assert-admin (:id context)))
(let [terms-overrides (mapv (let [hidden (if (is-admin? (:id context))
hidden
false)
terms-overrides (mapv
(fn [to] (fn [to]
(cond-> (cond->
#:vendor-terms-override {:client (:client_id to) #:vendor-terms-override {:client (:client_id to)

View File

@@ -160,8 +160,11 @@
(re-frame/reg-sub (re-frame/reg-sub
::vendors ::vendors
(fn [db] :<- [::is-admin?]
(filter #(not (:hidden %)) (vals (:vendors db))))) :<- [::all-vendors]
(fn [[is-admin all-vendors]]
(filter #(or (not (:hidden %))
is-admin) all-vendors)))
(re-frame/reg-sub (re-frame/reg-sub
::all-vendors ::all-vendors

View File

@@ -55,7 +55,8 @@
(defn navbar [ap] (defn navbar [ap]
(let [client (re-frame/subscribe [::subs/client]) (let [user (re-frame/subscribe [::subs/user])
client (re-frame/subscribe [::subs/client])
clients (re-frame/subscribe [::subs/clients]) clients (re-frame/subscribe [::subs/clients])
menu (re-frame/subscribe [::subs/menu])] menu (re-frame/subscribe [::subs/menu])]
[:nav {:class "navbar has-shadow is-fixed-top"} [:nav {:class "navbar has-shadow is-fixed-top"}
@@ -74,12 +75,15 @@
[:a.navbar-item {:class [(active-when ap = :payments)] [:a.navbar-item {:class [(active-when ap = :payments)]
:href (bidi/path-for routes/routes :payments)} :href (bidi/path-for routes/routes :payments)}
"Payments" ] "Payments" ]
[:a.navbar-item {:class [(active-when ap = :transactions)] (when (not= "manager" (:user/role @user))
:href (bidi/path-for routes/routes :transactions)} [:a.navbar-item {:class [(active-when ap = :transactions)]
"Transactions" ] :href (bidi/path-for routes/routes :transactions)}
[:a.navbar-item {:class [(active-when ap = :ledger)] "Transactions" ])
:href (bidi/path-for routes/routes :ledger)}
"Ledger" ]] (when (not= "manager" (:user/role @user))
[:a.navbar-item {:class [(active-when ap = :ledger)]
:href (bidi/path-for routes/routes :ledger)}
"Ledger" ])]
[:div {:class "navbar-burger burger", :data-target "navMenu"} [:div {:class "navbar-burger burger", :data-target "navMenu"}
[:span] [:span]
[:span] [:span]

View File

@@ -24,7 +24,6 @@
(defn action-modal [{:keys [title class warning action-text id save-event can-submit? status-from] :or {can-submit? true}} & rest] (defn action-modal [{:keys [title class warning action-text id save-event can-submit? status-from] :or {can-submit? true}} & rest]
(let [{:keys [visible? saving? error-message]} @(re-frame/subscribe [::subs/modal-state id status-from])] (let [{:keys [visible? saving? error-message]} @(re-frame/subscribe [::subs/modal-state id status-from])]
(println id visible?)
(when visible? (when visible?
[:form {:id id [:form {:id id
:on-submit (fn [e] :on-submit (fn [e]

View File

@@ -1,6 +1,6 @@
(ns auto-ap.views.components.vendor-dialog (ns auto-ap.views.components.vendor-dialog
(:require [re-frame.core :as re-frame] (:require [re-frame.core :as re-frame]
[auto-ap.views.utils :refer [dispatch-event horizontal-field bind-field with-user active-when]] [auto-ap.views.utils :refer [dispatch-event horizontal-field bind-field with-user with-is-admin? active-when]]
[auto-ap.views.components.modal :refer [action-modal]] [auto-ap.views.components.modal :refer [action-modal]]
[auto-ap.views.components.address :refer [address-field]] [auto-ap.views.components.address :refer [address-field]]
[auto-ap.views.components.typeahead :refer [typeahead-entity]] [auto-ap.views.components.typeahead :refer [typeahead-entity]]
@@ -105,36 +105,37 @@
(re-frame/reg-event-fx (re-frame/reg-event-fx
::save ::save
[with-user (forms/triggers-loading ::vendor-form) (forms/in-form ::vendor-form)] [with-user with-is-admin? (forms/triggers-loading ::vendor-form) (forms/in-form ::vendor-form)]
(fn [{:keys [user] {{:keys [name hidden print-as terms invoice-reminder-schedule primary-contact secondary-contact address default-account terms-overrides account-overrides id] :as data} :data} :db} _] (fn [{:keys [user is-admin?] {{:keys [name hidden print-as terms invoice-reminder-schedule primary-contact secondary-contact address default-account terms-overrides account-overrides id] :as data} :data} :db} _]
(println user)
(when (s/valid? ::entity/vendor data) (when (s/valid? ::entity/vendor data)
{ :graphql { :graphql
{:token user {:token user
:query-obj {:venia/operation {:operation/type :mutation :query-obj {:venia/operation {:operation/type :mutation
:operation/name "UpsertVendor"} :operation/name "UpsertVendor"}
:venia/queries [{:query/data [:upsert-vendor :venia/queries [{:query/data [:upsert-vendor
{:vendor {:id id {:vendor (cond-> {:id id
:name name :name name
:hidden hidden :print-as print-as
:print-as print-as :terms terms
:terms terms :terms-overrides (mapv
:terms-overrides (mapv (fn [{:keys [client override id]}]
(fn [{:keys [client override id]}] {:id id
{:id id :client-id (:id client)
:client-id (:id client) :terms override})
:terms override}) terms-overrides)
terms-overrides) :default-account-id (:id default-account)
:default-account-id (:id default-account) :account-overrides (mapv
:account-overrides (mapv (fn [{:keys [client override id]}]
(fn [{:keys [client override id]}] {:id id
{:id id :client-id (:id client)
:client-id (:id client) :account-id (:id override)})
:account-id (:id override)}) account-overrides)
account-overrides) :address address
:address address :primary-contact primary-contact
:primary-contact primary-contact :secondary-contact secondary-contact
:secondary-contact secondary-contact :invoice-reminder-schedule invoice-reminder-schedule}
:invoice-reminder-schedule invoice-reminder-schedule}} is-admin? (assoc :hidden hidden))}
events/vendor-query]}]} events/vendor-query]}]}
:on-success [::save-complete] :on-success [::save-complete]
:on-error [::forms/save-error ::vendor-form]}}))) :on-error [::forms/save-error ::vendor-form]}})))
@@ -171,7 +172,8 @@
(defn form-content [{:keys [data change-event]}] (defn form-content [{:keys [data change-event]}]
(let [accounts @(re-frame/subscribe [::subs/accounts]) (let [accounts @(re-frame/subscribe [::subs/accounts])
clients @(re-frame/subscribe [::subs/clients])] clients @(re-frame/subscribe [::subs/clients])
is-admin? @(re-frame/subscribe [::subs/is-admin?])]
[:div [:div
[horizontal-field [horizontal-field
[:label.label "Name"] [:label.label "Name"]
@@ -194,15 +196,16 @@
:event change-event :event change-event
:subscription data}]]]] :subscription data}]]]]
[horizontal-field (when is-admin?
[:label.label "Hidden"] [horizontal-field
[:div.control [:label.label "Hidden"]
[bind-field [:div.control
[:input {:type "checkbox" [bind-field
:field :hidden [:input {:type "checkbox"
:spec ::entity/hidden :field :hidden
:event change-event :spec ::entity/hidden
:subscription data}]]]] :event change-event
:subscription data}]]]])
[:h2.subtitle "Terms"] [:h2.subtitle "Terms"]
[default-with-overrides {:data data :change-event change-event [default-with-overrides {:data data :change-event change-event
:default-key :terms :default-key :terms

View File

@@ -71,6 +71,7 @@
%)) %))
(assoc :vendor-id (:id (:vendor data))) (assoc :vendor-id (:id (:vendor data)))
(assoc :yodlee-merchant-id (:id (:yodlee-merchant data))) (assoc :yodlee-merchant-id (:id (:yodlee-merchant data)))
(update :description (fn [d] (when d (str/replace d #"\\" "\\\\"))))
(update :accounts (fn [as] (update :accounts (fn [as]
(map #(-> % (map #(-> %
(update :id (fn [i] (if (some-> i (str/starts-with? "new-")) (update :id (fn [i] (if (some-> i (str/starts-with? "new-"))
@@ -99,6 +100,7 @@
:dom-lte :dom-lte
:dom-gte :dom-gte
:note]) :note])
(update :description (fn [d] (when d (str/replace d #"\\" "\\\\"))))
(assoc :yodlee-merchant-id (:id (:yodlee-merchant data))) (assoc :yodlee-merchant-id (:id (:yodlee-merchant data)))
(assoc :client-id (:id (:client data))) (assoc :client-id (:id (:client data)))
(assoc :bank-account-id (:id (:bank-account data))))} (assoc :bank-account-id (:id (:bank-account data))))}

View File

@@ -149,10 +149,11 @@
:subscription editing} :subscription editing}
[:option {:value ":none"} "None"] [:option {:value ":none"} "None"]
[:option {:value ":user"} "User"] [:option {:value ":user"} "User"]
[:option {:value ":manager"} "Manager"]
[:option {:value ":admin"} "Admin"]]]]]] [:option {:value ":admin"} "Admin"]]]]]]
(when (= ":user" (:role (:user editing))) (when (#{":user" ":manager"} (:role (:user editing)))
[horizontal-field [horizontal-field
[:label.label "Clients"] [:label.label "Clients"]
[:div.control [:div.control

View File

@@ -70,7 +70,6 @@
(re-frame/reg-event-db (re-frame/reg-event-db
::save-error ::save-error
(fn [db [_ vendor]] (fn [db [_ vendor]]
(println "ERROR?")
(-> db (-> db
(assoc-in [:admin :vendor :error] true) (assoc-in [:admin :vendor :error] true)
(assoc-in [:admin :vendor :saving?] false)))) (assoc-in [:admin :vendor :saving?] false))))
@@ -78,7 +77,6 @@
(re-frame/reg-event-db (re-frame/reg-event-db
::change ::change
(fn [db [_ path value]] (fn [db [_ path value]]
(println path value)
(assoc-in db (concat [:admin :vendor] path) (assoc-in db (concat [:admin :vendor] path)
value))) value)))

View File

@@ -91,8 +91,7 @@
(assoc-in [:status :loading] false)))) (assoc-in [:status :loading] false))))
(defn ledger-content [] (defn ledger-content []
(let [current-client @(re-frame/subscribe [::subs/client]) (let [current-client @(re-frame/subscribe [::subs/client])]
user @(re-frame/subscribe [::subs/user])]
[:div [:div
[:h1.title "Ledger"] [:h1.title "Ledger"]
[table/table {:id :ledger [table/table {:id :ledger
@@ -102,13 +101,16 @@
(defn ledger-page [] (defn ledger-page []
(reagent/create-class (let [user (re-frame/subscribe [::subs/user])]
{:display-name "ledger-page" (reagent/create-class
:component-will-unmount #(re-frame/dispatch [::unmounted]) {:display-name "ledger-page"
:reagent-render :component-will-unmount #(re-frame/dispatch [::unmounted])
(fn [] :reagent-render
(let [params @(re-frame/subscribe [::params])] (fn []
[side-bar-layout (if (not= "manager" (:user/role @user))
{:side-bar [ledger-side-bar] (let [params @(re-frame/subscribe [::params])]
:main [ledger-content]}]))})) [side-bar-layout
{:side-bar [ledger-side-bar]
:main [ledger-content]}])
[:div "Not authorized"]))})))

View File

@@ -214,6 +214,9 @@
{:component-will-mount #(re-frame/dispatch-sync [::params-change {:date (date->str (local-now) standard)}]) })) {:component-will-mount #(re-frame/dispatch-sync [::params-change {:date (date->str (local-now) standard)}]) }))
(defn balance-sheet-page [] (defn balance-sheet-page []
[side-bar-layout (let [user (re-frame/subscribe [::subs/user])]
{:side-bar [ledger-side-bar] (if (not= "manager" (:user/role @user))
:main [balance-sheet-content]}]) [side-bar-layout
{:side-bar [ledger-side-bar]
:main [balance-sheet-content]}]
[:div "Not Authorized"])))

View File

@@ -532,10 +532,13 @@
(re-frame/dispatch [::ledger-params-changed params]))}]]])) (re-frame/dispatch [::ledger-params-changed params]))}]]]))
(defn profit-and-loss-page [] (defn profit-and-loss-page []
(let [ledger-list-active? @(re-frame/subscribe [::ledger-list-active?])] (let [ledger-list-active? @(re-frame/subscribe [::ledger-list-active?])
[side-bar-layout user (re-frame/subscribe [::subs/user])]
{:side-bar [ledger-side-bar] (if (not= "manager" (:user/role @user))
:main [profit-and-loss-content] [side-bar-layout
:right-side-bar [appearing-side-bar {:side-bar [ledger-side-bar]
{:visible? ledger-list-active?} :main [profit-and-loss-content]
[ledger-list]]}])) :right-side-bar [appearing-side-bar
{:visible? ledger-list-active?}
[ledger-list]]}]
[:div "Not authorized"])))

View File

@@ -160,14 +160,17 @@
(fn [] (fn []
(let [{transaction-bar-active? :active?} @(re-frame/subscribe [::forms/form ::edit/form]) (let [{transaction-bar-active? :active?} @(re-frame/subscribe [::forms/form ::edit/form])
params @(re-frame/subscribe [::params]) ;; Keep to make sure it doens'nt get disposed params @(re-frame/subscribe [::params]) ;; Keep to make sure it doens'nt get disposed
ap @(re-frame/subscribe [::subs/active-page])] ap @(re-frame/subscribe [::subs/active-page])
[side-bar-layout user (re-frame/subscribe [::subs/user])]
{:side-bar [side-bar/side-bar] (if (not= "manager" (:user/role @user))
:main [:div ^{:key approval-status} [side-bar-layout
[content]] {:side-bar [side-bar/side-bar]
:bottom [:div :main [:div ^{:key approval-status}
[manual/modal {:import-completed [::manual-import-completed ]}]] [content]]
:right-side-bar [appearing-side-bar :bottom [:div
{:visible? transaction-bar-active?} [manual/modal {:import-completed [::manual-import-completed ]}]]
[edit/form {:edit-completed [::edit-completed]}]]}]))})) :right-side-bar [appearing-side-bar
{:visible? transaction-bar-active?}
[edit/form {:edit-completed [::edit-completed]}]]}]
[:div "Not authorized"])))}))

View File

@@ -321,6 +321,15 @@
(-> context (-> context
(assoc-in [:coeffects :user] (get-in context [:coeffects :db :user])))))) (assoc-in [:coeffects :user] (get-in context [:coeffects :db :user]))))))
(def with-is-admin?
(re-frame/->interceptor
:id :with-is-admin?
:before (fn [context]
(-> context
(assoc-in [:coeffects :is-admin?] (= "admin"
(:user/role
(get-in context [:coeffects :db :user]))))))))
(defn query-params [] (defn query-params []
(reduce-kv (reduce-kv
(fn [result k v] (fn [result k v]