0
Fork 0
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:
Andrey Antukh 2019-06-16 01:57:27 +02:00
parent 3ff0ecee5f
commit 9d58d0fac5
19 changed files with 368 additions and 166 deletions

View file

@ -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 "")))))))

View file

@ -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))))

View file

@ -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))))

View file

@ -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))))))

View file

@ -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))))

View file

@ -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))))

View file

@ -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

View file

@ -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 %)))

View file

@ -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}})))

View 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)))

View file

@ -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))

View file

@ -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"

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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))

View file

@ -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)]

View file

@ -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

View file

@ -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"