From 54b41cae6b8482ff376a05b0f5d68487fe5757f0 Mon Sep 17 00:00:00 2001 From: Rokas Ramanauskas Date: Mon, 19 Jul 2021 17:36:38 +0300 Subject: [PATCH] Data file deletion via API (#333) --- api/src/api/resource.clj | 6 +++-- api/src/api/server.clj | 39 ++++++++++++++++++++-------- api/src/data/entities/data_files.clj | 26 +++++++++---------- 3 files changed, 45 insertions(+), 26 deletions(-) diff --git a/api/src/api/resource.clj b/api/src/api/resource.clj index cbaa8ac57..cb04dbd9e 100755 --- a/api/src/api/resource.clj +++ b/api/src/api/resource.clj @@ -21,8 +21,10 @@ :updatedAt (ts-now), :variants ["Text value."]}}} :nlg-bulk {:post {:application/json {:resultIds (take 10 (repeatedly utils/gen-uuid))}}} - :accelerated-text-data-files {:post {:application/json {:message "Succesfully uploaded file" - :id (utils/gen-uuid)}}} + :accelerated-text-data-files {:post {:application/json {:message "Succesfully uploaded file" + :id (utils/gen-uuid)}} + :delete {:application/json {:message "Succesfully deleted file" + :id (utils/gen-uuid)}}} :health {:get {:application/json {:health "Ok"}}} :status {:get {:application/json {:color "green" :services {"service" true}}}}}) diff --git a/api/src/api/server.clj b/api/src/api/server.clj index 3387e2d1f..de73e09dc 100755 --- a/api/src/api/server.clj +++ b/api/src/api/server.clj @@ -109,17 +109,34 @@ :handler service/delete-result} :options {:handler cors-handler :no-doc true}}] - ["/accelerated-text-data-files/" {:parameters {:multipart {:file multipart/bytes-part}} - :post (fn [request] - (let [{params :params auth-info :auth-info} (multipart-handler request) - id (data-files/store! (get params "file") (:group-id auth-info))] - {:status 200 - :body {:message "Succesfully uploaded file" :id id}})) - :coercion reitit.coercion.spec/coercion - :summary "Upload a file" - :responses {200 {:body {:message string? - :id string?} - :examples (get-in response-examples [:accelerated-text-data-files :post])}}}] + ["/accelerated-text-data-files/" + {:post {:parameters {:multipart {:file multipart/bytes-part}} + :coercion reitit.coercion.spec/coercion + :summary "Upload a file" + :responses {200 {:body {:message string? + :id string?} + :examples (get-in response-examples [:accelerated-text-data-files :post])}} + :handler (fn [request] + (let [{params :params auth-info :auth-info} (multipart-handler request) + id (data-files/store! (get params "file") (:group-id auth-info))] + {:status 200 + :body {:message "Succesfully uploaded file" :id id}}))} + :delete {:parameters {:body {:id string?}} + :responses {200 {:body {:message string? + :id string?} + :examples (get-in response-examples [:accelerated-text-data-files :delete])}} + :coercion reitit.coercion.spec/coercion + :summary "Delete data file" + :middleware [muuntaja/format-request-middleware + coercion/coerce-request-middleware + coercion/coerce-response-middleware] + :handler (fn [{{{id :id} :body} :parameters auth-info :auth-info}] + (if (data-files/delete-data-file! id (:group-id auth-info)) + {:status 200 + :body {:message "Succesfully deleted file" :id id}} + {:status 404}))} + :options {:handler cors-handler + :no-doc true}}] ["/swagger.json" {:get {:no-doc true :swagger {:info {:title "nlg-api"}} :handler (swagger/create-swagger-handler)}}] diff --git a/api/src/data/entities/data_files.clj b/api/src/data/entities/data_files.clj index 5fb50628c..c1df09a21 100644 --- a/api/src/data/entities/data_files.clj +++ b/api/src/data/entities/data_files.clj @@ -45,15 +45,15 @@ (db/read! data-files-db (build-key key group-id))) (defn delete-data-file! [key group-id] - (log/infof "Deleting data file: `%s`" key) - (db/delete! data-files-db (build-key key group-id))) + (when (read-data-file key group-id) + (log/infof "Deleting data file: `%s`" key) + (db/delete! data-files-db (build-key key group-id)))) (defn store! "Expected keys are :filename and :content everything else is optional" [{filename :filename :as data-file} group-id] (let [key (build-key filename group-id)] - (when (some? (read-data-file filename group-id)) - (delete-data-file! filename group-id)) + (delete-data-file! filename group-id) (log/infof "Storing data file: `%s`" filename) (db/write! data-files-db key #::data-file{:name filename @@ -62,12 +62,16 @@ (user-group/link-file group-id key)) filename) +(defn drop-group-id [key] + (when (some? key) + (last (re-find #"(.+?)#(.+)" key)))) + (defn parse-data ([data-file] (parse-data data-file 0 Integer/MAX_VALUE)) ([{::data-file/keys [id name content]} offset limit] (let [[header & rows] (map #(map str/trim %) (cond-> content (some? content) (csv/read-csv)))] - {:id id + {:id (drop-group-id id) :filename name :header (vec header) :rows (take limit (drop offset rows)) @@ -97,9 +101,9 @@ (defn fetch-most-relevant [id offset limit group-id] (let [{:keys [filename header rows total]} (some-> (read-data-file id group-id) (parse-data)) - sampled-rows (row-selection/sample rows (:relevant-items-limit conf)) - m (row-selection/distance-matrix sampled-rows) - selected-rows (drop offset (row-selection/select-rows m sampled-rows limit))] + sampled-rows (row-selection/sample rows (:relevant-items-limit conf)) + m (row-selection/distance-matrix sampled-rows) + selected-rows (drop offset (row-selection/select-rows m sampled-rows limit))] {:id id :fileName filename :fieldNames header @@ -122,9 +126,6 @@ (some-> (read-data-file id group-id) (read-content offset limit))) -(defn swap-data-id [{:keys [fileName] :as data}] - (assoc data :id fileName)) - (defn listing ([group-id] (listing group-id 0 Integer/MAX_VALUE 0 Integer/MAX_VALUE)) ([group-id offset limit recordOffset recordLimit] @@ -132,8 +133,7 @@ {:dataFiles (->> data-files (drop offset) (take limit) - (map #(read-content % recordOffset recordLimit)) - (map swap-data-id)) + (map #(read-content % recordOffset recordLimit))) :offset offset :limit limit :totalCount (count data-files)})))