PageRenderTime 53ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/analytics.clj/src/analytics/clj/core.clj

https://github.com/trydionel/misc.clj
Clojure | 79 lines | 64 code | 15 blank | 0 comment | 0 complexity | f6da49d7e106a07aea73bcd7dfc861ce MD5 | raw file
  1. (ns analytics.clj.core
  2. (:require redis)
  3. (:use aleph
  4. analytics.clj.routing
  5. clojure.contrib.str-utils
  6. [clojure.contrib.duck-streams :only [pwd]])
  7. (:import java.io.File)
  8. (:gen-class))
  9. (def *redis-server* {:host "127.0.0.1", :port 6379, :db 1})
  10. (defmacro redis-request [& forms]
  11. "Issues the given forms against the redis-server"
  12. `(redis/with-server
  13. *redis-server*
  14. (do ~@forms)))
  15. (defn now
  16. "Returns the current time in nanos since Jan 1 1970"
  17. []
  18. (System/nanoTime))
  19. (defn record-event [sid event]
  20. (redis-request
  21. (redis/zadd sid (now) event)
  22. (redis/rpush "sids" sid)))
  23. (defn get-events [sid]
  24. (redis-request
  25. (redis/zrange sid 0 -1)))
  26. (defmacro with-layout [& forms]
  27. `(str "<html><body>" ~@forms "</body></html>"))
  28. (defn make-response [body]
  29. {:status 200
  30. :headers {"Content-Type" "text/html",
  31. "Content-Length" (count body)}
  32. :body body})
  33. (defn not-found-response
  34. {:status 404
  35. :headers {"Content-Type" "text/html"}
  36. :body nil})
  37. (defn serve-file [name]
  38. (File. (str (pwd) "/public/" name)))
  39. (defn home-response [request]
  40. (respond! request
  41. {:status 200
  42. :headers {"Content-Type" "text/html"}
  43. :body (serve-file "index.html")}))
  44. (defn new-event-response [request]
  45. (do
  46. (future (record-event ((request :params) :sid) ((request :params) :event)))
  47. (respond! request (make-response "OK"))))
  48. (defn get-events-response [request]
  49. (future
  50. (let [events (get-events ((request :params) :sid))
  51. body (str "{events:[" (str-join "," events) "]}")]
  52. (respond! request (make-response body)))))
  53. (defn javascript-response [request]
  54. (future
  55. (respond! request {:status 200
  56. :headers {"Content-Type" "text/javascript"}
  57. :body (serve-file (str ((request :params) :file) ".js"))})))
  58. (defrouter router
  59. (route "/" home-response)
  60. (route "/events/new" new-event-response)
  61. (route "/events/:sid" get-events-response)
  62. (route "/:file.js" javascript-response))
  63. (defn -main [& args]
  64. (run-aleph router {:port 8080}))