         (if tags (sset-all node-tags-key tags))
         (car/return (view-model id))))))
 
-(defn create-node [{:keys [url
-                           tags]
-                    :or {:tags []}}]
+(s/defn create-node :- NodeView
+  [{:keys [url
+           tags]
+    :or {:tags []}}]
   (last
     (with-car*
       (let [id (uuid)

(defn node-tags-key [id]
  (format node-tags-key-template id))

(defn node-ids []
  (with-car* (car/smembers node-set-key)))

(defn uuid [] (str (java.util.UUID/randomUUID)))

(defn node-ids []
  (with-car* (car/smembers node-set-key)))

(def NodeInRedis

    (keywordize-keys
      (assoc (apply hash-map contents) :tags (or tags []) :id id))))

(s/defn view-models :- [NodeView] []
  (map view-model (node-ids)))

(s/defn view-model-from-url :- NodeView
  [url :- s/Str]
  (first (filter #(= (% :url) url) (view-models))))

(s/defn modify-node :- NodeView
  [id {:keys [url tags]
       :or {:url nil
            :tags nil}}]
  (last
    (with-car*
      (let [node-key (node-key id)
