mirror of
https://github.com/penpot/penpot.git
synced 2025-02-14 19:19:09 -05:00
feat(backend): rename uxbox.api to uxbox.http
This commit is contained in:
parent
3ff0ecee5f
commit
9d58d0fac5
19 changed files with 368 additions and 166 deletions
|
@ -9,7 +9,7 @@
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[struct.core :as st]
|
[struct.core :as st]
|
||||||
[uxbox.services :as sv]
|
[uxbox.services :as sv]
|
||||||
[uxbox.util.http :as http]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]))
|
[uxbox.util.uuid :as uuid]))
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
(let [data (get-in ctx [:parameters :body])]
|
(let [data (get-in ctx [:parameters :body])]
|
||||||
(->> (sv/novelty (assoc data :type :login))
|
(->> (sv/novelty (assoc data :type :login))
|
||||||
(p/map (fn [{:keys [id] :as user}]
|
(p/map (fn [{:keys [id] :as user}]
|
||||||
(-> (http/no-content)
|
(-> (rsp/no-content)
|
||||||
(assoc :session {:user-id id})))))))
|
(assoc :session {:user-id id})))))))
|
||||||
|
|
||||||
(defn register
|
(defn register
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
(let [data (get parameters :body)
|
(let [data (get parameters :body)
|
||||||
message (assoc data :type :register-profile)]
|
message (assoc data :type :register-profile)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn request-recovery
|
(defn request-recovery
|
||||||
{:parameters {:body {:username [st/required st/string]}}}
|
{:parameters {:body {:username [st/required st/string]}}}
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
(let [data (get parameters :body)
|
(let [data (get parameters :body)
|
||||||
message (assoc data :type :request-profile-password-recovery)]
|
message (assoc data :type :request-profile-password-recovery)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (constantly (http/no-content))))))
|
(p/map (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
(defn recover-password
|
(defn recover-password
|
||||||
{:parameters {:body {:token [st/required st/string]
|
{:parameters {:body {:token [st/required st/string]
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
(let [data (get parameters :body)
|
(let [data (get parameters :body)
|
||||||
message (assoc data :type :recover-profile-password)]
|
message (assoc data :type :recover-profile-password)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (constantly (http/no-content))))))
|
(p/map (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
(defn validate-recovery-token
|
(defn validate-recovery-token
|
||||||
{:parameters {:path {:token [st/required st/string]}}}
|
{:parameters {:path {:token [st/required st/string]}}}
|
||||||
|
@ -61,5 +61,5 @@
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map (fn [v]
|
(p/map (fn [v]
|
||||||
(if v
|
(if v
|
||||||
(http/no-content)
|
(rsp/no-content)
|
||||||
(http/not-found "")))))))
|
(rsp/not-found "")))))))
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
(:require [struct.core :as st]
|
(:require [struct.core :as st]
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[uxbox.services :as sv]
|
[uxbox.services :as sv]
|
||||||
[uxbox.util.http :as http]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]))
|
[uxbox.util.uuid :as uuid]))
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (fn [result]
|
(p/map (fn [result]
|
||||||
(let [loc (str "/api/library/icons/" (:id result))]
|
(let [loc (str "/api/library/icons/" (:id result))]
|
||||||
(http/created loc result)))))))
|
(rsp/created loc result)))))))
|
||||||
|
|
||||||
(defn update-collection
|
(defn update-collection
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
:type :update-icon-collection
|
:type :update-icon-collection
|
||||||
:user user)]
|
:user user)]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then #(http/ok %)))))
|
(p/then #(rsp/ok %)))))
|
||||||
|
|
||||||
|
|
||||||
(defn delete-collection
|
(defn delete-collection
|
||||||
|
@ -47,13 +47,13 @@
|
||||||
:type :delete-icon-collection
|
:type :delete-icon-collection
|
||||||
:user user}]
|
:user user}]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then (fn [v] (http/no-content))))))
|
(p/then (fn [v] (rsp/no-content))))))
|
||||||
|
|
||||||
(defn list-collections
|
(defn list-collections
|
||||||
[{:keys [user]}]
|
[{:keys [user]}]
|
||||||
(let [params {:user user :type :list-icon-collections}]
|
(let [params {:user user :type :list-icon-collections}]
|
||||||
(-> (sv/query params)
|
(-> (sv/query params)
|
||||||
(p/then #(http/ok %)))))
|
(p/then #(rsp/ok %)))))
|
||||||
|
|
||||||
;; (def metadata-spec
|
;; (def metadata-spec
|
||||||
;; {:width [st/number st/positive]
|
;; {:width [st/number st/positive]
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (fn [entry]
|
(p/map (fn [entry]
|
||||||
(let [loc (str "/api/library/icons/" (:id entry))]
|
(let [loc (str "/api/library/icons/" (:id entry))]
|
||||||
(http/created loc entry)))))))
|
(rsp/created loc entry)))))))
|
||||||
|
|
||||||
(defn update-icon
|
(defn update-icon
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
|
@ -96,7 +96,7 @@
|
||||||
:type :update-icon
|
:type :update-icon
|
||||||
:user user)]
|
:user user)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn copy-icon
|
(defn copy-icon
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
|
@ -108,7 +108,7 @@
|
||||||
:user user
|
:user user
|
||||||
:type :copy-icon}]
|
:type :copy-icon}]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn delete-icon
|
(defn delete-icon
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
:type :delete-icon
|
:type :delete-icon
|
||||||
:user user}]
|
:user user}]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (fn [v] (http/no-content))))))
|
(p/map (fn [v] (rsp/no-content))))))
|
||||||
|
|
||||||
(defn list-icons
|
(defn list-icons
|
||||||
{:parameters {:query {:collection [st/uuid-str]}}}
|
{:parameters {:query {:collection [st/uuid-str]}}}
|
||||||
|
@ -127,5 +127,5 @@
|
||||||
:type :list-icons
|
:type :list-icons
|
||||||
:user user}]
|
:user user}]
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
[uxbox.media :as media]
|
[uxbox.media :as media]
|
||||||
[uxbox.images :as images]
|
[uxbox.images :as images]
|
||||||
[uxbox.services :as sv]
|
[uxbox.services :as sv]
|
||||||
[uxbox.util.http :as http]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]))
|
[uxbox.util.uuid :as uuid]))
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (fn [result]
|
(p/map (fn [result]
|
||||||
(let [loc (str "/api/library/images/" (:id result))]
|
(let [loc (str "/api/library/images/" (:id result))]
|
||||||
(http/created loc result)))))))
|
(rsp/created loc result)))))))
|
||||||
|
|
||||||
(defn update-collection
|
(defn update-collection
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
:type :update-image-collection
|
:type :update-image-collection
|
||||||
:user user)]
|
:user user)]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then http/ok))))
|
(p/then rsp/ok))))
|
||||||
|
|
||||||
(defn delete-collection
|
(defn delete-collection
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
||||||
|
@ -63,13 +63,13 @@
|
||||||
:type :delete-image-collection
|
:type :delete-image-collection
|
||||||
:user user}]
|
:user user}]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then (constantly (http/no-content))))))
|
(p/then (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
(defn list-collections
|
(defn list-collections
|
||||||
[{:keys [user]}]
|
[{:keys [user]}]
|
||||||
(let [params {:user user :type :list-image-collections}]
|
(let [params {:user user :type :list-image-collections}]
|
||||||
(-> (sv/query params)
|
(-> (sv/query params)
|
||||||
(p/then http/ok))))
|
(p/then rsp/ok))))
|
||||||
|
|
||||||
(defn retrieve-image
|
(defn retrieve-image
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
||||||
|
@ -82,8 +82,8 @@
|
||||||
(if result
|
(if result
|
||||||
(-> (populate-thumbnails result)
|
(-> (populate-thumbnails result)
|
||||||
(populate-urls)
|
(populate-urls)
|
||||||
(http/ok))
|
(rsp/ok))
|
||||||
(http/not-found "")))))))
|
(rsp/not-found "")))))))
|
||||||
|
|
||||||
;; (s/def ::create-image
|
;; (s/def ::create-image
|
||||||
;; (s/keys :req-un [::file ::width ::height ::mimetype]
|
;; (s/keys :req-un [::file ::width ::height ::mimetype]
|
||||||
|
@ -112,7 +112,7 @@
|
||||||
:user user))))
|
:user user))))
|
||||||
(create-response [entry]
|
(create-response [entry]
|
||||||
(let [loc (str "/api/library/images/" (:id entry))]
|
(let [loc (str "/api/library/images/" (:id entry))]
|
||||||
(http/created loc entry)))]
|
(rsp/created loc entry)))]
|
||||||
(->> (ds/save storage filename tempfile)
|
(->> (ds/save storage filename tempfile)
|
||||||
(p/mapcat persist-image-entry)
|
(p/mapcat persist-image-entry)
|
||||||
(p/map populate-thumbnails)
|
(p/map populate-thumbnails)
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map populate-thumbnails)
|
(p/map populate-thumbnails)
|
||||||
(p/map populate-urls)
|
(p/map populate-urls)
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn copy-image
|
(defn copy-image
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
|
@ -145,7 +145,7 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map populate-thumbnails)
|
(p/map populate-thumbnails)
|
||||||
(p/map populate-urls)
|
(p/map populate-urls)
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn delete-image
|
(defn delete-image
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
:type :delete-image
|
:type :delete-image
|
||||||
:user user}]
|
:user user}]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (constantly (http/no-content))))))
|
(p/map (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
;; --- List collections
|
;; --- List collections
|
||||||
|
|
||||||
|
@ -168,6 +168,6 @@
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map (partial map populate-thumbnails))
|
(p/map (partial map populate-thumbnails))
|
||||||
(p/map (partial map populate-urls))
|
(p/map (partial map populate-urls))
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[uxbox.services :as sv]
|
[uxbox.services :as sv]
|
||||||
[uxbox.media :as media]
|
[uxbox.media :as media]
|
||||||
[uxbox.util.http :as http]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]))
|
[uxbox.util.uuid :as uuid]))
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
:type :retrieve-kvstore
|
:type :retrieve-kvstore
|
||||||
:user user}]
|
:user user}]
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn upsert
|
(defn upsert
|
||||||
{:parameters {:path {:key [st/required st/string]}
|
{:parameters {:path {:key [st/required st/string]}
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
:type :update-kvstore
|
:type :update-kvstore
|
||||||
:user user}]
|
:user user}]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map http/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn delete
|
(defn delete
|
||||||
{:parameters {:path {:key [st/required st/string]}}}
|
{:parameters {:path {:key [st/required st/string]}}}
|
||||||
|
@ -48,6 +48,6 @@
|
||||||
:type :delete-kvstore
|
:type :delete-kvstore
|
||||||
:user user}]
|
:user user}]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (constantly (http/no-content))))))
|
(p/map (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,21 +9,19 @@
|
||||||
[struct.core :as st]
|
[struct.core :as st]
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[uxbox.services :as sv]
|
[uxbox.services :as sv]
|
||||||
[uxbox.util.http :as http]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]))
|
[uxbox.util.uuid :as uuid]))
|
||||||
|
|
||||||
(defn list
|
(defn list-pages
|
||||||
"List pages in a project"
|
|
||||||
{:parameters {:query {:project [st/required st/uuid-str]}}}
|
{:parameters {:query {:project [st/required st/uuid-str]}}}
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [project (get-in parameters [:query :project])
|
(let [project (get-in parameters [:query :project])
|
||||||
message {:user user :project project :type :list-pages-by-project}]
|
message {:user user :project project :type :list-pages-by-project}]
|
||||||
(-> (sv/query message)
|
(-> (sv/query message)
|
||||||
(p/then #(http/ok %)))))
|
(p/then rsp/ok))))
|
||||||
|
|
||||||
(defn create
|
(defn create-page
|
||||||
"Create page for a project"
|
|
||||||
{:parameters {:body {:data [st/required]
|
{:parameters {:body {:data [st/required]
|
||||||
:metadata [st/required]
|
:metadata [st/required]
|
||||||
:project [st/required st/uuid]
|
:project [st/required st/uuid]
|
||||||
|
@ -35,10 +33,9 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (fn [result]
|
(p/map (fn [result]
|
||||||
(let [loc (str "/api/pages/" (:id result))]
|
(let [loc (str "/api/pages/" (:id result))]
|
||||||
(http/created loc result)))))))
|
(rsp/created loc result)))))))
|
||||||
|
|
||||||
(defn update
|
(defn update-page
|
||||||
"Update page"
|
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
:body {:data [st/required]
|
:body {:data [st/required]
|
||||||
:metadata [st/required]
|
:metadata [st/required]
|
||||||
|
@ -51,10 +48,9 @@
|
||||||
data (get parameters :body)
|
data (get parameters :body)
|
||||||
message (assoc data :id id :type :update-page :user user)]
|
message (assoc data :id id :type :update-page :user user)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map #(rsp/ok %)))))
|
||||||
|
|
||||||
(defn update-metadata
|
(defn update-page-metadata
|
||||||
"Update page metadata"
|
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
:body {:id [st/required st/uuid]
|
:body {:id [st/required st/uuid]
|
||||||
:metadata [st/required]
|
:metadata [st/required]
|
||||||
|
@ -65,17 +61,17 @@
|
||||||
data (get parameters :body)
|
data (get parameters :body)
|
||||||
message (assoc data :id id :type :update-page-metadata :user user)]
|
message (assoc data :id id :type :update-page-metadata :user user)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn delete
|
(defn delete-page
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [id (get-in parameters [:path :id])
|
(let [id (get-in parameters [:path :id])
|
||||||
message {:id id :type :delete-page :user user}]
|
message {:id id :type :delete-page :user user}]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then (fn [v] (http/no-content))))))
|
(p/then (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
(defn retrieve-history
|
(defn retrieve-page-history
|
||||||
"Retrieve the page history"
|
"Retrieve the page history"
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
:query {:max [st/integer-str]
|
:query {:max [st/integer-str]
|
||||||
|
@ -86,9 +82,9 @@
|
||||||
data (get parameters :query)
|
data (get parameters :query)
|
||||||
message (assoc data :id id :type :list-page-history :user user)]
|
message (assoc data :id id :type :list-page-history :user user)]
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn update-history
|
(defn update-page-history
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]
|
{:parameters {:path {:id [st/required st/uuid-str]
|
||||||
:hid [st/required st/uuid-str]}
|
:hid [st/required st/uuid-str]}
|
||||||
:body {:label [st/required st/string]
|
:body {:label [st/required st/string]
|
||||||
|
@ -100,4 +96,4 @@
|
||||||
:id hid
|
:id hid
|
||||||
:user user)]
|
:user user)]
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
|
@ -10,19 +10,19 @@
|
||||||
[struct.core :as st]
|
[struct.core :as st]
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[uxbox.services :as sv]
|
[uxbox.services :as sv]
|
||||||
[uxbox.util.http :as http]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]
|
[uxbox.util.uuid :as uuid]
|
||||||
[uxbox.util.exceptions :as ex]))
|
[uxbox.util.exceptions :as ex]))
|
||||||
|
|
||||||
(defn list
|
(defn list-projects
|
||||||
{:description "List projects"}
|
{:description "List projects"}
|
||||||
[{:keys [user] :as req}]
|
[{:keys [user] :as req}]
|
||||||
(let [message {:user user :type :list-projects}]
|
(let [message {:user user :type :list-projects}]
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
(defn create
|
(defn create-project
|
||||||
"Create project"
|
"Create project"
|
||||||
{:parameters {:body {:name [st/required st/string]
|
{:parameters {:body {:name [st/required st/string]
|
||||||
:id [st/uuid-str]}}}
|
:id [st/uuid-str]}}}
|
||||||
|
@ -32,9 +32,9 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map (fn [result]
|
(p/map (fn [result]
|
||||||
(let [loc (str "/api/projects/" (:id result))]
|
(let [loc (str "/api/projects/" (:id result))]
|
||||||
(http/created loc result)))))))
|
(rsp/created loc result)))))))
|
||||||
|
|
||||||
(defn update
|
(defn update-project
|
||||||
"Update project"
|
"Update project"
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path {:id [st/required st/uuid-str]}
|
||||||
:body {:name [st/required st/string]
|
:body {:name [st/required st/string]
|
||||||
|
@ -44,22 +44,22 @@
|
||||||
data (get parameters :body)
|
data (get parameters :body)
|
||||||
message (assoc data :id id :type :update-project :user user)]
|
message (assoc data :id id :type :update-project :user user)]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then #(http/ok %)))))
|
(p/then rsp/ok))))
|
||||||
|
|
||||||
(defn delete
|
(defn delete-project
|
||||||
"Delete project"
|
"Delete project"
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
||||||
[{:keys [user parameters] :as req}]
|
[{:keys [user parameters] :as req}]
|
||||||
(let [id (get-in parameters [:path :id])
|
(let [id (get-in parameters [:path :id])
|
||||||
message {:id id :type :delete-project :user user}]
|
message {:id id :type :delete-project :user user}]
|
||||||
(-> (sv/novelty message)
|
(-> (sv/novelty message)
|
||||||
(p/then (fn [v] (http/no-content))))))
|
(p/then (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
(defn get-by-share-token
|
(defn get-project-by-share-token
|
||||||
"Get a project by shared token"
|
"Get a project by shared token"
|
||||||
{:parameters {:path {:token [st/required st/string]}}}
|
{:parameters {:path {:token [st/required st/string]}}}
|
||||||
[{:keys [user parameters] :as req}]
|
[{:keys [user parameters] :as req}]
|
||||||
(let [message {:token (get-in parameters [:path :token])
|
(let [message {:token (get-in parameters [:path :token])
|
||||||
:type :retrieve-project-by-share-token}]
|
:type :retrieve-project-by-share-token}]
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map #(http/ok %)))))
|
(p/map rsp/ok))))
|
||||||
|
|
|
@ -4,14 +4,17 @@
|
||||||
;;
|
;;
|
||||||
;; Copyright (c) 2019 Andrey Antukh <niwi@niwi.nz>
|
;; Copyright (c) 2019 Andrey Antukh <niwi@niwi.nz>
|
||||||
|
|
||||||
(ns uxbox.api
|
(ns uxbox.http
|
||||||
(:require [mount.core :refer [defstate]]
|
(:require [mount.core :refer [defstate]]
|
||||||
[muuntaja.core :as m]
|
[muuntaja.core :as m]
|
||||||
[ring.adapter.jetty :as jetty]
|
[ring.adapter.jetty :as jetty]
|
||||||
[reitit.ring :as ring]
|
[reitit.ring :as rr]
|
||||||
[reitit.dev.pretty :as pretty]
|
[reitit.dev.pretty :as pretty]
|
||||||
[uxbox.config :as cfg]
|
[uxbox.config :as cfg]
|
||||||
[uxbox.api.middleware :refer [handler middleware authorization-middleware]]
|
[uxbox.http.middleware :refer [handler
|
||||||
|
middleware
|
||||||
|
options-handler
|
||||||
|
authorization-middleware]]
|
||||||
[uxbox.api.auth :as api-auth]
|
[uxbox.api.auth :as api-auth]
|
||||||
[uxbox.api.pages :as api-pages]
|
[uxbox.api.pages :as api-pages]
|
||||||
[uxbox.api.users :as api-users]
|
[uxbox.api.users :as api-users]
|
||||||
|
@ -22,23 +25,6 @@
|
||||||
[uxbox.api.svg :as api-svg]
|
[uxbox.api.svg :as api-svg]
|
||||||
[uxbox.util.transit :as t]))
|
[uxbox.util.transit :as t]))
|
||||||
|
|
||||||
|
|
||||||
;; --- Top Level Handlers
|
|
||||||
|
|
||||||
(defn- welcome-api
|
|
||||||
"A GET entry point for the api that shows
|
|
||||||
a welcome message."
|
|
||||||
[context]
|
|
||||||
(let [body {:message "Welcome to UXBox api."}]
|
|
||||||
{:status 200
|
|
||||||
:body {:query-params (:query-params context)
|
|
||||||
:form-params (:form-params context)
|
|
||||||
:body-params (:body-params context)
|
|
||||||
:path-params (:path-params context)
|
|
||||||
:params (:params context)}}))
|
|
||||||
|
|
||||||
;; --- Routes
|
|
||||||
|
|
||||||
(def ^:private muuntaja-instance
|
(def ^:private muuntaja-instance
|
||||||
(m/create (update-in m/default-options [:formats "application/transit+json"]
|
(m/create (update-in m/default-options [:formats "application/transit+json"]
|
||||||
merge {:encoder-opts {:handlers t/+write-handlers+}
|
merge {:encoder-opts {:handlers t/+write-handlers+}
|
||||||
|
@ -46,16 +32,17 @@
|
||||||
|
|
||||||
(def ^:private router-options
|
(def ^:private router-options
|
||||||
{;;:reitit.middleware/transform dev/print-request-diffs
|
{;;:reitit.middleware/transform dev/print-request-diffs
|
||||||
|
::rr/default-options-handler options-handler
|
||||||
:exception pretty/exception
|
:exception pretty/exception
|
||||||
:data {:muuntaja muuntaja-instance
|
:data {:muuntaja muuntaja-instance
|
||||||
:middleware middleware}})
|
:middleware middleware}})
|
||||||
|
|
||||||
(def routes
|
(def routes
|
||||||
(ring/router
|
(rr/router
|
||||||
[["/media/*" (ring/create-resource-handler {:root "public/media"})]
|
[["/media/*" (rr/create-resource-handler {:root "public/media"})]
|
||||||
["/static/*" (ring/create-resource-handler {:root "public/static"})]
|
["/static/*" (rr/create-resource-handler {:root "public/static"})]
|
||||||
|
|
||||||
["/auth"
|
["/api/auth"
|
||||||
["/login" {:post (handler #'api-auth/login)}]
|
["/login" {:post (handler #'api-auth/login)}]
|
||||||
["/register" {:post (handler #'api-auth/register)}]
|
["/register" {:post (handler #'api-auth/register)}]
|
||||||
["/recovery/:token" {:get (handler #'api-auth/register)}]
|
["/recovery/:token" {:get (handler #'api-auth/register)}]
|
||||||
|
@ -63,8 +50,6 @@
|
||||||
:get (handler #'api-auth/recover-password)}]]
|
:get (handler #'api-auth/recover-password)}]]
|
||||||
|
|
||||||
["/api" {:middleware [authorization-middleware]}
|
["/api" {:middleware [authorization-middleware]}
|
||||||
["/echo" (handler #'welcome-api)]
|
|
||||||
|
|
||||||
;; KVStore
|
;; KVStore
|
||||||
["/kvstore/:key" {:put (handler #'api-kvstore/upsert)
|
["/kvstore/:key" {:put (handler #'api-kvstore/upsert)
|
||||||
:get (handler #'api-kvstore/retrieve)
|
:get (handler #'api-kvstore/retrieve)
|
||||||
|
@ -73,20 +58,20 @@
|
||||||
["/svg/parse" {:post (handler #'api-svg/parse)}]
|
["/svg/parse" {:post (handler #'api-svg/parse)}]
|
||||||
|
|
||||||
;; Projects
|
;; Projects
|
||||||
["/projects" {:get (handler #'api-projects/list)
|
["/projects" {:get (handler #'api-projects/list-projects)
|
||||||
:post (handler #'api-projects/create)}]
|
:post (handler #'api-projects/create-project)}]
|
||||||
["/projects/by-token/:token" {:get (handler #'api-projects/get-by-share-token)}]
|
["/projects/by-token/:token" {:get (handler #'api-projects/get-project-by-share-token)}]
|
||||||
["/projects/:id" {:put (handler #'api-projects/update)
|
["/projects/:id" {:put (handler #'api-projects/update-project)
|
||||||
:delete (handler #'api-projects/delete)}]
|
:delete (handler #'api-projects/delete-project)}]
|
||||||
|
|
||||||
;; Pages
|
;; Pages
|
||||||
["/pages" {:get (handler #'api-pages/list)
|
["/pages" {:get (handler #'api-pages/list-pages)
|
||||||
:post (handler #'api-pages/create)}]
|
:post (handler #'api-pages/create-page)}]
|
||||||
["/pages/:id" {:put (handler #'api-pages/update)
|
["/pages/:id" {:put (handler #'api-pages/update-page)
|
||||||
:delete (handler #'api-pages/delete)}]
|
:delete (handler #'api-pages/delete-page)}]
|
||||||
["/pages/:id/metadata" {:put (handler #'api-pages/update-metadata)}]
|
["/pages/:id/metadata" {:put (handler #'api-pages/update-page-metadata)}]
|
||||||
["/pages/:id/history" {:get (handler #'api-pages/retrieve-history)}]
|
["/pages/:id/history" {:get (handler #'api-pages/retrieve-page-history)}]
|
||||||
["/pages/:id/history/:hid" {:put (handler #'api-pages/update-history)}]
|
["/pages/:id/history/:hid" {:put (handler #'api-pages/update-page-history)}]
|
||||||
|
|
||||||
;; Profile
|
;; Profile
|
||||||
["/profile/me" {:get (handler #'api-users/retrieve-profile)
|
["/profile/me" {:get (handler #'api-users/retrieve-profile)
|
||||||
|
@ -126,7 +111,7 @@
|
||||||
router-options))
|
router-options))
|
||||||
|
|
||||||
(def app
|
(def app
|
||||||
(ring/ring-handler routes (ring/create-default-handler)))
|
(rr/ring-handler routes (rr/create-default-handler)))
|
||||||
|
|
||||||
;; --- State Initialization
|
;; --- State Initialization
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
;;
|
;;
|
||||||
;; Copyright (c) 20162019 Andrey Antukh <niwi@niwi.nz>
|
;; Copyright (c) 20162019 Andrey Antukh <niwi@niwi.nz>
|
||||||
|
|
||||||
(ns uxbox.api.errors
|
(ns uxbox.http.errors
|
||||||
"A errors handling for api.")
|
"A errors handling for the http server.")
|
||||||
|
|
||||||
(defmulti handle-exception #(:type (ex-data %)))
|
(defmulti handle-exception #(:type (ex-data %)))
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
;;
|
;;
|
||||||
;; Copyright (c) 2016-2019 Andrey Antukh <niwi@niwi.nz>
|
;; Copyright (c) 2016-2019 Andrey Antukh <niwi@niwi.nz>
|
||||||
|
|
||||||
(ns uxbox.api.middleware
|
(ns uxbox.http.middleware
|
||||||
(:require [promesa.core :as p]
|
(:require [promesa.core :as p]
|
||||||
[buddy.core.hash :as hash]
|
[cuerdas.core :as str]
|
||||||
[buddy.core.codecs :as codecs]
|
;; [buddy.core.hash :as hash]
|
||||||
[buddy.core.codecs.base64 :as b64]
|
;; [buddy.core.codecs :as codecs]
|
||||||
[reitit.core :as rc]
|
;; [buddy.core.codecs.base64 :as b64]
|
||||||
|
[struct.core :as st]
|
||||||
|
[reitit.ring :as rr]
|
||||||
[reitit.ring.middleware.multipart :as multipart]
|
[reitit.ring.middleware.multipart :as multipart]
|
||||||
[reitit.ring.middleware.muuntaja :as muuntaja]
|
[reitit.ring.middleware.muuntaja :as muuntaja]
|
||||||
[reitit.ring.middleware.parameters :as parameters]
|
[reitit.ring.middleware.parameters :as parameters]
|
||||||
|
@ -17,9 +19,8 @@
|
||||||
[ring.middleware.session :refer [wrap-session]]
|
[ring.middleware.session :refer [wrap-session]]
|
||||||
[ring.middleware.session.cookie :refer [cookie-store]]
|
[ring.middleware.session.cookie :refer [cookie-store]]
|
||||||
[ring.middleware.multipart-params :refer [wrap-multipart-params]]
|
[ring.middleware.multipart-params :refer [wrap-multipart-params]]
|
||||||
[struct.core :as st]
|
[uxbox.http.errors :as errors]
|
||||||
[uxbox.api.errors :as api-errors]
|
[uxbox.http.response :as rsp]
|
||||||
[uxbox.util.http :as http]
|
|
||||||
[uxbox.util.data :refer [normalize-attrs]]
|
[uxbox.util.data :refer [normalize-attrs]]
|
||||||
[uxbox.util.exceptions :as ex]))
|
[uxbox.util.exceptions :as ex]))
|
||||||
|
|
||||||
|
@ -54,6 +55,7 @@
|
||||||
(try
|
(try
|
||||||
(handler (transform request) respond raise)
|
(handler (transform request) respond raise)
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
|
(prn handler)
|
||||||
(raise e))))))))})
|
(raise e))))))))})
|
||||||
|
|
||||||
(def ^:private multipart-params-middleware
|
(def ^:private multipart-params-middleware
|
||||||
|
@ -133,8 +135,8 @@
|
||||||
(def ^:private exception-middleware
|
(def ^:private exception-middleware
|
||||||
(exception/create-exception-middleware
|
(exception/create-exception-middleware
|
||||||
(assoc exception/default-handlers
|
(assoc exception/default-handlers
|
||||||
::exception/default api-errors/errors-handler
|
::exception/default errors/errors-handler
|
||||||
::exception/wrap api-errors/wrap-print-errors)))
|
::exception/wrap errors/wrap-print-errors)))
|
||||||
|
|
||||||
(def authorization-middleware
|
(def authorization-middleware
|
||||||
{:name ::authorization-middleware
|
{:name ::authorization-middleware
|
||||||
|
@ -143,11 +145,11 @@
|
||||||
([request]
|
([request]
|
||||||
(if-let [identity (get-in request [:session :user-id])]
|
(if-let [identity (get-in request [:session :user-id])]
|
||||||
(handler (assoc request :identity identity :user identity))
|
(handler (assoc request :identity identity :user identity))
|
||||||
(http/forbidden nil)))
|
(rsp/forbidden nil)))
|
||||||
([request respond raise]
|
([request respond raise]
|
||||||
(if-let [identity (get-in request [:session :user-id])]
|
(if-let [identity (get-in request [:session :user-id])]
|
||||||
(handler (assoc request :identity identity :user identity) respond raise)
|
(handler (assoc request :identity identity :user identity) respond raise)
|
||||||
(respond (http/forbidden nil))))))})
|
(respond (rsp/forbidden nil))))))})
|
||||||
|
|
||||||
(def middleware
|
(def middleware
|
||||||
[session-middleware
|
[session-middleware
|
||||||
|
@ -176,3 +178,8 @@
|
||||||
(cond-> hlrdata
|
(cond-> hlrdata
|
||||||
(:doc metadata) (assoc :description (:doc metadata)))))
|
(:doc metadata) (assoc :description (:doc metadata)))))
|
||||||
|
|
||||||
|
(defn options-handler
|
||||||
|
[request respond raise]
|
||||||
|
(let [methods (->> request rr/get-match :result (keep (fn [[k v]] (if v k))))
|
||||||
|
allow (->> methods (map (comp str/upper name)) (str/join ","))]
|
||||||
|
(respond {:status 200, :body "", :headers {"Allow" allow}})))
|
216
backend/src/uxbox/http/response.clj
Normal file
216
backend/src/uxbox/http/response.clj
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
;;
|
||||||
|
;; Copyright (c) 2019 Andrey Antukh <niwi@niwi.nz>
|
||||||
|
|
||||||
|
(ns uxbox.http.response)
|
||||||
|
|
||||||
|
(defn response
|
||||||
|
"Create a response instance."
|
||||||
|
([body] (response body 200 {}))
|
||||||
|
([body status] (response body status {}))
|
||||||
|
([body status headers] {:body body :status status :headers headers}))
|
||||||
|
|
||||||
|
(defn response?
|
||||||
|
[resp]
|
||||||
|
(and (map? resp)
|
||||||
|
(integer? (:status resp))
|
||||||
|
(map? (:headers resp))))
|
||||||
|
|
||||||
|
(defn continue
|
||||||
|
([body] (response body 100))
|
||||||
|
([body headers] (response body 100 headers)))
|
||||||
|
|
||||||
|
(defn ok
|
||||||
|
"HTTP 200 OK
|
||||||
|
Should be used to indicate nonspecific success. Must not be used to
|
||||||
|
communicate errors in the response body.
|
||||||
|
|
||||||
|
In most cases, 200 is the code the client hopes to see. It indicates that
|
||||||
|
the REST API successfully carried out whatever action the client requested,
|
||||||
|
and that no more specific code in the 2xx series is appropriate. Unlike
|
||||||
|
the 204 status code, a 200 response should include a response body."
|
||||||
|
([body] (response body 200))
|
||||||
|
([body headers] (response body 200 headers)))
|
||||||
|
|
||||||
|
(defn created
|
||||||
|
"HTTP 201 Created
|
||||||
|
Must be used to indicate successful resource creation.
|
||||||
|
|
||||||
|
A REST API responds with the 201 status code whenever a collection creates,
|
||||||
|
or a store adds, a new resource at the client's request. There may also be
|
||||||
|
times when a new resource is created as a result of some controller action,
|
||||||
|
in which case 201 would also be an appropriate response."
|
||||||
|
([location] (response "" 201 {"location" location}))
|
||||||
|
([location body] (response body 201 {"location" location}))
|
||||||
|
([location body headers] (response body 201 (merge headers {"location" location}))))
|
||||||
|
|
||||||
|
(defn accepted
|
||||||
|
"HTTP 202 Accepted
|
||||||
|
Must be used to indicate successful start of an asynchronous action.
|
||||||
|
|
||||||
|
A 202 response indicates that the client's request will be handled
|
||||||
|
asynchronously. This response status code tells the client that the request
|
||||||
|
appears valid, but it still may have problems once it's finally processed.
|
||||||
|
A 202 response is typically used for actions that take a long while to
|
||||||
|
process."
|
||||||
|
([body] (response body 202))
|
||||||
|
([body headers] (response body 202 headers)))
|
||||||
|
|
||||||
|
(defn no-content
|
||||||
|
"HTTP 204 No Content
|
||||||
|
Should be used when the response body is intentionally empty.
|
||||||
|
|
||||||
|
The 204 status code is usually sent out in response to a PUT, POST, or
|
||||||
|
DELETE request, when the REST API declines to send back any status message
|
||||||
|
or representation in the response message's body. An API may also send 204
|
||||||
|
in conjunction with a GET request to indicate that the requested resource
|
||||||
|
exists, but has no state representation to include in the body."
|
||||||
|
([] (response "" 204))
|
||||||
|
([headers] (response "" 204 headers)))
|
||||||
|
|
||||||
|
(defn moved-permanently
|
||||||
|
"301 Moved Permanently
|
||||||
|
Should be used to relocate resources.
|
||||||
|
|
||||||
|
The 301 status code indicates that the REST API's resource model has been
|
||||||
|
significantly redesigned and a new permanent URI has been assigned to the
|
||||||
|
client's requested resource. The REST API should specify the new URI in
|
||||||
|
the response's Location header."
|
||||||
|
([location] (response "" 301 {"location" location}))
|
||||||
|
([location body] (response body 301 {"location" location}))
|
||||||
|
([location body headers] (response body 301 (merge headers {"location" location}))))
|
||||||
|
|
||||||
|
(defn found
|
||||||
|
"HTTP 302 Found
|
||||||
|
Should not be used.
|
||||||
|
|
||||||
|
The intended semantics of the 302 response code have been misunderstood
|
||||||
|
by programmers and incorrectly implemented in programs since version 1.0
|
||||||
|
of the HTTP protocol.
|
||||||
|
The confusion centers on whether it is appropriate for a client to always
|
||||||
|
automatically issue a follow-up GET request to the URI in response's
|
||||||
|
Location header, regardless of the original request's method. For the
|
||||||
|
record, the intent of 302 is that this automatic redirect behavior only
|
||||||
|
applies if the client's original request used either the GET or HEAD
|
||||||
|
method.
|
||||||
|
|
||||||
|
To clear things up, HTTP 1.1 introduced status codes 303 (\"See Other\")
|
||||||
|
and 307 (\"Temporary Redirect\"), either of which should be used
|
||||||
|
instead of 302."
|
||||||
|
([location] (response "" 302 {"location" location}))
|
||||||
|
([location body] (response body 302 {"location" location}))
|
||||||
|
([location body headers] (response body 302 (merge headers {"location" location}))))
|
||||||
|
|
||||||
|
(defn see-other
|
||||||
|
"HTTP 303 See Other
|
||||||
|
Should be used to refer the client to a different URI.
|
||||||
|
|
||||||
|
A 303 response indicates that a controller resource has finished its work,
|
||||||
|
but instead of sending a potentially unwanted response body, it sends the
|
||||||
|
client the URI of a response resource. This can be the URI of a temporary
|
||||||
|
status message, or the URI to some already existing, more permanent,
|
||||||
|
resource.
|
||||||
|
Generally speaking, the 303 status code allows a REST API to send a
|
||||||
|
reference to a resource without forcing the client to download its state.
|
||||||
|
Instead, the client may send a GET request to the value of the Location
|
||||||
|
header."
|
||||||
|
([location] (response "" 303 {"location" location}))
|
||||||
|
([location body] (response body 303 {"location" location}))
|
||||||
|
([location body headers] (response body 303 (merge headers {"location" location}))))
|
||||||
|
|
||||||
|
(defn temporary-redirect
|
||||||
|
"HTTP 307 Temporary Redirect
|
||||||
|
Should be used to tell clients to resubmit the request to another URI.
|
||||||
|
|
||||||
|
HTTP/1.1 introduced the 307 status code to reiterate the originally
|
||||||
|
intended semantics of the 302 (\"Found\") status code. A 307 response
|
||||||
|
indicates that the REST API is not going to process the client's request.
|
||||||
|
Instead, the client should resubmit the request to the URI specified by
|
||||||
|
the response message's Location header.
|
||||||
|
|
||||||
|
A REST API can use this status code to assign a temporary URI to the
|
||||||
|
client's requested resource. For example, a 307 response can be used to
|
||||||
|
shift a client request over to another host."
|
||||||
|
([location] (response "" 307 {"location" location}))
|
||||||
|
([location body] (response body 307 {"location" location}))
|
||||||
|
([location body headers] (response body 307 (merge headers {"location" location}))))
|
||||||
|
|
||||||
|
(defn bad-request
|
||||||
|
"HTTP 400 Bad Request
|
||||||
|
May be used to indicate nonspecific failure.
|
||||||
|
|
||||||
|
400 is the generic client-side error status, used when no other 4xx error
|
||||||
|
code is appropriate."
|
||||||
|
([body] (response body 400))
|
||||||
|
([body headers] (response body 400 headers)))
|
||||||
|
|
||||||
|
(defn unauthorized
|
||||||
|
"HTTP 401 Unauthorized
|
||||||
|
Must be used when there is a problem with the client credentials.
|
||||||
|
|
||||||
|
A 401 error response indicates that the client tried to operate on a
|
||||||
|
protected resource without providing the proper authorization. It may have
|
||||||
|
provided the wrong credentials or none at all."
|
||||||
|
([body] (response body 401))
|
||||||
|
([body headers] (response body 401 headers)))
|
||||||
|
|
||||||
|
(defn forbidden
|
||||||
|
"HTTP 403 Forbidden
|
||||||
|
Should be used to forbid access regardless of authorization state.
|
||||||
|
|
||||||
|
A 403 error response indicates that the client's request is formed
|
||||||
|
correctly, but the REST API refuses to honor it. A 403 response is not a
|
||||||
|
case of insufficient client credentials; that would be 401 (\"Unauthorized\").
|
||||||
|
REST APIs use 403 to enforce application-level permissions. For example, a
|
||||||
|
client may be authorized to interact with some, but not all of a REST API's
|
||||||
|
resources. If the client attempts a resource interaction that is outside of
|
||||||
|
its permitted scope, the REST API should respond with 403."
|
||||||
|
([body] (response body 403))
|
||||||
|
([body headers] (response body 403 headers)))
|
||||||
|
|
||||||
|
(defn not-found
|
||||||
|
"HTTP 404 Not Found
|
||||||
|
Must be used when a client's URI cannot be mapped to a resource.
|
||||||
|
|
||||||
|
The 404 error status code indicates that the REST API can't map the
|
||||||
|
client's URI to a resource."
|
||||||
|
([body] (response body 404))
|
||||||
|
([body headers] (response body 404 headers)))
|
||||||
|
|
||||||
|
(defn method-not-allowed
|
||||||
|
([body] (response body 405))
|
||||||
|
([body headers] (response body 405 headers)))
|
||||||
|
|
||||||
|
(defn not-acceptable
|
||||||
|
([body] (response body 406))
|
||||||
|
([body headers] (response body 406 headers)))
|
||||||
|
|
||||||
|
(defn conflict
|
||||||
|
([body] (response body 409))
|
||||||
|
([body headers] (response body 409 headers)))
|
||||||
|
|
||||||
|
(defn gone
|
||||||
|
([body] (response body 410))
|
||||||
|
([body headers] (response body 410 headers)))
|
||||||
|
|
||||||
|
(defn precondition-failed
|
||||||
|
([body] (response body 412))
|
||||||
|
([body headers] (response body 412 headers)))
|
||||||
|
|
||||||
|
(defn unsupported-mediatype
|
||||||
|
([body] (response body 415))
|
||||||
|
([body headers] (response body 415 headers)))
|
||||||
|
|
||||||
|
(defn too-many-requests
|
||||||
|
([body] (response body 429))
|
||||||
|
([body headers] (response body 429 headers)))
|
||||||
|
|
||||||
|
(defn internal-server-error
|
||||||
|
([body] (response body 500))
|
||||||
|
([body headers] (response body 500 headers)))
|
||||||
|
|
||||||
|
(defn not-implemented
|
||||||
|
([body] (response body 501))
|
||||||
|
([body headers] (response body 501 headers)))
|
|
@ -9,7 +9,7 @@
|
||||||
[uxbox.config :as cfg]
|
[uxbox.config :as cfg]
|
||||||
[uxbox.migrations]
|
[uxbox.migrations]
|
||||||
[uxbox.db]
|
[uxbox.db]
|
||||||
[uxbox.api]
|
[uxbox.http]
|
||||||
[uxbox.scheduled-jobs])
|
[uxbox.scheduled-jobs])
|
||||||
(:gen-class))
|
(:gen-class))
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
(ns uxbox.tests.test-auth
|
(ns uxbox.tests.test-auth
|
||||||
(:require [clojure.test :as t]
|
(:require [clojure.test :as t]
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[clj-http.client :as http]
|
|
||||||
[buddy.hashers :as hashers]
|
[buddy.hashers :as hashers]
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.users :as usu]
|
[uxbox.services.users :as usu]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
[uxbox.tests.helpers :as th]))
|
[uxbox.tests.helpers :as th]))
|
||||||
|
@ -20,7 +19,7 @@
|
||||||
:email "user1@uxbox.io"}
|
:email "user1@uxbox.io"}
|
||||||
user (with-open [conn (db/connection)]
|
user (with-open [conn (db/connection)]
|
||||||
(usu/create-user conn data))]
|
(usu/create-user conn data))]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [data {:username "user1"
|
(let [data {:username "user1"
|
||||||
:password "user1"
|
:password "user1"
|
||||||
:metadata "1"
|
:metadata "1"
|
||||||
|
@ -38,7 +37,7 @@
|
||||||
:email "user1@uxbox.io"}
|
:email "user1@uxbox.io"}
|
||||||
user (with-open [conn (db/connection)]
|
user (with-open [conn (db/connection)]
|
||||||
(usu/create-user conn data))]
|
(usu/create-user conn data))]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [data {:username "user1"
|
(let [data {:username "user1"
|
||||||
:password "user2"
|
:password "user2"
|
||||||
:metadata "2"
|
:metadata "2"
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
[suricatta.core :as sc]
|
[suricatta.core :as sc]
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.sql :as sql]
|
[uxbox.sql :as sql]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.icons :as icons]
|
[uxbox.services.icons :as icons]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
[uxbox.tests.helpers :as th]))
|
[uxbox.tests.helpers :as th]))
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
data {:user (:id user)
|
data {:user (:id user)
|
||||||
:name "coll1"}
|
:name "coll1"}
|
||||||
coll (icons/create-collection conn data)]
|
coll (icons/create-collection conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icon-collections")
|
(let [uri (str th/+base-url+ "/api/library/icon-collections")
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
;; (println "RESPONSE:" status data)
|
;; (println "RESPONSE:" status data)
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
(t/deftest test-http-create-icon-collection
|
(t/deftest test-http-create-icon-collection
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icon-collections")
|
(let [uri (str th/+base-url+ "/api/library/icon-collections")
|
||||||
data {:user (:id user)
|
data {:user (:id user)
|
||||||
:name "coll1"}
|
:name "coll1"}
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
data {:user (:id user)
|
data {:user (:id user)
|
||||||
:name "coll1"}
|
:name "coll1"}
|
||||||
coll (icons/create-collection conn data)]
|
coll (icons/create-collection conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icon-collections/" (:id coll))
|
(let [uri (str th/+base-url+ "/api/library/icon-collections/" (:id coll))
|
||||||
params {:body (assoc coll :name "coll2")}
|
params {:body (assoc coll :name "coll2")}
|
||||||
[status data] (th/http-put user uri params)]
|
[status data] (th/http-put user uri params)]
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
:name "coll1"
|
:name "coll1"
|
||||||
:data #{1}}
|
:data #{1}}
|
||||||
coll (icons/create-collection conn data)]
|
coll (icons/create-collection conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icon-collections/" (:id coll))
|
(let [uri (str th/+base-url+ "/api/library/icon-collections/" (:id coll))
|
||||||
[status data] (th/http-delete user uri)]
|
[status data] (th/http-delete user uri)]
|
||||||
(t/is (= 204 status))
|
(t/is (= 204 status))
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
(t/deftest test-http-create-icon
|
(t/deftest test-http-create-icon
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icons")
|
(let [uri (str th/+base-url+ "/api/library/icons")
|
||||||
data {:name "sample.jpg"
|
data {:name "sample.jpg"
|
||||||
:content "<g></g>"
|
:content "<g></g>"
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
:metadata {}
|
:metadata {}
|
||||||
:collection nil}
|
:collection nil}
|
||||||
icon (icons/create-icon conn data)]
|
icon (icons/create-icon conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icons/" (:id icon))
|
(let [uri (str th/+base-url+ "/api/library/icons/" (:id icon))
|
||||||
params {:body (assoc icon :name "my stuff")}
|
params {:body (assoc icon :name "my stuff")}
|
||||||
[status data] (th/http-put user uri params)]
|
[status data] (th/http-put user uri params)]
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
:metadata {}
|
:metadata {}
|
||||||
:collection nil}
|
:collection nil}
|
||||||
icon (icons/create-icon conn data)]
|
icon (icons/create-icon conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icons/" (:id icon) "/copy")
|
(let [uri (str th/+base-url+ "/api/library/icons/" (:id icon) "/copy")
|
||||||
body {:collection nil}
|
body {:collection nil}
|
||||||
params {:body body}
|
params {:body body}
|
||||||
|
@ -137,7 +137,7 @@
|
||||||
:metadata {}
|
:metadata {}
|
||||||
:collection nil}
|
:collection nil}
|
||||||
icon (icons/create-icon conn data)]
|
icon (icons/create-icon conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icons/" (:id icon))
|
(let [uri (str th/+base-url+ "/api/library/icons/" (:id icon))
|
||||||
[status data] (th/http-delete user uri)]
|
[status data] (th/http-delete user uri)]
|
||||||
(t/is (= 204 status))
|
(t/is (= 204 status))
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
:metadata {}
|
:metadata {}
|
||||||
:collection nil}
|
:collection nil}
|
||||||
icon (icons/create-icon conn data)]
|
icon (icons/create-icon conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/icons")
|
(let [uri (str th/+base-url+ "/api/library/icons")
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
;; (println "RESPONSE:" status data)
|
;; (println "RESPONSE:" status data)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.sql :as sql]
|
[uxbox.sql :as sql]
|
||||||
[uxbox.media :as media]
|
[uxbox.media :as media]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.images :as images]
|
[uxbox.services.images :as images]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
[uxbox.tests.helpers :as th]))
|
[uxbox.tests.helpers :as th]))
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
data {:user (:id user)
|
data {:user (:id user)
|
||||||
:name "coll1"}
|
:name "coll1"}
|
||||||
coll (images/create-collection conn data)]
|
coll (images/create-collection conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/image-collections")
|
(let [uri (str th/+base-url+ "/api/library/image-collections")
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
;; (println "RESPONSE:" status data)
|
;; (println "RESPONSE:" status data)
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
(t/deftest test-http-create-image-collection
|
(t/deftest test-http-create-image-collection
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/image-collections")
|
(let [uri (str th/+base-url+ "/api/library/image-collections")
|
||||||
data {:user (:id user)
|
data {:user (:id user)
|
||||||
:name "coll1"}
|
:name "coll1"}
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
data {:user (:id user)
|
data {:user (:id user)
|
||||||
:name "coll1"}
|
:name "coll1"}
|
||||||
coll (images/create-collection conn data)]
|
coll (images/create-collection conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/image-collections/" (:id coll))
|
(let [uri (str th/+base-url+ "/api/library/image-collections/" (:id coll))
|
||||||
params {:body (assoc coll :name "coll2")}
|
params {:body (assoc coll :name "coll2")}
|
||||||
[status data] (th/http-put user uri params)]
|
[status data] (th/http-put user uri params)]
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
:name "coll1"
|
:name "coll1"
|
||||||
:data #{1}}
|
:data #{1}}
|
||||||
coll (images/create-collection conn data)]
|
coll (images/create-collection conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/image-collections/" (:id coll))
|
(let [uri (str th/+base-url+ "/api/library/image-collections/" (:id coll))
|
||||||
[status data] (th/http-delete user uri)]
|
[status data] (th/http-delete user uri)]
|
||||||
(t/is (= 204 status))
|
(t/is (= 204 status))
|
||||||
|
@ -75,7 +75,7 @@
|
||||||
(t/deftest test-http-create-image
|
(t/deftest test-http-create-image
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/images")
|
(let [uri (str th/+base-url+ "/api/library/images")
|
||||||
parts [{:name "sample.jpg"
|
parts [{:name "sample.jpg"
|
||||||
:part-name "upload"
|
:part-name "upload"
|
||||||
|
@ -102,7 +102,7 @@
|
||||||
:mimetype "image/png"
|
:mimetype "image/png"
|
||||||
:collection nil}
|
:collection nil}
|
||||||
img (images/create-image conn data)]
|
img (images/create-image conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/images/" (:id img))
|
(let [uri (str th/+base-url+ "/api/library/images/" (:id img))
|
||||||
params {:body (assoc img :name "my stuff")}
|
params {:body (assoc img :name "my stuff")}
|
||||||
[status data] (th/http-put user uri params)]
|
[status data] (th/http-put user uri params)]
|
||||||
|
@ -126,7 +126,7 @@
|
||||||
:mimetype "image/jpg"
|
:mimetype "image/jpg"
|
||||||
:collection nil}
|
:collection nil}
|
||||||
img (images/create-image conn data)]
|
img (images/create-image conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/images/" (:id img) "/copy")
|
(let [uri (str th/+base-url+ "/api/library/images/" (:id img) "/copy")
|
||||||
body {:id (:id img)
|
body {:id (:id img)
|
||||||
:collection nil}
|
:collection nil}
|
||||||
|
@ -149,7 +149,7 @@
|
||||||
:mimetype "image/png"
|
:mimetype "image/png"
|
||||||
:collection nil}
|
:collection nil}
|
||||||
img (images/create-image conn data)]
|
img (images/create-image conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/images/" (:id img))
|
(let [uri (str th/+base-url+ "/api/library/images/" (:id img))
|
||||||
[status data] (th/http-delete user uri)]
|
[status data] (th/http-delete user uri)]
|
||||||
(t/is (= 204 status))
|
(t/is (= 204 status))
|
||||||
|
@ -168,7 +168,7 @@
|
||||||
:mimetype "image/png"
|
:mimetype "image/png"
|
||||||
:collection nil}
|
:collection nil}
|
||||||
img (images/create-image conn data)]
|
img (images/create-image conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/library/images")
|
(let [uri (str th/+base-url+ "/api/library/images")
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
;; (println "RESPONSE:" status data)
|
;; (println "RESPONSE:" status data)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
[buddy.core.codecs :as codecs]
|
[buddy.core.codecs :as codecs]
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.util.uuid :as uuid]
|
[uxbox.util.uuid :as uuid]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.kvstore :as kvs]
|
[uxbox.services.kvstore :as kvs]
|
||||||
[uxbox.tests.helpers :as th]))
|
[uxbox.tests.helpers :as th]))
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
(t/is (nil? (kvs/retrieve-kvstore conn {:user id :key "foo" :version -1})))
|
(t/is (nil? (kvs/retrieve-kvstore conn {:user id :key "foo" :version -1})))
|
||||||
|
|
||||||
;; Creating new one should work as expected
|
;; Creating new one should work as expected
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/kvstore/foo")
|
(let [uri (str th/+base-url+ "/api/kvstore/foo")
|
||||||
body {:value "bar" :version -1}
|
body {:value "bar" :version -1}
|
||||||
params {:body body}
|
params {:body body}
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
(t/is (= (:value data) "bar"))
|
(t/is (= (:value data) "bar"))
|
||||||
|
|
||||||
;; Overwriting should work
|
;; Overwriting should work
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/kvstore/foo")
|
(let [uri (str th/+base-url+ "/api/kvstore/foo")
|
||||||
body (assoc data :value "baz")
|
body (assoc data :value "baz")
|
||||||
_ (prn body)
|
_ (prn body)
|
||||||
|
@ -53,7 +53,7 @@
|
||||||
(t/is (= (:value data) "baz")))
|
(t/is (= (:value data) "baz")))
|
||||||
|
|
||||||
;; Delete should work
|
;; Delete should work
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/kvstore/foo")
|
(let [uri (str th/+base-url+ "/api/kvstore/foo")
|
||||||
[status data] (th/http-delete user uri)]
|
[status data] (th/http-delete user uri)]
|
||||||
;; (println "RESPONSE:" status data)
|
;; (println "RESPONSE:" status data)
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
[suricatta.core :as sc]
|
[suricatta.core :as sc]
|
||||||
[uxbox.util.uuid :as uuid]
|
[uxbox.util.uuid :as uuid]
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.projects :as uspr]
|
[uxbox.services.projects :as uspr]
|
||||||
[uxbox.services.pages :as uspg]
|
[uxbox.services.pages :as uspg]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)
|
(let [user (th/create-user conn 1)
|
||||||
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/pages")
|
(let [uri (str th/+base-url+ "/api/pages")
|
||||||
params {:body {:project (:id proj)
|
params {:body {:project (:id proj)
|
||||||
:name "page1"
|
:name "page1"
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
:height 200
|
:height 200
|
||||||
:layout "mobil"}
|
:layout "mobil"}
|
||||||
page (uspg/create-page conn data)]
|
page (uspg/create-page conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ (str "/api/pages/" (:id page)))
|
(let [uri (str th/+base-url+ (str "/api/pages/" (:id page)))
|
||||||
params {:body (assoc page :data "3")}
|
params {:body (assoc page :data "3")}
|
||||||
[status page'] (th/http-put user uri params)]
|
[status page'] (th/http-put user uri params)]
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
:height 200
|
:height 200
|
||||||
:layout "mobil"}
|
:layout "mobil"}
|
||||||
page (uspg/create-page conn data)]
|
page (uspg/create-page conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ (str "/api/pages/" (:id page) "/metadata"))
|
(let [uri (str th/+base-url+ (str "/api/pages/" (:id page) "/metadata"))
|
||||||
params {:body (assoc page :data "3")}
|
params {:body (assoc page :data "3")}
|
||||||
[status page'] (th/http-put user uri params)]
|
[status page'] (th/http-put user uri params)]
|
||||||
|
@ -100,7 +100,7 @@
|
||||||
:height 200
|
:height 200
|
||||||
:layout "mobil"}
|
:layout "mobil"}
|
||||||
page (uspg/create-page conn data)]
|
page (uspg/create-page conn data)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ (str "/api/pages/" (:id page)))
|
(let [uri (str th/+base-url+ (str "/api/pages/" (:id page)))
|
||||||
[status response] (th/http-delete user uri)]
|
[status response] (th/http-delete user uri)]
|
||||||
;; (println "RESPONSE:" status response)
|
;; (println "RESPONSE:" status response)
|
||||||
|
@ -125,7 +125,7 @@
|
||||||
:layout "mobil"}
|
:layout "mobil"}
|
||||||
page1 (uspg/create-page conn (assoc data :project (:id proj1)))
|
page1 (uspg/create-page conn (assoc data :project (:id proj1)))
|
||||||
page2 (uspg/create-page conn (assoc data :project (:id proj2)))]
|
page2 (uspg/create-page conn (assoc data :project (:id proj2)))]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ (str "/api/pages?project=" (:id proj1)))
|
(let [uri (str th/+base-url+ (str "/api/pages?project=" (:id proj1)))
|
||||||
[status response] (th/http-get user uri)]
|
[status response] (th/http-get user uri)]
|
||||||
;; (println "RESPONSE:" status response)
|
;; (println "RESPONSE:" status response)
|
||||||
|
@ -158,7 +158,7 @@
|
||||||
(t/is (= (count result) 101)))
|
(t/is (= (count result) 101)))
|
||||||
|
|
||||||
;; Check retrieve all items
|
;; Check retrieve all items
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/pages/" (:id page) "/history")
|
(let [uri (str th/+base-url+ "/api/pages/" (:id page) "/history")
|
||||||
[status result] (th/http-get user uri nil)]
|
[status result] (th/http-get user uri nil)]
|
||||||
;; (println "RESPONSE:" status result)
|
;; (println "RESPONSE:" status result)
|
||||||
|
@ -201,7 +201,7 @@
|
||||||
result (sc/fetch conn [sql (:id data)])
|
result (sc/fetch conn [sql (:id data)])
|
||||||
item (first result)]
|
item (first result)]
|
||||||
|
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+
|
(let [uri (str th/+base-url+
|
||||||
"/api/pages/" (:id page)
|
"/api/pages/" (:id page)
|
||||||
"/history/" (:id item))
|
"/history/" (:id item))
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
[suricatta.core :as sc]
|
[suricatta.core :as sc]
|
||||||
[clj-uuid :as uuid]
|
[clj-uuid :as uuid]
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.projects :as uspr]
|
[uxbox.services.projects :as uspr]
|
||||||
[uxbox.services.pages :as uspg]
|
[uxbox.services.pages :as uspg]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)
|
(let [user (th/create-user conn 1)
|
||||||
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/projects")
|
(let [uri (str th/+base-url+ "/api/projects")
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
(t/is (= 200 status))
|
(t/is (= 200 status))
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
(t/deftest test-http-project-create
|
(t/deftest test-http-project-create
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/projects")
|
(let [uri (str th/+base-url+ "/api/projects")
|
||||||
params {:body {:name "proj1"}}
|
params {:body {:name "proj1"}}
|
||||||
[status data] (th/http-post user uri params)]
|
[status data] (th/http-post user uri params)]
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)
|
(let [user (th/create-user conn 1)
|
||||||
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/projects/" (:id proj))
|
(let [uri (str th/+base-url+ "/api/projects/" (:id proj))
|
||||||
params {:body (assoc proj :name "proj2")}
|
params {:body (assoc proj :name "proj2")}
|
||||||
[status data] (th/http-put user uri params)]
|
[status data] (th/http-put user uri params)]
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)
|
(let [user (th/create-user conn 1)
|
||||||
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
proj (uspr/create-project conn {:user (:id user) :name "proj1"})]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/projects/" (:id proj))
|
(let [uri (str th/+base-url+ "/api/projects/" (:id proj))
|
||||||
[status data] (th/http-delete user uri)]
|
[status data] (th/http-delete user uri)]
|
||||||
(t/is (= 204 status))
|
(t/is (= 204 status))
|
||||||
|
@ -76,7 +76,7 @@
|
||||||
:height 200
|
:height 200
|
||||||
:layout "mobil"})
|
:layout "mobil"})
|
||||||
shares (uspr/get-share-tokens-for-project conn (:id proj))]
|
shares (uspr/get-share-tokens-for-project conn (:id proj))]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [token (:token (first shares))
|
(let [token (:token (first shares))
|
||||||
uri (str th/+base-url+ "/api/projects/by-token/" token)
|
uri (str th/+base-url+ "/api/projects/by-token/" token)
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
(ns uxbox.tests.test-svgparse
|
(ns uxbox.tests.test-svgparse
|
||||||
(:require [clojure.test :as t]
|
(:require [clojure.test :as t]
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
[uxbox.services.svgparse :as svg]
|
[uxbox.services.svgparse :as svg]
|
||||||
[uxbox.tests.helpers :as th]))
|
[uxbox.tests.helpers :as th]))
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
;; (let [image (slurp (io/resource "uxbox/tests/_files/sample2.svg"))
|
;; (let [image (slurp (io/resource "uxbox/tests/_files/sample2.svg"))
|
||||||
;; path "/api/svg/parse"
|
;; path "/api/svg/parse"
|
||||||
;; user (th/create-user conn 1)]
|
;; user (th/create-user conn 1)]
|
||||||
;; (th/with-server {:handler uapi/app}
|
;; (th/with-server {:handler http/app}
|
||||||
;; (let [rsp (th/request {:method :post
|
;; (let [rsp (th/request {:method :post
|
||||||
;; :path path
|
;; :path path
|
||||||
;; :body image
|
;; :body image
|
||||||
|
|
|
@ -3,10 +3,9 @@
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[buddy.hashers :as hashers]
|
[buddy.hashers :as hashers]
|
||||||
[clj-http.client :as http]
|
|
||||||
[suricatta.core :as sc]
|
[suricatta.core :as sc]
|
||||||
[uxbox.db :as db]
|
[uxbox.db :as db]
|
||||||
[uxbox.api :as uapi]
|
[uxbox.http :as http]
|
||||||
[uxbox.services.users :as usu]
|
[uxbox.services.users :as usu]
|
||||||
[uxbox.services :as usv]
|
[uxbox.services :as usv]
|
||||||
[uxbox.tests.helpers :as th]))
|
[uxbox.tests.helpers :as th]))
|
||||||
|
@ -17,7 +16,7 @@
|
||||||
(t/deftest test-http-retrieve-profile
|
(t/deftest test-http-retrieve-profile
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/profile/me")
|
(let [uri (str th/+base-url+ "/api/profile/me")
|
||||||
[status data] (th/http-get user uri)]
|
[status data] (th/http-get user uri)]
|
||||||
;; (println "RESPONSE:" status data)
|
;; (println "RESPONSE:" status data)
|
||||||
|
@ -31,7 +30,7 @@
|
||||||
(t/deftest test-http-update-profile
|
(t/deftest test-http-update-profile
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/profile/me")
|
(let [uri (str th/+base-url+ "/api/profile/me")
|
||||||
data (assoc user
|
data (assoc user
|
||||||
:fullname "Full Name"
|
:fullname "Full Name"
|
||||||
|
@ -50,7 +49,7 @@
|
||||||
(t/deftest test-http-update-profile-photo
|
(t/deftest test-http-update-profile-photo
|
||||||
(with-open [conn (db/connection)]
|
(with-open [conn (db/connection)]
|
||||||
(let [user (th/create-user conn 1)]
|
(let [user (th/create-user conn 1)]
|
||||||
(th/with-server {:handler uapi/app}
|
(th/with-server {:handler http/app}
|
||||||
(let [uri (str th/+base-url+ "/api/profile/me/photo")
|
(let [uri (str th/+base-url+ "/api/profile/me/photo")
|
||||||
params [{:name "sample.jpg"
|
params [{:name "sample.jpg"
|
||||||
:part-name "file"
|
:part-name "file"
|
||||||
|
|
Loading…
Add table
Reference in a new issue