yenu/src/clj/yenu/routes/admin.clj

104 lines
3.8 KiB
Clojure
Raw Normal View History

2017-03-15 00:28:27 +01:00
(ns yenu.routes.admin
(:require [yenu.layout :as layout]
2017-02-27 23:31:53 +01:00
[compojure.core :refer [defroutes GET POST]]
[ring.util.http-response :as response]
2017-02-27 23:31:53 +01:00
[ring.util.response :refer [redirect]]
[clojure.java.io :as io]
2017-03-04 00:43:17 +01:00
[yenu.helpers.images :as images]
[yenu.db.core :as db]
[clojure.string :as str])
2017-02-27 23:31:53 +01:00
(:import [java.io File FileInputStream FileOutputStream]))
2017-02-27 23:31:53 +01:00
(defn decoded-url-file [filepath]
(java.net.URLDecoder/decode filepath "utf-8"))
(defn upload-file [{:keys [tempfile size filename]}]
(let [target-filepath (decoded-url-file (images/data-path "to-process" filename))]
(try
(with-open [in (new FileInputStream tempfile)
out (new FileOutputStream target-filepath)]
(let [src (.getChannel in)
dst (.getChannel out)]
(.transferFrom dst src 0 (.size src))
(.flush out))))
target-filepath))
2017-03-04 00:43:17 +01:00
(defn add-tag [image-id tag]
(db/create-tag! {:tagname tag})
(let [{tag-id :id} (db/get-tag {:tagname tag})]
(db/add-tag-to-image! {:imageid image-id :tagid tag-id})))
2017-04-03 21:50:41 +02:00
(defn add-tags-for-image [image-id tag-string]
(let [all-tags (str/split tag-string, #"(\s*,\s*|\s+)")]
(run! #(add-tag image-id %) all-tags)))
2017-03-15 00:28:27 +01:00
(defn add-image-to-database [filehash title description tags]
2017-03-04 00:43:17 +01:00
(let [img (db/create-image! {:hash filehash :title title :description description})
2017-04-03 21:50:41 +02:00
image-id ((keyword "last_insert_rowid()") img)]
(add-tags-for-image image-id tags)))
2017-03-04 00:43:17 +01:00
2017-03-29 22:48:29 +02:00
(defn delete-image! [id request]
(let [image (db/get-image {:id id})]
(db/delete-image! {:id id})
(db/delete-image-tags! {:id id})
(db/delete-image-comments! {:id id})
(images/delete-image! (:hash image))))
2017-04-03 21:21:48 +02:00
(defn comment-stream []
(let [comments (db/get-recent-comments {:num-comments 20})]
2017-04-23 22:33:28 +02:00
(layout/render-file "comments.html" {:comments comments})))
2017-04-03 21:21:48 +02:00
2017-04-03 21:50:41 +02:00
(defn edit-image-form [id request]
(let [image (db/get-image {:id id})
tags (db/get-tags-for-image {:id id})]
2017-04-23 22:33:28 +02:00
(layout/render-file "admin/upload.html" {:image image :tags tags})))
2017-04-03 21:50:41 +02:00
(defn edit-image! [id title description tags request]
(db/edit-image! {:id id :title title :description description})
(db/delete-image-tags! {:id id})
(add-tags-for-image id tags))
2017-04-15 23:08:11 +02:00
(defn image-id-from-comment [id]
(:image_id (db/get-comment {:id id})))
2017-03-15 00:28:27 +01:00
(defroutes admin-routes
2017-03-29 22:14:55 +02:00
(GET "/upload" [:as request]
2017-04-23 22:33:28 +02:00
(-> (layout/render-file
2017-03-29 22:14:55 +02:00
"admin/upload.html"
{:flash (:flash request)})))
2017-03-04 00:43:17 +01:00
(POST "/upload" [file title description tags]
2017-05-03 22:02:20 +02:00
(let [filename (upload-file file)
imghash (images/scale-image-and-save filename)]
2017-05-11 20:56:21 +02:00
(images/remove-temp-image filename)
2017-05-03 22:02:20 +02:00
(if imghash
(do
(add-image-to-database imghash title description tags)
(-> (redirect "/upload")
(assoc :flash {:message "Upload successfull" :type "success"})))
2017-05-03 22:02:20 +02:00
(-> (redirect "/upload")
(assoc :flash {:message "Upload failed" :type "danger"})))))
2017-03-29 14:39:03 +02:00
2017-03-29 22:48:29 +02:00
(GET "/delete/:id" [id :as request]
(delete-image! id request)
(-> (redirect "/page/1")
(assoc :flash {:message "Image deleted" :type "danger"})))
2017-04-03 21:50:41 +02:00
2017-04-15 23:08:11 +02:00
(GET "/delete-comment/:id" [id]
(let [image-id (image-id-from-comment id)]
(db/delete-comment! {:id id})
(-> (redirect (str "/show/" image-id))
(assoc :flash {:message "Comment deleted" :type "danger"}))))
2017-04-15 23:08:11 +02:00
2017-04-03 21:50:41 +02:00
(GET "/edit/:id" [id :as request]
(edit-image-form id request))
(POST "/edit/:id" [id title description tags :as request]
(edit-image! id title description tags request)
(-> (redirect (str "/show/" id))
(assoc :flash {:message "Image edited" :type "success"})))
2017-03-29 22:48:29 +02:00
2017-03-29 14:39:03 +02:00
(GET "/statistics" []
2017-04-23 22:33:28 +02:00
(layout/render-file "statistics.html"))
2017-03-29 14:39:03 +02:00
(GET "/comments" []
2017-04-03 21:21:48 +02:00
(comment-stream)))