diff --git a/backend/resources/emails/feedback/en.subj b/backend/resources/emails/feedback/en.subj index 2ecd8c0c4..7b4c21809 100644 --- a/backend/resources/emails/feedback/en.subj +++ b/backend/resources/emails/feedback/en.subj @@ -1 +1 @@ -[FEEDBACK]: From {{ profile.email }} +[PENPOT FEEDBACK]: {{subject|abbreviate:19}} (from {% if profile %}{{ profile.email }}{% else %}{{from}}{% endif %}) diff --git a/backend/resources/emails/feedback/en.txt b/backend/resources/emails/feedback/en.txt index f6e602a19..c768a9fd9 100644 --- a/backend/resources/emails/feedback/en.txt +++ b/backend/resources/emails/feedback/en.txt @@ -1,6 +1,9 @@ +{% if profile %} Feedback from: {{profile.fullname}} <{{profile.email}}> - Profile ID: {{profile.id}} +{% else %} +Feedback from: {{from}} +{% endif %} Subject: {{subject}} diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj index b78e49fbf..a4f8a0817 100644 --- a/backend/src/app/config.clj +++ b/backend/src/app/config.clj @@ -90,6 +90,7 @@ (s/def ::error-report-webhook ::us/string) (s/def ::feedback-destination ::us/string) (s/def ::feedback-enabled ::us/boolean) +(s/def ::feedback-token ::us/string) (s/def ::github-client-id ::us/string) (s/def ::github-client-secret ::us/string) (s/def ::gitlab-base-uri ::us/string) @@ -162,6 +163,7 @@ ::error-report-webhook ::feedback-destination ::feedback-enabled + ::feedback-token ::github-client-id ::github-client-secret ::gitlab-base-uri diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 2e2a40dfe..06ea21b85 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -111,7 +111,7 @@ :body "internal server error"}))))))) (defn- create-router - [{:keys [session rpc oauth metrics svgparse assets] :as cfg}] + [{:keys [session rpc oauth metrics svgparse assets feedback] :as cfg}] (rr/router [["/metrics" {:get (:handler metrics)}] @@ -136,6 +136,8 @@ [middleware/cookies]]} ["/svg" {:post svgparse}] + ["/feedback" {:middleware [(:middleware session)] + :post feedback}] ["/oauth" ["/google" {:post (get-in oauth [:google :handler])}] diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 20d4177db..024310bd2 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -112,6 +112,7 @@ :svgparse (ig/ref :app.svgparse/handler) :storage (ig/ref :app.storage/storage) :sns-webhook (ig/ref :app.http.awsns/handler) + :feedback (ig/ref :app.http.feedback/handler) :error-report-handler (ig/ref :app.loggers.mattermost/handler)} :app.http.assets/handlers @@ -121,6 +122,9 @@ :cache-max-age (dt/duration {:hours 24}) :signature-max-age (dt/duration {:hours 24 :minutes 5})} + :app.http.feedback/handler + {:pool (ig/ref :app.db/pool)} + :app.http.oauth/all {:google (ig/ref :app.http.oauth/google) :gitlab (ig/ref :app.http.oauth/gitlab) diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index af91b913e..e236eac4e 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -135,7 +135,6 @@ 'app.rpc.mutations.projects 'app.rpc.mutations.viewer 'app.rpc.mutations.teams - 'app.rpc.mutations.feedback 'app.rpc.mutations.ldap 'app.rpc.mutations.verify-token) (map (partial process-method cfg)) diff --git a/backend/src/app/rpc/mutations/feedback.clj b/backend/src/app/rpc/mutations/feedback.clj deleted file mode 100644 index 875a93985..000000000 --- a/backend/src/app/rpc/mutations/feedback.clj +++ /dev/null @@ -1,41 +0,0 @@ -;; 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/. -;; -;; This Source Code Form is "Incompatible With Secondary Licenses", as -;; defined by the Mozilla Public License, v. 2.0. -;; -;; Copyright (c) 2021 UXBOX Labs SL - -(ns app.rpc.mutations.feedback - (:require - [app.common.exceptions :as ex] - [app.common.spec :as us] - [app.config :as cfg] - [app.db :as db] - [app.emails :as emails] - [app.rpc.queries.profile :as profile] - [app.util.services :as sv] - [clojure.spec.alpha :as s])) - -(s/def ::subject ::us/string) -(s/def ::content ::us/string) - -(s/def ::send-profile-feedback - (s/keys :req-un [::profile-id ::subject ::content])) - -(sv/defmethod ::send-profile-feedback - [{:keys [pool] :as cfg} {:keys [profile-id subject content] :as params}] - (when-not (:feedback-enabled cfg/config) - (ex/raise :type :validation - :code :feedback-disabled - :hint "feedback module is disabled")) - - (db/with-atomic [conn pool] - (let [profile (profile/retrieve-profile-data conn profile-id)] - (emails/send! conn emails/feedback - {:to (:feedback-destination cfg/config) - :profile profile - :subject subject - :content content}) - nil))) diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index 462284eb5..2ec5b3e26 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -106,6 +106,12 @@ (seq params)) (send-mutation! id form))) +(defmethod mutation :send-feedback + [id params] + (let [uri (str cfg/public-uri "/api/feedback")] + (->> (http/send! {:method :post :uri uri :body params}) + (rx/mapcat handle-response)))) + (defmethod mutation :update-profile-photo [id params] (let [form (js/FormData.)] diff --git a/frontend/src/app/main/ui/settings/feedback.cljs b/frontend/src/app/main/ui/settings/feedback.cljs index 125303a23..1f8e88519 100644 --- a/frontend/src/app/main/ui/settings/feedback.cljs +++ b/frontend/src/app/main/ui/settings/feedback.cljs @@ -30,16 +30,7 @@ (s/def ::feedback-form (s/keys :req-un [::subject ::content])) -(defn- on-error - [form error] - (st/emit! (dm/error (tr "errors.generic")))) - -(defn- on-success - [form] - (st/emit! (dm/success (tr "notifications.profile-saved")))) - - -(mf/defc options-form +(mf/defc feedback-form [] (let [profile (mf/deref refs/profile) form (fm/use-form :spec ::feedback-form) @@ -50,6 +41,7 @@ (mf/use-callback (mf/deps profile) (fn [event] + (reset! loading false) (st/emit! (dm/success (tr "labels.feedback-sent"))) (swap! form assoc :data {} :touched {} :errors {}))) @@ -58,7 +50,7 @@ (mf/deps profile) (fn [{:keys [code] :as error}] (reset! loading false) - (if (= code :feedbck-disabled) + (if (= code :feedback-disabled) (st/emit! (dm/error (tr "labels.feedback-disabled"))) (st/emit! (dm/error (tr "errors.generic")))))) @@ -68,9 +60,8 @@ (fn [form event] (reset! loading true) (let [data (:clean-data @form)] - (prn "on-submit" data) - (->> (rp/mutation! :send-profile-feedback data) - (rx/subs on-succes on-error #(reset! loading false))))))] + (->> (rp/mutation! :send-feedback data) + (rx/subs on-succes on-error)))))] [:& fm/form {:class "feedback-form" :on-submit on-submit @@ -117,4 +108,4 @@ [] [:div.dashboard-settings [:div.form-container - [:& options-form]]]) + [:& feedback-form]]])