(ns sample.web
  (:require [compojure.core :refer [defroutes GET PUT POST DELETE ANY]]
            [compojure.handler :refer [site]]
            [ring.middleware.stacktrace :as trace]
            [ring.middleware.session.cookie :as cookie]
            [ring.adapter.jetty :as jetty]
            [ring.middleware.basic-authentication :as basic]
            [cemerick.drawbridge :as drawbridge]
            [environ.core :as env]))

(defroutes app
  (GET "/" []
       {:status 200
        :headers {"Content-Type" "text/plain"}
        :body (pr-str ["Hello" :from 'Heroku])}))

(defn authenticated? [name pass]
  (= [name pass] [(env/env :repl_user) (env/env :repl_pass)]))

(defn wrap-drawbridge [handler]
  (fn [req]
    (let [handler (if (= "/repl" (:uri req))
                    (basic/wrap-basic-authentication
                     (cemerick.drawbridge/ring-handler) authenticated?)
                    handler)]
      (handler req))))

(defn -main [& [port]]
  (let [port (Integer. (or port (env/env :port) 5000))
        ;; TODO: run `heroku config:add SESSION_SECRET=$RANDOM_16_CHARS`
        store (cookie/cookie-store {:key (env/env :session-secret)})]
    (jetty/run-jetty (-> #'app
                         (wrap-drawbridge)
                         ((if (env/env :dev)
                            trace/wrap-stacktrace
                            identity))
                         (site {:session {:store store}}))
                     {:port port :join? false})))

;; For interactive development:
;; (.stop server)
;; (def server (-main))

Generated by Phil Hagelberg using scpaste at Tue Aug 7 14:18:29 2012. PDT. (original)