0
Fork 0
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:
Andrey Antukh 2019-09-14 19:43:46 +02:00
parent 97220d707b
commit 5afbfe1ce9
4 changed files with 127 additions and 49 deletions

View file

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

View file

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

View file

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

View file

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