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