diff --git a/API.md b/API.md index 47a96a0..19f554f 100644 --- a/API.md +++ b/API.md @@ -1,6 +1,6 @@ # NoteHub API -**Version 1.0, status: released.** +**Version 1.1, status: released.** ## Prerequisites @@ -42,7 +42,8 @@ Example: status: { success: true, comment: "some server message" - } + }, + publisher: "Publisher Description" } Hence, the status of the request can be evaluated by reading of the property `status.success`. The field `status.comment`might contain an error message, a warning or any other comments from the server. diff --git a/messages b/messages index dec74b1..20c782d 100644 --- a/messages +++ b/messages @@ -16,6 +16,7 @@ enter-passwd = Password publish = Publish update = Save published = Published +publisher = Publisher edited = Edited article-views = Article Views statistics = Statistics diff --git a/src/NoteHub/api.clj b/src/NoteHub/api.clj index 0af480f..8a322f4 100644 --- a/src/NoteHub/api.clj +++ b/src/NoteHub/api.clj @@ -58,7 +58,8 @@ :longURL (get-path noteID) :shortURL (get-path noteID :short) :statistics (storage/get-note-statistics noteID) - :status (create-response true)} + :status (create-response true) + :publisher (storage/get-publisher noteID)} (create-response false "noteID '%s' unknown" noteID))) (defn post-note @@ -85,7 +86,7 @@ (map #(str proposed-title "-" (+ 2 %)) (range))))) noteID (build-key date title)] (do - (storage/add-note noteID note password) + (storage/add-note noteID note pid password) (storage/create-short-url noteID) {:noteID noteID :longURL (get-path noteID) diff --git a/src/NoteHub/storage.clj b/src/NoteHub/storage.clj index f3f3a51..5df4521 100644 --- a/src/NoteHub/storage.clj +++ b/src/NoteHub/storage.clj @@ -5,8 +5,8 @@ [noir.options :only [dev-mode?]]) (:require [clj-redis.client :as redis])) -; Initialize the data base -(def db +; Initialize the data base +(def db (redis/init (when-not (dev-mode?) {:url (get-setting :db-url)}))) @@ -23,22 +23,23 @@ (def sessions "sessions") (def short-url "short-url") (def publisher "publisher") +(def publisher-key "publisher-key") (defn valid-publisher? [pid] - (redis/hexists db publisher pid)) + (redis/hexists db publisher-key pid)) (defn register-publisher [pid] "Returns nil if given PID exists or a PSK otherwise" (when (not (valid-publisher? pid)) (let [psk (encrypt (str (rand-int Integer/MAX_VALUE) pid)) - _ (redis/hset db publisher pid psk)] + _ (redis/hset db publisher-key pid psk)] psk))) (defn revoke-publisher [pid] - (redis/hdel db publisher pid)) + (redis/hdel db publisher-key pid)) (defn get-psk [pid] - (redis/hget db publisher pid)) + (redis/hget db publisher-key pid)) (defn create-session [] (let [token (encrypt (str (rand-int Integer/MAX_VALUE)))] @@ -59,11 +60,12 @@ (redis/hset db note noteID text))) (defn add-note - ([noteID text] (add-note noteID text nil)) - ([noteID text passwd] + ([noteID text pid] (add-note noteID text pid nil)) + ([noteID text pid passwd] (do (redis/hset db note noteID text) (redis/hset db published noteID (get-current-date)) + (redis/hset db publisher noteID pid) (when (not (blank? passwd)) (redis/hset db password noteID passwd))))) @@ -79,16 +81,21 @@ (redis/hincrby db views noteID 1) text)))) -(defn get-note-views +(defn get-note-views [noteID] (redis/hget db views noteID)) +(defn get-publisher + [noteID] + (redis/hget db publisher noteID)) + (defn get-note-statistics "Return views, publishing and editing timestamp" [noteID] - { :views (redis/hget db views noteID) + {:views (get-note-views noteID) :published (redis/hget db published noteID) - :edited (redis/hget db edited noteID) }) + :edited (redis/hget db edited noteID) + :publisher (get-publisher noteID)}) (defn note-exists? [noteID] @@ -96,7 +103,7 @@ (defn delete-note [noteID] - (doseq [kw [password views note published edited]] + (doseq [kw [password views note published edited publisher]] ; TODO: delete short url by looking for the title (redis/hdel db kw noteID))) @@ -112,7 +119,7 @@ "Resolves short url by providing all metadata of the request" [url] (let [value (redis/hget db short-url url)] - (when value + (when value (read-string value)))) (defn delete-short-url @@ -132,14 +139,14 @@ (redis/hget db short-url key) (let [hash-stream (partition 5 (repeatedly #(rand-int 36))) hash-to-string (fn [hash] - (apply str + (apply str ; map first 10 numbers to digits ; and the rest to chars (map #(char (+ (if (< 9 %) 87 48) %)) hash))) - url (first + url (first (remove short-url-exists? (map hash-to-string hash-stream)))] - (do + (do ; we create two mappings: key params -> short url and back, ; s.t. we can later easily check whether a short url already exists (redis/hset db short-url url key) diff --git a/src/NoteHub/views/pages.clj b/src/NoteHub/views/pages.clj index 44a943e..1f67155 100644 --- a/src/NoteHub/views/pages.clj +++ b/src/NoteHub/views/pages.clj @@ -20,8 +20,8 @@ [noir.core :only [defpage defpartial]] [noir.statuses])) -(when-not (storage/valid-publisher? api/domain) - (storage/register-publisher api/domain)) +(when-not (storage/valid-publisher? "NoteHub") + (storage/register-publisher "NoteHub")) ; Creates the main html layout (defpartial generate-layout @@ -148,6 +148,10 @@ [:tr [:td (get-message :edited)] [:td (:edited stats)]]) + (when (:publisher stats) + [:tr + [:td (get-message :publisher)] + [:td (:publisher stats)]]) [:tr [:td (get-message :article-views)] [:td (:views stats)]]]))) @@ -178,7 +182,7 @@ ; Creates New Note from Web (defpage [:post "/post-note"] {:keys [session note signature password version]} (if (= signature (api/get-signature session note)) - (let [pid api/domain + (let [pid "NoteHub" psk (storage/get-psk pid)] (if (storage/valid-publisher? pid) (let [resp (api/post-note note pid (api/get-signature (str pid psk note)) password)] @@ -190,7 +194,7 @@ ; Updates a note (defpage [:post "/update-note"] {:keys [noteID note password version]} - (let [pid api/domain + (let [pid "NoteHub" psk (storage/get-psk pid)] (if (storage/valid-publisher? pid) (let [resp (api/update-note noteID note pid diff --git a/test/NoteHub/test/api.clj b/test/NoteHub/test/api.clj index 29dc872..28caad2 100644 --- a/test/NoteHub/test/api.clj +++ b/test/NoteHub/test/api.clj @@ -45,6 +45,7 @@ (is (= note (:note get-response))) (is (= (:longURL post-response) (:longURL get-response) note-url)) (is (= (:shortURL post-response) (:shortURL get-response))) + (is (= (:publisher get-response) pid)) (is (= "1" (get-in get-response [:statistics :views]))) (isnt (get-in get-response [:statistics :edited])) (is (= "2" (get-in (get-note (:noteID post-response)) [:statistics :views]))))) diff --git a/test/NoteHub/test/storage.clj b/test/NoteHub/test/storage.clj index e5e9c3c..dde7302 100644 --- a/test/NoteHub/test/storage.clj +++ b/test/NoteHub/test/storage.clj @@ -23,12 +23,12 @@ (is (short-url-exists? url)) (is (= url url2)) (is (= metadata (resolve-url url))) - (is (not (do + (is (not (do (delete-short-url url) (short-url-exists? url)))))) (testing "of correct note creation" (is (= (do - (add-note (build-key date test-title) test-note) + (add-note (build-key date test-title) test-note "testPID") (get-note (build-key date test-title))) test-note)) (is (= "1" (get-note-views (build-key date test-title)))) @@ -38,7 +38,7 @@ "2"))) (testing "of note update" (is (= (do - (add-note (build-key date test-title) test-note "12345qwert") + (add-note (build-key date test-title) test-note "testPID" "12345qwert") (get-note (build-key date test-title))) test-note)) (is (valid-password? (build-key date test-title) "12345qwert")) @@ -60,7 +60,7 @@ (testing "of note existence" (is (note-exists? (build-key date test-title))) (is (not (do - (delete-note (build-key date test-title)) + (delete-note (build-key date test-title)) (note-exists? (build-key date test-title))))) (is (not (note-exists? (build-key [2013 06 03] test-title)))) (is (not (note-exists? (build-key date "some title"))))))) diff --git a/test/NoteHub/test/views/pages.clj b/test/NoteHub/test/views/pages.clj index 1c57ba0..cf2cba4 100644 --- a/test/NoteHub/test/views/pages.clj +++ b/test/NoteHub/test/views/pages.clj @@ -11,7 +11,7 @@ (def test-note "# This is a test note.\nHello _world_. Motörhead, тест.") (defn create-testnote-fixture [f] - (add-note (build-key date test-title) test-note) + (add-note (build-key date test-title) test-note "testPID") (f) (delete-note (build-key date test-title)))