|
|
|
@ -13,102 +13,91 @@ |
|
|
|
(defn get-current-date [] |
|
|
|
(defn get-current-date [] |
|
|
|
(str (java.util.Date.))) |
|
|
|
(str (java.util.Date.))) |
|
|
|
|
|
|
|
|
|
|
|
; hierarchy levels |
|
|
|
|
|
|
|
(def note "note") |
|
|
|
|
|
|
|
(def published "published") |
|
|
|
|
|
|
|
(def edited "edited") |
|
|
|
|
|
|
|
(def views "views") |
|
|
|
|
|
|
|
(def password "password") |
|
|
|
|
|
|
|
(def sessions "sessions") |
|
|
|
|
|
|
|
(def short-url "short-url") |
|
|
|
|
|
|
|
(def publisher "publisher") |
|
|
|
|
|
|
|
(def publisher-key "publisher-key") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(defn valid-publisher? [pid] |
|
|
|
(defn valid-publisher? [pid] |
|
|
|
(= 1 (redis :hexists publisher-key pid))) |
|
|
|
(= 1 (redis :hexists :publisher-key pid))) |
|
|
|
|
|
|
|
|
|
|
|
(defn register-publisher [pid] |
|
|
|
(defn register-publisher [pid] |
|
|
|
"Returns nil if given PID exists or a PSK otherwise" |
|
|
|
"Returns nil if given PID exists or a PSK otherwise" |
|
|
|
(when (not (valid-publisher? pid)) |
|
|
|
(when (not (valid-publisher? pid)) |
|
|
|
(let [psk (encrypt (str (rand-int Integer/MAX_VALUE) pid))] |
|
|
|
(let [psk (encrypt (str (rand-int Integer/MAX_VALUE) pid))] |
|
|
|
(redis :hset publisher-key pid psk) |
|
|
|
(redis :hset :publisher-key pid psk) |
|
|
|
psk))) |
|
|
|
psk))) |
|
|
|
|
|
|
|
|
|
|
|
(defn revoke-publisher [pid] |
|
|
|
(defn revoke-publisher [pid] |
|
|
|
(redis :hdel publisher-key pid)) |
|
|
|
(redis :hdel :publisher-key pid)) |
|
|
|
|
|
|
|
|
|
|
|
(defn get-psk [pid] |
|
|
|
(defn get-psk [pid] |
|
|
|
(redis :hget publisher-key pid)) |
|
|
|
(redis :hget :publisher-key pid)) |
|
|
|
|
|
|
|
|
|
|
|
(defn create-session [] |
|
|
|
(defn create-session [] |
|
|
|
(let [token (encrypt (str (rand-int Integer/MAX_VALUE)))] |
|
|
|
(let [token (encrypt (str (rand-int Integer/MAX_VALUE)))] |
|
|
|
(do (redis :sadd sessions token) |
|
|
|
(do (redis :sadd :sessions token) |
|
|
|
token))) |
|
|
|
token))) |
|
|
|
|
|
|
|
|
|
|
|
(defn invalidate-session [token] |
|
|
|
(defn invalidate-session [token] |
|
|
|
(let [was-valid (redis :sismember sessions token)] |
|
|
|
(let [was-valid (redis :sismember :sessions token)] |
|
|
|
(redis :srem sessions token) |
|
|
|
(redis :srem :sessions token) |
|
|
|
(= 1 was-valid))) |
|
|
|
(= 1 was-valid))) |
|
|
|
|
|
|
|
|
|
|
|
(defn edit-note [noteID text] |
|
|
|
(defn edit-note [noteID text] |
|
|
|
(redis :hset edited noteID (get-current-date)) |
|
|
|
(redis :hset :edited noteID (get-current-date)) |
|
|
|
(redis :hset note noteID text)) |
|
|
|
(redis :hset :note noteID text)) |
|
|
|
|
|
|
|
|
|
|
|
(defn add-note |
|
|
|
(defn add-note |
|
|
|
([noteID text pid] (add-note noteID text pid nil)) |
|
|
|
([noteID text pid] (add-note noteID text pid nil)) |
|
|
|
([noteID text pid passwd] |
|
|
|
([noteID text pid passwd] |
|
|
|
(redis :hset note noteID text) |
|
|
|
(redis :hset :note noteID text) |
|
|
|
(redis :hset published noteID (get-current-date)) |
|
|
|
(redis :hset :published noteID (get-current-date)) |
|
|
|
(redis :hset publisher noteID pid) |
|
|
|
(redis :hset :publisher noteID pid) |
|
|
|
(when (not (blank? passwd)) |
|
|
|
(when (not (blank? passwd)) |
|
|
|
(redis :hset password noteID passwd)))) |
|
|
|
(redis :hset :password noteID passwd)))) |
|
|
|
|
|
|
|
|
|
|
|
(defn valid-password? [noteID passwd] |
|
|
|
(defn valid-password? [noteID passwd] |
|
|
|
(let [stored (redis :hget password noteID)] |
|
|
|
(let [stored (redis :hget :password noteID)] |
|
|
|
(and (not (= 0 stored)) (= stored passwd)))) |
|
|
|
(and (not (= 0 stored)) (= stored passwd)))) |
|
|
|
|
|
|
|
|
|
|
|
(defn get-note-views [noteID] |
|
|
|
(defn get-note-views [noteID] |
|
|
|
(redis :hget views noteID)) |
|
|
|
(redis :hget :views noteID)) |
|
|
|
|
|
|
|
|
|
|
|
(defn get-publisher [noteID] |
|
|
|
(defn get-publisher [noteID] |
|
|
|
(redis :hget publisher noteID)) |
|
|
|
(redis :hget :publisher noteID)) |
|
|
|
|
|
|
|
|
|
|
|
(defn get-note-statistics [noteID] |
|
|
|
(defn get-note-statistics [noteID] |
|
|
|
{:views (get-note-views noteID) |
|
|
|
{:views (get-note-views noteID) |
|
|
|
:published (redis :hget published noteID) |
|
|
|
:published (redis :hget :published noteID) |
|
|
|
:edited (redis :hget edited noteID) |
|
|
|
:edited (redis :hget :edited noteID) |
|
|
|
:publisher (get-publisher noteID)}) |
|
|
|
:publisher (get-publisher noteID)}) |
|
|
|
|
|
|
|
|
|
|
|
(defn note-exists? [noteID] |
|
|
|
(defn note-exists? [noteID] |
|
|
|
(= 1 (redis :hexists note noteID))) |
|
|
|
(= 1 (redis :hexists :note noteID))) |
|
|
|
|
|
|
|
|
|
|
|
(defn get-note [noteID] |
|
|
|
(defn get-note [noteID] |
|
|
|
(when (note-exists? noteID) |
|
|
|
(when (note-exists? noteID) |
|
|
|
(do |
|
|
|
(do |
|
|
|
(redis :hincrby views noteID 1) |
|
|
|
(redis :hincrby :views noteID 1) |
|
|
|
(redis :hget note noteID)))) |
|
|
|
(redis :hget :note noteID)))) |
|
|
|
|
|
|
|
|
|
|
|
(defn delete-note [noteID] |
|
|
|
(defn delete-note [noteID] |
|
|
|
(doseq [kw [password views note published edited publisher]] |
|
|
|
(doseq [kw [:password :views :note :published :edited :publisher]] |
|
|
|
; TODO: delete short url by looking for the title |
|
|
|
; TODO: delete short url by looking for the title |
|
|
|
(redis :hdel kw noteID))) |
|
|
|
(redis :hdel kw noteID))) |
|
|
|
|
|
|
|
|
|
|
|
(defn short-url-exists? [url] |
|
|
|
(defn short-url-exists? [url] |
|
|
|
(= 1 (redis :hexists short-url url))) |
|
|
|
(= 1 (redis :hexists :short-url url))) |
|
|
|
|
|
|
|
|
|
|
|
(defn get-short-url [noteID] |
|
|
|
(defn get-short-url [noteID] |
|
|
|
(redis :hget short-url noteID)) |
|
|
|
(redis :hget :short-url noteID)) |
|
|
|
|
|
|
|
|
|
|
|
(defn resolve-url [url] |
|
|
|
(defn resolve-url [url] |
|
|
|
(let [value (redis :hget short-url url)] |
|
|
|
(let [value (redis :hget :short-url url)] |
|
|
|
(when value |
|
|
|
(when value |
|
|
|
(read-string value)))) |
|
|
|
(read-string value)))) |
|
|
|
|
|
|
|
|
|
|
|
(defn delete-short-url [noteID] |
|
|
|
(defn delete-short-url [noteID] |
|
|
|
(let [value (redis :hget short-url noteID)] |
|
|
|
(let [value (redis :hget :short-url noteID)] |
|
|
|
(do |
|
|
|
(do |
|
|
|
(redis :hdel short-url noteID) |
|
|
|
(redis :hdel :short-url noteID) |
|
|
|
(redis :hdel short-url value)))) |
|
|
|
(redis :hdel :short-url value)))) |
|
|
|
|
|
|
|
|
|
|
|
(defn create-short-url |
|
|
|
(defn create-short-url |
|
|
|
"Creates a short url for the given request metadata or extracts |
|
|
|
"Creates a short url for the given request metadata or extracts |
|
|
|
@ -116,7 +105,7 @@ |
|
|
|
[arg] |
|
|
|
[arg] |
|
|
|
(let [key (str (into (sorted-map) arg))] |
|
|
|
(let [key (str (into (sorted-map) arg))] |
|
|
|
(if (short-url-exists? key) |
|
|
|
(if (short-url-exists? key) |
|
|
|
(redis :hget short-url key) |
|
|
|
(redis :hget :short-url key) |
|
|
|
(let [hash-stream (partition 5 (repeatedly #(rand-int 36))) |
|
|
|
(let [hash-stream (partition 5 (repeatedly #(rand-int 36))) |
|
|
|
hash-to-string (fn [hash] |
|
|
|
hash-to-string (fn [hash] |
|
|
|
(apply str |
|
|
|
(apply str |
|
|
|
@ -129,6 +118,6 @@ |
|
|
|
(do |
|
|
|
(do |
|
|
|
; we create two mappings: key params -> short url and back, |
|
|
|
; we create two mappings: key params -> short url and back, |
|
|
|
; s.t. we can later easily check whether a short url already exists |
|
|
|
; s.t. we can later easily check whether a short url already exists |
|
|
|
(redis :hset short-url url key) |
|
|
|
(redis :hset :short-url url key) |
|
|
|
(redis :hset short-url key url) |
|
|
|
(redis :hset :short-url key url) |
|
|
|
url))))) |
|
|
|
url))))) |