Skip to content

Instantly share code, notes, and snippets.

@Otann
Created May 15, 2015 15:18
Show Gist options
  • Save Otann/ffc1df363f37956fac5f to your computer and use it in GitHub Desktop.
Save Otann/ffc1df363f37956fac5f to your computer and use it in GitHub Desktop.
(ns saferwatch.handler
(:gen-class)
(:require [clojure.zip :as zip]
[clojure.data.xml :as data-xml]
[clojure.data.zip.xml :refer [xml1-> text]]
[environ.core :refer [env]]
[compojure.core :refer [defroutes GET]]
[compojure.route :as route]
[compojure.handler :as handler]
[ring.middleware.json :refer [wrap-json-response]]
[ring.util.response :refer [response]]
[clj-http.client :as http]))
(defn number-parameter [prefix number]
"Construct url parameter based on prefix"
(case (clojure.string/upper-case prefix)
"DOT" (str "&dotNumber=" number)
("MC" "FF" "MX") (str "&docketNumber=" prefix number)
(throw (IllegalArgumentException. "Unsupported prefix"))))
(defn get-safety-data [prefix number]
"Get RAW xml from SaferWatch"
(let [hostname (env :hostname)
lookup-url (str hostname "/CarrierService30.php"
"?Action=CarrierLookup"
"&ServiceKey=" (env :webservice-key)
"&CustomerKey=" (env :customer-key)
(number-parameter prefix number))
response (http/get lookup-url {:as :xml})
body (:body response)]
body))
(defn convert-data [safety-data]
"Converts data from raw XML SaferWatch format to clojure data"
(let [parsed (data-xml/parse-str safety-data)
zipper (zip/xml-zip parsed)
detail (xml1-> zipper :CarrierDetails)]
{:identity {:legal-name (xml1-> detail :Identity :legalName text)
:real-name (xml1-> detail :Identity :dbaName text)
:address {:street (xml1-> detail :Identity :businessStreet text)
:city (xml1-> detail :Identity :businessCity text)
:state (xml1-> detail :Identity :businessState text)
:zip (xml1-> detail :Identity :businessZipCode text)}}
:safety {:rating (xml1-> detail :Safety :rating text)
:rating-date (xml1-> detail :Safety :ratingDate text)}
:equipment {:drivers-total (xml1-> detail :Drivers :driversTotal text)
:trucks-total (xml1-> detail :Equipment :trucksTotal text)}
:risks {:overall (xml1-> detail :RiskAssessment :Overall text)
:authority (xml1-> detail :RiskAssessment :Authority text)
:insurance (xml1-> detail :RiskAssessment :Insurance text)
:safety (xml1-> detail :RiskAssessment :Safety text)
:operation (xml1-> detail :RiskAssessment :Operation text)
:other (xml1-> detail :RiskAssessment :Other text)}}))
(defroutes routes
(GET "/" [] "Hello there")
(GET "/:prefix/:number" [prefix number]
(response (get-safety prefix number)))
(route/not-found "Not Found!!11"))
(def app
(-> (handler/api routes)
(wrap-json-response)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment