(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)))))