diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index b2b29170c8..3ef9e94e88 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -91,7 +91,8 @@ [params] (d/without-nils {:external-session-id (::rpc/external-session-id params) - :event-origin (::rpc/handler-name params)})) + :event-origin (::rpc/external-event-origin params) + :triggered-by (::rpc/handler-name params)})) ;; --- SPECS @@ -147,18 +148,20 @@ (::rpc/profile-id params) uuid/zero) - session-id (get params ::rpc/external-session-id) - props (-> (or (::replace-props resultm) - (-> params - (merge (::props resultm)) - (dissoc :profile-id) - (dissoc :type))) + session-id (get params ::rpc/external-session-id) + event-origin (get params ::rpc/external-event-origin) + props (-> (or (::replace-props resultm) + (-> params + (merge (::props resultm)) + (dissoc :profile-id) + (dissoc :type))) - (clean-props)) + (clean-props)) token-id (::actoken/id request) context (-> (::context resultm) (assoc :external-session-id session-id) + (assoc :external-event-origin event-origin) (assoc :access-token-id (some-> token-id str)) (d/without-nils))] diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index c2a85413d9..fb68076515 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -80,11 +80,13 @@ (::actoken/profile-id request)) session-id (rreq/get-header request "x-external-session-id") + event-origin (rreq/get-header request "x-event-origin") data (-> params (assoc ::handler-name handler-name) (assoc ::request-at (dt/now)) (assoc ::external-session-id session-id) + (assoc ::external-event-origin event-origin) (assoc ::session/id (::session/id request)) (assoc ::cond/key etag) (cond-> (uuid? profile-id) diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index b7a73213d9..f30bc8870e 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -357,10 +357,12 @@ ::quotes/profile-id profile-id}) (let [features (-> (cfeat/get-enabled-features cf/flags) - (cfeat/check-client-features! (:features params)))] - (create-team cfg (assoc params - :profile-id profile-id - :features features)))))) + (cfeat/check-client-features! (:features params))) + team (create-team cfg (assoc params + :profile-id profile-id + :features features))] + (with-meta team + {::audit/props {:id (:id team)}}))))) (defn create-team "This is a complete team creation process, it creates the team @@ -880,7 +882,7 @@ (sv/defmethod ::create-team-with-invitations {::doc/added "1.17" ::sm/params schema:create-team-with-invitations} - [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id emails role] :as params}] + [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id emails role name] :as params}] (db/with-atomic [conn pool] (let [features (-> (cfeat/get-enabled-features cf/flags) @@ -893,7 +895,8 @@ cfg (assoc cfg ::db/conn conn) team (create-team cfg params) profile (db/get-by-id conn :profile profile-id) - emails (into #{} (map profile/clean-email) emails)] + emails (into #{} (map profile/clean-email) emails) + context (audit/params->context params)] ;; Create invitations for all provided emails. (->> emails @@ -917,6 +920,14 @@ ::quotes/team-id (:id team) ::quotes/incr (count emails)})) + (audit/submit! cfg + {::audit/type "action" + ::audit/name "create-team" + ::audit/profile-id profile-id + ::audit/props {:name name + :features features} + ::audit/context context}) + (audit/submit! cfg {::audit/type "command" ::audit/name "create-team-invitations" diff --git a/frontend/src/app/main/data/dashboard.cljs b/frontend/src/app/main/data/dashboard.cljs index 267e299e2a..6e5e53d1a1 100644 --- a/frontend/src/app/main/data/dashboard.cljs +++ b/frontend/src/app/main/data/dashboard.cljs @@ -405,12 +405,13 @@ (dm/assert! (string? name)) (ptk/reify ::create-team ptk/WatchEvent - (watch [_ state _] + (watch [it state _] (let [{:keys [on-success on-error] :or {on-success identity on-error rx/throw}} (meta params) - features (features/get-enabled-features state)] - (->> (rp/cmd! :create-team {:name name :features features}) + features (features/get-enabled-features state) + params {:name name :features features}] + (->> (rp/cmd! :create-team (with-meta params (meta it))) (rx/tap on-success) (rx/map team-created) (rx/catch on-error)))))) @@ -421,7 +422,7 @@ [{:keys [name emails role] :as params}] (ptk/reify ::create-team-with-invitations ptk/WatchEvent - (watch [_ state _] + (watch [it state _] (let [{:keys [on-success on-error] :or {on-success identity on-error rx/throw}} (meta params) @@ -430,7 +431,7 @@ :emails emails :role role :features features}] - (->> (rp/cmd! :create-team-with-invitations params) + (->> (rp/cmd! :create-team-with-invitations (with-meta params (meta it))) (rx/tap on-success) (rx/map team-created) (rx/catch on-error)))))) @@ -553,12 +554,12 @@ :resend resend?}) ptk/WatchEvent - (watch [_ _ _] + (watch [it _ _] (let [{:keys [on-success on-error] :or {on-success identity on-error rx/throw}} (meta params) params (dissoc params :resend?)] - (->> (rp/cmd! :create-team-invitations params) + (->> (rp/cmd! :create-team-invitations (with-meta params (meta it))) (rx/tap on-success) (rx/catch on-error)))))) diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index 7d9bee599d..b19edf933c 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -10,6 +10,7 @@ [app.common.transit :as t] [app.common.uri :as u] [app.config :as cf] + [app.main.data.events :as-alias ev] [app.util.http :as http] [app.util.sse :as sse] [beicon.v2.core :as rx] @@ -93,12 +94,12 @@ (= query-params :all) :get (str/starts-with? nid "get-") :get :else :post) - request {:method method :uri (u/join cf/public-uri "api/rpc/command/" nid) :credentials "include" :headers {"accept" "application/transit+json,text/event-stream,*/*" - "x-external-session-id" (cf/external-session-id)} + "x-external-session-id" (cf/external-session-id) + "x-event-origin" (::ev/origin (meta params))} :body (when (= method :post) (if form-data? (http/form-data params) @@ -137,7 +138,8 @@ (->> (http/send! {:method :post :uri uri :credentials "include" - :headers {"x-external-session-id" (cf/external-session-id)} + :headers {"x-external-session-id" (cf/external-session-id) + "x-event-origin" (::ev/origin (meta params))} :query params}) (rx/map http/conditional-decode-transit) (rx/mapcat handle-response)))) @@ -147,7 +149,8 @@ (->> (http/send! {:method :post :uri (u/join cf/public-uri "api/export") :body (http/transit-data (dissoc params :blob?)) - :headers {"x-external-session-id" (cf/external-session-id)} + :headers {"x-external-session-id" (cf/external-session-id) + "x-event-origin" (::ev/origin (meta params))} :credentials "include" :response-type (if blob? :blob :text)}) (rx/map http/conditional-decode-transit) @@ -167,7 +170,8 @@ (->> (http/send! {:method :post :uri (u/join cf/public-uri "api/rpc/command/" (name id)) :credentials "include" - :headers {"x-external-session-id" (cf/external-session-id)} + :headers {"x-external-session-id" (cf/external-session-id) + "x-event-origin" (::ev/origin (meta params))} :body (http/form-data params)}) (rx/map http/conditional-decode-transit) (rx/mapcat handle-response))) diff --git a/frontend/src/app/main/ui/dashboard/team_form.cljs b/frontend/src/app/main/ui/dashboard/team_form.cljs index 3d7e790f2e..cc0f37c9f2 100644 --- a/frontend/src/app/main/ui/dashboard/team_form.cljs +++ b/frontend/src/app/main/ui/dashboard/team_form.cljs @@ -9,6 +9,7 @@ (:require [app.common.schema :as sm] [app.main.data.dashboard :as dd] + [app.main.data.events :as ev] [app.main.data.messages :as msg] [app.main.data.modal :as modal] [app.main.store :as st] @@ -50,7 +51,8 @@ (let [mdata {:on-success (partial on-create-success form) :on-error (partial on-error form)} params {:name (get-in @form [:clean-data :name])}] - (st/emit! (dd/create-team (with-meta params mdata))))) + (st/emit! (-> (dd/create-team (with-meta params mdata)) + (with-meta {::ev/origin :dashboard}))))) (defn- on-update-submit [form] diff --git a/frontend/src/app/main/ui/onboarding/team_choice.cljs b/frontend/src/app/main/ui/onboarding/team_choice.cljs index b97079518d..40e3506cd1 100644 --- a/frontend/src/app/main/ui/onboarding/team_choice.cljs +++ b/frontend/src/app/main/ui/onboarding/team_choice.cljs @@ -98,7 +98,8 @@ (let [mdata {:on-success on-success :on-error on-error} params {:name name}] - (st/emit! (dd/create-team (with-meta params mdata)) + (st/emit! (-> (dd/create-team (with-meta params mdata)) + (with-meta {::ev/origin :onboarding-without-invitations})) (ptk/data-event ::ev/event {::ev/name "onboarding-step" :label "team:create-team-and-invite-later" @@ -113,7 +114,8 @@ (let [mdata {:on-success on-success :on-error on-error}] - (st/emit! (dd/create-team-with-invitations (with-meta params mdata)) + (st/emit! (-> (dd/create-team-with-invitations (with-meta params mdata)) + (with-meta {::ev/origin :onboarding-with-invitations})) (ptk/data-event ::ev/event {::ev/name "onboarding-step" :label "team:create-team-and-invite"