clojurecup2015-mailhead/src/mailhead/routes/home.clj

58 lines
2.1 KiB
Clojure

(ns mailhead.routes.home
(:require [mailhead.layout :as layout]
[mailhead.visualize :as v]
[mailhead.parser :as parser]
[clj-time.core :as time]
[compojure.core :refer [defroutes GET POST]]
[ring.util.response :refer [redirect]]
[ring.util.http-response :refer [ok content-type]]
[clojure.java.io :as io]))
(defn home-page []
(layout/render "home.html"))
(defn about-page []
(layout/render "about.html"))
(defn find-header [parsed-email header]
(let [headers (:headers parsed-email)]
(first (parser/find-headers headers header))))
(defn calculate-travel-time [parsed-email-headers]
(let [start-date (:time (first (reverse parsed-email-headers)))
end-date (:time (last (reverse parsed-email-headers)))]
(if (time/after? end-date start-date)
(time/in-seconds (time/interval start-date end-date))
nil)))
(defn show-result [message-string]
(if (empty? (parser/parse message-string))
(layout/render "parser-error.html" {:mailheader message-string})
(let [parsed-email (parser/parse-all message-string)
parsed-email-headers (parser/parse message-string)
token (v/draw parsed-email-headers)]
(layout/render "result.html"
{:mailheader message-string
:from (:address (first (:from parsed-email)))
:to (:address (first (:to parsed-email)))
:mailer (find-header parsed-email "X-Mailer")
:traveltime (calculate-travel-time parsed-email-headers)
:token token}))))
(defn show-sample [index]
(let [email-content (slurp (str "sample-data/example" index ".eml"))]
(show-result email-content)))
(defn generated-image [token]
(-> (clojure.java.io/input-stream (str "generated-images/" token ".svg"))
ok
(content-type "image/svg+xml")))
(defroutes home-routes
(GET "/" [] (home-page))
(GET "/image/:token" [token] (generated-image token))
(POST "/analyze" [mailheader] (show-result mailheader))
(GET "/example/:index" [index] (show-sample index))
(GET "/about" [] (about-page)))