aboutsummaryrefslogtreecommitdiff
path: root/src/pics/handler/upload.clj
blob: d3fa2cc0eae9e77395a32f0f2945a946a0e4d72c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(ns pics.handler.upload
  (:require [clojure.string :as cstr]
            [dotenv :as env]
            [ring.util.response :as ruresp]
            [clojure.java.io :as cjio]))

(def ^:private name-chars "abcdefghijklmnopqrstuvwxyz")
(defn gen-random-name []
  (->> (map (fn [_] (rand-nth name-chars))
            (range 10))
       vec
       (apply str)))

(defn save-image [multipart-params name]
  (cjio/copy (get-in multipart-params ["image" :tempfile])
             (cjio/file (str "./img/" name "." (-> multipart-params
                                                   (get-in ["image" :content-type])
                                                   (cstr/split #"\/")
                                                   second)))))

(defn authorized? [multipart-params]
  (let [auth-keys-str (env/env "AUTH_KEYS")
        auth-keys (delay (cstr/split auth-keys-str #","))]
    (and (not (cstr/blank? auth-keys-str))
         (some #(= % (get multipart-params "auth-key")) @auth-keys))))

(defn handle [req]
  (let [multipart-params (:multipart-params req)
        name (gen-random-name)]
    (if (authorized? multipart-params)
      (do (save-image multipart-params name)
          (ruresp/response (str "http://" (:server-name req)
                                (when (not= (:server-port req) 80)
                                  (str ":" (:server-port req)))
                                "/" name)))
      (-> (ruresp/response "Forbidden.")
          (ruresp/status 403)))))