every note associated with it's pid now
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# NoteHub API
|
# NoteHub API
|
||||||
|
|
||||||
**Version 1.0, status: released.**
|
**Version 1.1, status: released.**
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
@@ -42,7 +42,8 @@ Example:
|
|||||||
status: {
|
status: {
|
||||||
success: true,
|
success: true,
|
||||||
comment: "some server message"
|
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.
|
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.
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ enter-passwd = Password
|
|||||||
publish = Publish
|
publish = Publish
|
||||||
update = Save
|
update = Save
|
||||||
published = Published
|
published = Published
|
||||||
|
publisher = Publisher
|
||||||
edited = Edited
|
edited = Edited
|
||||||
article-views = Article Views
|
article-views = Article Views
|
||||||
statistics = Statistics
|
statistics = Statistics
|
||||||
|
|||||||
+3
-2
@@ -58,7 +58,8 @@
|
|||||||
:longURL (get-path noteID)
|
:longURL (get-path noteID)
|
||||||
:shortURL (get-path noteID :short)
|
:shortURL (get-path noteID :short)
|
||||||
:statistics (storage/get-note-statistics noteID)
|
: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)))
|
(create-response false "noteID '%s' unknown" noteID)))
|
||||||
|
|
||||||
(defn post-note
|
(defn post-note
|
||||||
@@ -85,7 +86,7 @@
|
|||||||
(map #(str proposed-title "-" (+ 2 %)) (range)))))
|
(map #(str proposed-title "-" (+ 2 %)) (range)))))
|
||||||
noteID (build-key date title)]
|
noteID (build-key date title)]
|
||||||
(do
|
(do
|
||||||
(storage/add-note noteID note password)
|
(storage/add-note noteID note pid password)
|
||||||
(storage/create-short-url noteID)
|
(storage/create-short-url noteID)
|
||||||
{:noteID noteID
|
{:noteID noteID
|
||||||
:longURL (get-path noteID)
|
:longURL (get-path noteID)
|
||||||
|
|||||||
+16
-9
@@ -23,22 +23,23 @@
|
|||||||
(def sessions "sessions")
|
(def sessions "sessions")
|
||||||
(def short-url "short-url")
|
(def short-url "short-url")
|
||||||
(def publisher "publisher")
|
(def publisher "publisher")
|
||||||
|
(def publisher-key "publisher-key")
|
||||||
|
|
||||||
(defn valid-publisher? [pid]
|
(defn valid-publisher? [pid]
|
||||||
(redis/hexists db publisher pid))
|
(redis/hexists db 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 db publisher pid psk)]
|
_ (redis/hset db publisher-key pid psk)]
|
||||||
psk)))
|
psk)))
|
||||||
|
|
||||||
(defn revoke-publisher [pid]
|
(defn revoke-publisher [pid]
|
||||||
(redis/hdel db publisher pid))
|
(redis/hdel db publisher-key pid))
|
||||||
|
|
||||||
(defn get-psk [pid]
|
(defn get-psk [pid]
|
||||||
(redis/hget db publisher pid))
|
(redis/hget db 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)))]
|
||||||
@@ -59,11 +60,12 @@
|
|||||||
(redis/hset db note noteID text)))
|
(redis/hset db note noteID text)))
|
||||||
|
|
||||||
(defn add-note
|
(defn add-note
|
||||||
([noteID text] (add-note noteID text nil))
|
([noteID text pid] (add-note noteID text pid nil))
|
||||||
([noteID text passwd]
|
([noteID text pid passwd]
|
||||||
(do
|
(do
|
||||||
(redis/hset db note noteID text)
|
(redis/hset db note noteID text)
|
||||||
(redis/hset db published noteID (get-current-date))
|
(redis/hset db published noteID (get-current-date))
|
||||||
|
(redis/hset db publisher noteID pid)
|
||||||
(when (not (blank? passwd))
|
(when (not (blank? passwd))
|
||||||
(redis/hset db password noteID passwd)))))
|
(redis/hset db password noteID passwd)))))
|
||||||
|
|
||||||
@@ -83,12 +85,17 @@
|
|||||||
[noteID]
|
[noteID]
|
||||||
(redis/hget db views noteID))
|
(redis/hget db views noteID))
|
||||||
|
|
||||||
|
(defn get-publisher
|
||||||
|
[noteID]
|
||||||
|
(redis/hget db publisher noteID))
|
||||||
|
|
||||||
(defn get-note-statistics
|
(defn get-note-statistics
|
||||||
"Return views, publishing and editing timestamp"
|
"Return views, publishing and editing timestamp"
|
||||||
[noteID]
|
[noteID]
|
||||||
{ :views (redis/hget db views noteID)
|
{:views (get-note-views noteID)
|
||||||
:published (redis/hget db published 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?
|
(defn note-exists?
|
||||||
[noteID]
|
[noteID]
|
||||||
@@ -96,7 +103,7 @@
|
|||||||
|
|
||||||
(defn delete-note
|
(defn delete-note
|
||||||
[noteID]
|
[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
|
; TODO: delete short url by looking for the title
|
||||||
(redis/hdel db kw noteID)))
|
(redis/hdel db kw noteID)))
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
[noir.core :only [defpage defpartial]]
|
[noir.core :only [defpage defpartial]]
|
||||||
[noir.statuses]))
|
[noir.statuses]))
|
||||||
|
|
||||||
(when-not (storage/valid-publisher? api/domain)
|
(when-not (storage/valid-publisher? "NoteHub")
|
||||||
(storage/register-publisher api/domain))
|
(storage/register-publisher "NoteHub"))
|
||||||
|
|
||||||
; Creates the main html layout
|
; Creates the main html layout
|
||||||
(defpartial generate-layout
|
(defpartial generate-layout
|
||||||
@@ -148,6 +148,10 @@
|
|||||||
[:tr
|
[:tr
|
||||||
[:td (get-message :edited)]
|
[:td (get-message :edited)]
|
||||||
[:td (:edited stats)]])
|
[:td (:edited stats)]])
|
||||||
|
(when (:publisher stats)
|
||||||
|
[:tr
|
||||||
|
[:td (get-message :publisher)]
|
||||||
|
[:td (:publisher stats)]])
|
||||||
[:tr
|
[:tr
|
||||||
[:td (get-message :article-views)]
|
[:td (get-message :article-views)]
|
||||||
[:td (:views stats)]]])))
|
[:td (:views stats)]]])))
|
||||||
@@ -178,7 +182,7 @@
|
|||||||
; Creates New Note from Web
|
; Creates New Note from Web
|
||||||
(defpage [:post "/post-note"] {:keys [session note signature password version]}
|
(defpage [:post "/post-note"] {:keys [session note signature password version]}
|
||||||
(if (= signature (api/get-signature session note))
|
(if (= signature (api/get-signature session note))
|
||||||
(let [pid api/domain
|
(let [pid "NoteHub"
|
||||||
psk (storage/get-psk pid)]
|
psk (storage/get-psk pid)]
|
||||||
(if (storage/valid-publisher? pid)
|
(if (storage/valid-publisher? pid)
|
||||||
(let [resp (api/post-note note pid (api/get-signature (str pid psk note)) password)]
|
(let [resp (api/post-note note pid (api/get-signature (str pid psk note)) password)]
|
||||||
@@ -190,7 +194,7 @@
|
|||||||
|
|
||||||
; Updates a note
|
; Updates a note
|
||||||
(defpage [:post "/update-note"] {:keys [noteID note password version]}
|
(defpage [:post "/update-note"] {:keys [noteID note password version]}
|
||||||
(let [pid api/domain
|
(let [pid "NoteHub"
|
||||||
psk (storage/get-psk pid)]
|
psk (storage/get-psk pid)]
|
||||||
(if (storage/valid-publisher? pid)
|
(if (storage/valid-publisher? pid)
|
||||||
(let [resp (api/update-note noteID note pid
|
(let [resp (api/update-note noteID note pid
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
(is (= note (:note get-response)))
|
(is (= note (:note get-response)))
|
||||||
(is (= (:longURL post-response) (:longURL get-response) note-url))
|
(is (= (:longURL post-response) (:longURL get-response) note-url))
|
||||||
(is (= (:shortURL post-response) (:shortURL get-response)))
|
(is (= (:shortURL post-response) (:shortURL get-response)))
|
||||||
|
(is (= (:publisher get-response) pid))
|
||||||
(is (= "1" (get-in get-response [:statistics :views])))
|
(is (= "1" (get-in get-response [:statistics :views])))
|
||||||
(isnt (get-in get-response [:statistics :edited]))
|
(isnt (get-in get-response [:statistics :edited]))
|
||||||
(is (= "2" (get-in (get-note (:noteID post-response)) [:statistics :views])))))
|
(is (= "2" (get-in (get-note (:noteID post-response)) [:statistics :views])))))
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
(short-url-exists? url))))))
|
(short-url-exists? url))))))
|
||||||
(testing "of correct note creation"
|
(testing "of correct note creation"
|
||||||
(is (= (do
|
(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)))
|
(get-note (build-key date test-title)))
|
||||||
test-note))
|
test-note))
|
||||||
(is (= "1" (get-note-views (build-key date test-title))))
|
(is (= "1" (get-note-views (build-key date test-title))))
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"2")))
|
"2")))
|
||||||
(testing "of note update"
|
(testing "of note update"
|
||||||
(is (= (do
|
(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)))
|
(get-note (build-key date test-title)))
|
||||||
test-note))
|
test-note))
|
||||||
(is (valid-password? (build-key date test-title) "12345qwert"))
|
(is (valid-password? (build-key date test-title) "12345qwert"))
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
(def test-note "# This is a test note.\nHello _world_. Motörhead, тест.")
|
(def test-note "# This is a test note.\nHello _world_. Motörhead, тест.")
|
||||||
|
|
||||||
(defn create-testnote-fixture [f]
|
(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)
|
(f)
|
||||||
(delete-note (build-key date test-title)))
|
(delete-note (build-key date test-title)))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user