diff --git a/API.md b/API.md index 81426b4..397fc0b 100644 --- a/API.md +++ b/API.md @@ -1,9 +1,10 @@ # NoteHub API -**Version 1.1, status: released.** +**Version 1.2, status: released.** ## Changelog +- **V1.2**: Theme & fonts can be specified at the creation. - **V1.1**: fields `publisher` and `title` in the response to the note retrieval. - **V1.0**: initial release. diff --git a/src/NoteHub/api.clj b/src/NoteHub/api.clj index b76c76b..9dfe557 100644 --- a/src/NoteHub/api.clj +++ b/src/NoteHub/api.clj @@ -45,11 +45,13 @@ ([success message & params] (assoc (create-response success) :message (apply format message params)))) -(defn- get-path [noteID & description] - (let [[year month day title] (split noteID #" ")] - (if description - (str domain "/" (storage/create-short-url noteID {:year year :month month :day day :title title})) - (apply str (interpose "/" [domain year month day (ring.util.codec/url-encode title)]))))) +(defn- get-path [token & [description]] + (if (= :url description) + (str domain "/" token) + (let [[year month day title] (split token #" ")] + (if description + (str domain "/" (storage/create-short-url token {:year year :month month :day day :title title})) + (apply str (interpose "/" [domain year month day (ring.util.codec/url-encode title)])))))) (let [md5Instance (java.security.MessageDigest/getInstance "MD5")] (defn get-signature @@ -66,42 +68,45 @@ {:note note :title (derive-title note) :longURL (get-path noteID) - :shortURL (get-path noteID :short) + :shortURL (get-path noteID :id) :statistics (storage/get-note-statistics noteID) :status (create-response true) :publisher (storage/get-publisher noteID)}) (create-response false "noteID '%s' unknown" noteID))) (defn post-note - ([note pid signature] (post-note note pid signature nil)) - ([note pid signature password] - ;(log "post-note: %s" {:pid pid :signature signature :password password :note note}) - (let [errors (filter identity - [(when-not (storage/valid-publisher? pid) "pid invalid") - (when-not (= signature (get-signature pid (storage/get-psk pid) note)) - "signature invalid") - (when (blank? note) "note is empty")])] - (if (empty? errors) - (let [[year month day] (get-date) - untrimmed-line (filter #(or (= \- %) (Character/isLetterOrDigit %)) - (-> note split-lines first (sreplace " " "-") lower-case)) - trim (fn [s] (apply str (drop-while #(= \- %) s))) - title-uncut (-> untrimmed-line trim reverse trim reverse) - max-length (get-setting :max-title-length #(Integer/parseInt %) 80) - proposed-title (apply str (take max-length title-uncut)) - date [year month day] - title (first (drop-while #(storage/note-exists? (build-key date %)) - (cons proposed-title - (map #(str proposed-title "-" (+ 2 %)) (range))))) - noteID (build-key date title) - short-url (storage/create-short-url noteID {:year year :month month :day day :title title})] - (do - (storage/add-note noteID note pid password) - {:noteID noteID - :longURL (get-path noteID) - :shortURL (get-path noteID :short) - :status (create-response true)})) - {:status (create-response false (first errors))})))) + ([note pid signature] (post-note note pid signature {})) + ([note pid signature opts] + ;(log "post-note: %s" {:pid pid :signature signature :password password :note note}) + (let [errors (filter identity + [(when-not (storage/valid-publisher? pid) "pid invalid") + (when-not (= signature (get-signature pid (storage/get-psk pid) note)) + "signature invalid") + (when (blank? note) "note is empty")])] + (if (empty? errors) + (let [[year month day] (map str (get-date)) + password (opts :password) + params (opts :params {}) + untrimmed-line (filter #(or (= \- %) (Character/isLetterOrDigit %)) + (-> note split-lines first (sreplace " " "-") lower-case)) + trim (fn [s] (apply str (drop-while #(= \- %) s))) + title-uncut (-> untrimmed-line trim reverse trim reverse) + max-length (get-setting :max-title-length #(Integer/parseInt %) 80) + proposed-title (apply str (take max-length title-uncut)) + date [year month day] + title (first (drop-while #(storage/note-exists? (build-key date %)) + (cons proposed-title + (map #(str proposed-title "-" (+ 2 %)) (range))))) + noteID (build-key date title) + new-params (assoc params :year year :month month :day day :title title) + short-url (storage/create-short-url noteID new-params)] + (do + (storage/add-note noteID note pid password) + {:noteID noteID + :longURL (get-path noteID) + :shortURL (get-path short-url :url) + :status (create-response true)})) + {:status (create-response false (first errors))})))) (defn update-note [noteID note pid signature password] @@ -116,6 +121,6 @@ (do (storage/edit-note noteID note) {:longURL (get-path noteID) - :shortURL (get-path noteID :short) + :shortURL (get-path noteID :id) :status (create-response true)}) {:status (create-response false (first errors))}))) diff --git a/src/NoteHub/views/pages.clj b/src/NoteHub/views/pages.clj index 39ae8d4..c17f71e 100644 --- a/src/NoteHub/views/pages.clj +++ b/src/NoteHub/views/pages.clj @@ -158,7 +158,7 @@ (let [pid "NoteHub" psk (storage/get-psk pid)] (if (storage/valid-publisher? pid) - (let [resp (api/post-note note pid (api/get-signature pid psk note) password)] + (let [resp (api/post-note note pid (api/get-signature pid psk note) {:password password})] (if (and (storage/invalidate-session session) (get-in resp [:status :success])) @@ -188,8 +188,14 @@ (defpage [:get "/api/note"] {:keys [version noteID]} (generate-string (api/get-note noteID))) -(defpage [:post "/api/note"] {:keys [version note pid signature password]} - (generate-string (api/post-note note pid signature password))) +(defpage [:post "/api/note"] {:keys [version note pid signature password] :as params} + (generate-string + (api/post-note + note + pid + signature + {:params (dissoc params :version :note :pid :signature :password) + :password password}))) (defpage [:put "/api/note"] {:keys [version noteID note pid signature password]} (generate-string (api/update-note noteID note pid signature password))) diff --git a/test/NoteHub/test/api.clj b/test/NoteHub/test/api.clj index 987c3cc..0b3fdb6 100644 --- a/test/NoteHub/test/api.clj +++ b/test/NoteHub/test/api.clj @@ -73,7 +73,7 @@ (isnt (:success (:status response))) (is (= (:message (:status response)) "pid invalid")))) (testing "note update" - (let [post-response (post-note note pid (get-signature pid psk note) "passwd") + (let [post-response (post-note note pid (get-signature pid psk note) {:password "passwd"}) note-id (:noteID post-response) new-note "a new note!"] (is (:success (:status post-response))) @@ -112,7 +112,30 @@ (storage/delete-note noteID) (not (storage/note-exists? noteID))))))) -(deftest note-update + +(deftest api-note-creation-with-params + (testing "Note creation with params" + (let [response (send-request [:post "/api/note"] + {:note note + :pid pid + :signature (get-signature pid psk note) + :version "1.0" + :theme "dark" + :text-font "Helvetica"}) + body (parse-string (:body response)) + noteID (body "noteID")] + (let [url ((:headers + (send-request + (str "/" + (last (clojure.string/split + ((parse-string (:body response)) "shortURL") #"/"))))) "Location")] + (substring? "theme=dark" url) + (substring? "text-font=Felvetica" url)) + (is (do + (storage/delete-note noteID) + (not (storage/note-exists? noteID))))))) + +(deftest api-note-update (let [response (send-request [:post "/api/note"] {:note note :pid pid