58 lines
2.1 KiB
Clojure
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)))
|