From 0a1a82f73897492f1e4ac2bd7935d0ea1b38f4f9 Mon Sep 17 00:00:00 2001
From: Cam Saul <cam@geotip.com>
Date: Tue, 31 Mar 2015 15:15:29 -0700
Subject: [PATCH] GET emailreport handles filtering correctly

---
 project.clj                         |  2 +-
 src/metabase/api/emailreport.clj    | 29 ++++++++++++++++++-----------
 src/metabase/db.clj                 |  3 ++-
 src/metabase/models/emailreport.clj | 14 ++++++++------
 4 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/project.clj b/project.clj
index 7e6784f8e94..da347cb603f 100644
--- a/project.clj
+++ b/project.clj
@@ -65,7 +65,7 @@
                              [lein-ancient "0.6.5"]                   ; Check project for outdated dependencies + plugins w/ 'lein ancient'
                              [lein-bikeshed "0.2.0"]                  ; Linting
                              [lein-expectations "0.0.8"]              ; run unit tests with 'lein expectations'
-                             [lein-instant-cheatsheet "2.1.0"]        ; use awesome instant cheatsheet created by yours truly w/ 'lein instant-cheatsheet'
+                             [lein-instant-cheatsheet "2.1.1"]        ; use awesome instant cheatsheet created by yours truly w/ 'lein instant-cheatsheet'
                              [lein-marginalia "0.8.0"]]               ; generate documentation with 'lein marg'
                    :jvm-opts ["-Dlogfile.path=target/log"
                               "-Xms1024m"                             ; give JVM a decent heap size to start with
diff --git a/src/metabase/api/emailreport.clj b/src/metabase/api/emailreport.clj
index 7293e94feab..38cd85bb31c 100644
--- a/src/metabase/api/emailreport.clj
+++ b/src/metabase/api/emailreport.clj
@@ -34,20 +34,27 @@
      :databases dbs
      :users users}))
 
+(defendpoint GET "/"
+  "Fetch `EmailReports` for ORG. With filter option F (default: `:all`):
 
-(defendpoint GET "/" [org f]
-  ;; TODO - filter by f == "mine"
-  ;; TODO - filter by creator == self OR public_perms > 0
+   *  `all`  - return reports created by current user + any other publicly visible reports
+   *  `mine` - return reports created by current user"
+  [org f]
   {org Required, f FilterOptionAllOrMine}
   (read-check Org org)
-  (-> (sel :many EmailReport
-        (where {:organization_id org})
-        (where {:public_perms [> common/perms-none]})
-        (order :name :ASC))
-    (hydrate :creator :organization :can_read :can_write :recipients)))
-
-
-(defendpoint POST "/" [:as {{:keys [dataset_query description email_addresses mode name organization public_perms schedule] :as body} :body}]
+  (let [all? (= (or (keyword f) :all) :all)]
+    (-> (sel :many EmailReport
+             (where {:organization_id org})
+             (where (or {:creator_id *current-user-id*}
+                        (when all?
+                          {:public_perms [> common/perms-none]})))
+             (order :name :ASC))
+        (hydrate :creator :organization :can_read :can_write :recipients))))
+
+
+(defendpoint POST "/"
+  "Create a new `EmailReport`."
+  [:as {{:keys [dataset_query description email_addresses mode name organization public_perms schedule] :as body} :body}]
   {dataset_query  Required
    name           Required
    organization   Required
diff --git a/src/metabase/db.clj b/src/metabase/db.clj
index 3e0752b3a06..069a9ef1290 100644
--- a/src/metabase/db.clj
+++ b/src/metabase/db.clj
@@ -155,7 +155,8 @@
 
    Returns true if update modified rows, false otherwise."
   [entity entity-id & {:as kwargs}]
-  (let [obj (pre-update entity kwargs)
+  (let [obj (-> (pre-update entity (assoc kwargs :id entity-id))
+                (dissoc :id))
         result (-> (update entity (set-fields obj) (where {:id entity-id}))
                    (> 0))]
     (when result
diff --git a/src/metabase/models/emailreport.clj b/src/metabase/models/emailreport.clj
index 86e063f6ea0..98124f838da 100644
--- a/src/metabase/models/emailreport.clj
+++ b/src/metabase/models/emailreport.clj
@@ -91,12 +91,14 @@
         (assoc :dataset_query (json/write-str dataset_query)
                :schedule (json/write-str schedule)))))
 
-(defmethod pre-update EmailReport [_ {:keys [version dataset_query schedule] :as report}]
-  (assoc report
-    :updated_at    (util/new-sql-timestamp)
-    :dataset_query (json/write-str dataset_query)
-    :schedule      (json/write-str schedule)
-    :version       (inc version)))
+(defmethod pre-update EmailReport [_ {:keys [version dataset_query schedule id] :as report}]
+  (let [version (or version
+                    (sel :one :field [EmailReport :version] :id id))]
+    (assoc report
+           :updated_at    (util/new-sql-timestamp)
+           :dataset_query (json/write-str dataset_query)
+           :schedule      (json/write-str schedule)
+           :version       (inc version))))
 
 
 (defmethod post-select EmailReport [_ {:keys [id creator_id organization_id] :as report}]
-- 
GitLab