blob: 33a247f969ab9694f1877a825473c441847e5fe4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
(ns utils
(:import java.text.SimpleDateFormat
java.util.Date)
(:use clojure.contrib.json.write
clojure.contrib.sql))
(let [db-host "localhost"
db-port 5432
db-name "dumpfm"]
(def *db* {:classname "org.postgresql.Driver"
:subprotocol "postgresql"
:subname (str "//" db-host ":" db-port "/" db-name)
:user "postgres"
:password "root"}))
;; JSON responses
(def yyyy-mm-dd-formatter (new SimpleDateFormat "yyyy-MM-dd"))
(defmethod print-json Date
[d]
(print-json (.format yyyy-mm-dd-formatter d)))
(defn resp-error [message]
{:status 400 :headers {} :body message})
(defn resp-success [message]
{:status 200 :headers {} :body (json-str message)})
;; Database
(defn do-select [query]
(with-connection *db*
(with-query-results rs query
(doall rs))))
(defn do-count [query]
((first (with-connection *db*
(with-query-results rs query
(doall rs))))
:count))
;; Stats
(defn msg-stats [ts]
(let [qry (str "SELECT created_on::date, count(*) FROM messages "
"GROUP BY created_on::date "
"ORDER BY created_on::date")]
(do-select [qry])))
(defn new-user-stats [ts]
(let [qry (str "SELECT created_on::date, count(*) FROM users "
"GROUP BY created_on::date "
"ORDER BY created_on::date")]
(do-select [qry])))
(defn msgs-per-user-stats [ts]
true)
(def *stat-map* {"msgs" msg-stats
"new users" new-user-stats
"msgs per user" msgs-per-user-stats})
(defn stats [session params]
(let [stat (params :stat)
ts (params :timescale)]
(if-let [f (*stat-map* stat)]
(resp-success (f ts))
(resp-error "UNKNOWN STAT"))))
(defn validated-stats [session params]
(if (session :is_admin)
(stats session params)
(resp-error "BAD_REQUEST")))
;; Parsing
(defn maybe-parse-int [s f]
(if s (Integer/parseInt s) f))
(defn maybe-parse-long [s f]
(if s (Long/parseLong s) f))
|