mirror of
https://github.com/penpot/penpot.git
synced 2025-03-12 07:41:43 -05:00
🚧 Initial work on replace struct with spec.
This commit is contained in:
parent
97220d707b
commit
5afbfe1ce9
4 changed files with 127 additions and 49 deletions
|
@ -13,20 +13,41 @@
|
||||||
[uxbox.util.spec :as us]
|
[uxbox.util.spec :as us]
|
||||||
[uxbox.util.uuid :as uuid]))
|
[uxbox.util.uuid :as uuid]))
|
||||||
|
|
||||||
|
;; --- Common Specs
|
||||||
|
|
||||||
|
(s/def ::id ::us/uuid)
|
||||||
|
(s/def ::name string?)
|
||||||
|
(s/def ::project ::us/uuid)
|
||||||
|
(s/def ::version (s/and integer? pos?))
|
||||||
|
(s/def ::data any?)
|
||||||
|
(s/def ::metadata any?)
|
||||||
|
|
||||||
|
;; --- List Pages
|
||||||
|
|
||||||
|
(s/def ::list-pages|query
|
||||||
|
(s/keys :req-un [::project]))
|
||||||
|
|
||||||
(defn list-pages
|
(defn list-pages
|
||||||
{:parameters {:query {:project [st/required st/uuid-str]}}}
|
{:parameters {:query ::list-pages|query}
|
||||||
|
:validation :spec}
|
||||||
[{: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 rsp/ok))))
|
(p/then rsp/ok))))
|
||||||
|
|
||||||
|
;; --- Create Page
|
||||||
|
|
||||||
|
(s/def ::create-page|body
|
||||||
|
(s/keys :req-un [::data
|
||||||
|
::metadata
|
||||||
|
::project
|
||||||
|
::name]
|
||||||
|
:opt-un [::id]))
|
||||||
|
|
||||||
(defn create-page
|
(defn create-page
|
||||||
{:parameters {:body {:data [st/required]
|
{:parameters {:body ::create-page|body}
|
||||||
:metadata [st/required]
|
:validation :spec}
|
||||||
:project [st/required st/uuid]
|
|
||||||
:name [st/required st/string]
|
|
||||||
:id [st/uuid]}}}
|
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [data (get parameters :body)
|
(let [data (get parameters :body)
|
||||||
message (assoc data :user user :type :create-page)]
|
message (assoc data :user user :type :create-page)]
|
||||||
|
@ -35,14 +56,23 @@
|
||||||
(let [loc (str "/api/pages/" (:id result))]
|
(let [loc (str "/api/pages/" (:id result))]
|
||||||
(rsp/created loc result)))))))
|
(rsp/created loc result)))))))
|
||||||
|
|
||||||
|
;; --- Update Page
|
||||||
|
|
||||||
|
(s/def ::update-page|path
|
||||||
|
(s/keys :req-un [::id]))
|
||||||
|
|
||||||
|
(s/def ::update-page|body
|
||||||
|
(s/keys :req-un [::data
|
||||||
|
::metadata
|
||||||
|
::project
|
||||||
|
::name
|
||||||
|
::version]
|
||||||
|
:opt-un [::id]))
|
||||||
|
|
||||||
(defn update-page
|
(defn update-page
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path ::update-page|path
|
||||||
:body {:data [st/required]
|
:body ::update-page|body}
|
||||||
:metadata [st/required]
|
:validation :spec}
|
||||||
:project [st/required st/uuid]
|
|
||||||
:name [st/required st/string]
|
|
||||||
:version [st/required st/integer]
|
|
||||||
:id [st/uuid]}}}
|
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [id (get-in parameters [:path :id])
|
(let [id (get-in parameters [:path :id])
|
||||||
data (get parameters :body)
|
data (get parameters :body)
|
||||||
|
@ -50,12 +80,21 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map #(rsp/ok %)))))
|
(p/map #(rsp/ok %)))))
|
||||||
|
|
||||||
|
;; --- Update Page Metadata
|
||||||
|
|
||||||
|
(s/def ::update-page-metadata|path
|
||||||
|
(s/keys :req-un [::id]))
|
||||||
|
|
||||||
|
(s/def ::update-page-metadata|body
|
||||||
|
(s/keys :req-un [::id
|
||||||
|
::metadata
|
||||||
|
::project
|
||||||
|
::name]))
|
||||||
|
|
||||||
(defn update-page-metadata
|
(defn update-page-metadata
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path ::update-page-metadata|path
|
||||||
:body {:id [st/required st/uuid]
|
:body ::update-page-metadata|body}
|
||||||
:metadata [st/required]
|
:validation :spec}
|
||||||
:project [st/required st/uuid]
|
|
||||||
:name [st/required st/string]}}}
|
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [id (get-in parameters [:path :id])
|
(let [id (get-in parameters [:path :id])
|
||||||
data (get parameters :body)
|
data (get parameters :body)
|
||||||
|
@ -63,20 +102,39 @@
|
||||||
(->> (sv/novelty message)
|
(->> (sv/novelty message)
|
||||||
(p/map rsp/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
|
;; --- Delete Page
|
||||||
|
|
||||||
|
(s/def ::delete-page|path
|
||||||
|
(s/keys :req-un [::id]))
|
||||||
|
|
||||||
(defn delete-page
|
(defn delete-page
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}}}
|
{:parameters {:path ::delete-page|path}
|
||||||
|
:validation :spec}
|
||||||
[{: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 (constantly (rsp/no-content))))))
|
(p/then (constantly (rsp/no-content))))))
|
||||||
|
|
||||||
|
;; --- Retrieve Page History
|
||||||
|
|
||||||
|
(s/def ::max ::us/integer)
|
||||||
|
(s/def ::since ::us/integer)
|
||||||
|
(s/def ::pinned ::us/boolean)
|
||||||
|
|
||||||
|
(s/def ::retrieve-page-history|path
|
||||||
|
(s/keys :req-un [::id]))
|
||||||
|
|
||||||
|
(s/def ::retrieve-page-history|query
|
||||||
|
(s/keys :req-un [::max
|
||||||
|
::since
|
||||||
|
::pinned]))
|
||||||
|
|
||||||
(defn retrieve-page-history
|
(defn retrieve-page-history
|
||||||
"Retrieve the page history"
|
"Retrieve the page history"
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]}
|
{:parameters {:path ::retrieve-page-history|path
|
||||||
:query {:max [st/integer-str]
|
:query ::retrieve-page-history|query}
|
||||||
:since [st/integer-str]
|
:validation :spec}
|
||||||
:pinned [st/boolean-str]}}}
|
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [id (get-in parameters [:path :id])
|
(let [id (get-in parameters [:path :id])
|
||||||
data (get parameters :query)
|
data (get parameters :query)
|
||||||
|
@ -84,11 +142,21 @@
|
||||||
(->> (sv/query message)
|
(->> (sv/query message)
|
||||||
(p/map rsp/ok))))
|
(p/map rsp/ok))))
|
||||||
|
|
||||||
|
;; --- Update page history
|
||||||
|
|
||||||
|
(s/def ::hid ::us/uuid)
|
||||||
|
(s/def ::label string?)
|
||||||
|
|
||||||
|
(s/def ::update-page-history|path
|
||||||
|
(s/keys :req-un [::id ::hid]))
|
||||||
|
|
||||||
|
(s/def ::update-page-history|body
|
||||||
|
(s/keys :req-un [::label ::pinned]))
|
||||||
|
|
||||||
(defn update-page-history
|
(defn update-page-history
|
||||||
{:parameters {:path {:id [st/required st/uuid-str]
|
{:parameters {:path ::update-page-history|path
|
||||||
:hid [st/required st/uuid-str]}
|
:body ::update-page-history|body}
|
||||||
:body {:label [st/required st/string]
|
:validation :spec}
|
||||||
:pinned [st/required st/boolean]}}}
|
|
||||||
[{:keys [user parameters]}]
|
[{:keys [user parameters]}]
|
||||||
(let [{:keys [id hid]} (get parameters :path)
|
(let [{:keys [id hid]} (get parameters :path)
|
||||||
message (assoc (get parameters :body)
|
message (assoc (get parameters :body)
|
||||||
|
|
|
@ -5,16 +5,27 @@
|
||||||
;; Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
|
;; Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
|
||||||
|
|
||||||
(ns uxbox.util.exceptions
|
(ns uxbox.util.exceptions
|
||||||
"A helpers for work with exceptions.")
|
"A helpers for work with exceptions."
|
||||||
|
(:require [clojure.spec.alpha :as s]))
|
||||||
|
|
||||||
|
(s/def ::type keyword?)
|
||||||
|
(s/def ::code keyword?)
|
||||||
|
(s/def ::mesage string?)
|
||||||
|
(s/def ::hint string?)
|
||||||
|
(s/def ::cause #(instance? Exception %))
|
||||||
|
(s/def ::error-params
|
||||||
|
(s/keys :req-un [::type]
|
||||||
|
:opt-un [::code
|
||||||
|
::hint
|
||||||
|
::mesage
|
||||||
|
::cause]))
|
||||||
|
|
||||||
(defn error
|
(defn error
|
||||||
[& {:keys [type code message] :or {type :unexpected} :as payload}]
|
[& {:keys [type code message hint cause] :as params}]
|
||||||
{:pre [(keyword? type) (keyword? code)]}
|
(s/assert ::error-params params)
|
||||||
(let [message (if message
|
(let [message (or message hint "")
|
||||||
(str message " / " (pr-str code) "")
|
payload (dissoc params :cause :message)]
|
||||||
(pr-str code))
|
(ex-info message payload cause)))
|
||||||
payload (assoc payload :type type)]
|
|
||||||
(ex-info message payload)))
|
|
||||||
|
|
||||||
(defmacro raise
|
(defmacro raise
|
||||||
[& args]
|
[& args]
|
||||||
|
|
|
@ -25,11 +25,8 @@
|
||||||
[spec data]
|
[spec data]
|
||||||
(let [result (s/conform spec data)]
|
(let [result (s/conform spec data)]
|
||||||
(if (= result ::s/invalid)
|
(if (= result ::s/invalid)
|
||||||
(ex/raise :type :validation
|
[nil (s/explain-data spec data)]
|
||||||
:code ::invalid
|
[result nil])))
|
||||||
:message (s/explain-str spec data)
|
|
||||||
:context (s/explain-data spec data))
|
|
||||||
result)))
|
|
||||||
|
|
||||||
(defn valid?
|
(defn valid?
|
||||||
[spec data]
|
[spec data]
|
||||||
|
@ -41,7 +38,7 @@
|
||||||
|
|
||||||
(defn email?
|
(defn email?
|
||||||
[v]
|
[v]
|
||||||
(and string?
|
(and (string? v)
|
||||||
(re-matches email-rx v)))
|
(re-matches email-rx v)))
|
||||||
|
|
||||||
(defn instant?
|
(defn instant?
|
||||||
|
@ -100,20 +97,21 @@
|
||||||
|
|
||||||
;; --- Default Specs
|
;; --- Default Specs
|
||||||
|
|
||||||
(s/def ::integer-string (s/conformer integer-conformer str))
|
(s/def ::integer (s/conformer integer-conformer str))
|
||||||
(s/def ::uuid-string (s/conformer uuid-conformer str))
|
(s/def ::uuid (s/conformer uuid-conformer str))
|
||||||
(s/def ::boolean-string (s/conformer boolean-conformer boolean-unformer))
|
(s/def ::boolean (s/conformer boolean-conformer boolean-unformer))
|
||||||
(s/def ::positive-integer #(< 0 % Long/MAX_VALUE))
|
(s/def ::positive pos?)
|
||||||
|
(s/def ::negative neg?)
|
||||||
(s/def ::uploaded-file any?)
|
(s/def ::uploaded-file any?)
|
||||||
(s/def ::uuid uuid?)
|
|
||||||
(s/def ::bytes bytes?)
|
(s/def ::bytes bytes?)
|
||||||
(s/def ::path path?)
|
(s/def ::path path?)
|
||||||
|
(s/def ::email email?)
|
||||||
|
|
||||||
(s/def ::id ::uuid-string)
|
;; TODO: deprecated
|
||||||
|
(s/def ::id ::uuid)
|
||||||
(s/def ::name string?)
|
(s/def ::name string?)
|
||||||
(s/def ::username string?)
|
(s/def ::username string?)
|
||||||
(s/def ::password string?)
|
(s/def ::password string?)
|
||||||
(s/def ::version integer?)
|
(s/def ::version integer?)
|
||||||
(s/def ::email email?)
|
|
||||||
(s/def ::token string?)
|
(s/def ::token string?)
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
(ns uxbox.util.transit
|
(ns uxbox.util.transit
|
||||||
(:require [cognitect.transit :as t]
|
(:require [cognitect.transit :as t]
|
||||||
|
[clojure.java.io :as io]
|
||||||
[uxbox.util.time :as dt])
|
[uxbox.util.time :as dt])
|
||||||
(:import java.io.ByteArrayInputStream
|
(:import java.io.ByteArrayInputStream
|
||||||
java.io.ByteArrayOutputStream
|
java.io.ByteArrayOutputStream
|
||||||
|
@ -52,7 +53,7 @@
|
||||||
([data]
|
([data]
|
||||||
(decode data nil))
|
(decode data nil))
|
||||||
([data opts]
|
([data opts]
|
||||||
(with-open [input (ByteArrayInputStream. data)]
|
(with-open [input (io/input-stream data)]
|
||||||
(read! (reader input opts)))))
|
(read! (reader input opts)))))
|
||||||
|
|
||||||
(defn encode
|
(defn encode
|
||||||
|
|
Loading…
Add table
Reference in a new issue