From d2bedec59cd54d84502979f006395f75987ca159 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 13:00:30 +0200 Subject: [PATCH 01/21] :sparkles: Unify naming of schema registering functions --- backend/src/app/media.clj | 4 +- backend/src/app/rpc/permissions.clj | 2 +- backend/src/app/util/time.clj | 4 +- common/src/app/common/features.cljc | 2 +- common/src/app/common/files/changes.cljc | 37 ++++---- .../src/app/common/files/changes_builder.cljc | 2 +- common/src/app/common/geom/matrix.cljc | 2 +- common/src/app/common/geom/point.cljc | 2 +- common/src/app/common/geom/rect.cljc | 2 +- common/src/app/common/schema.cljc | 89 +++++++++---------- common/src/app/common/types/color.cljc | 10 +-- common/src/app/common/types/container.cljc | 2 +- common/src/app/common/types/file.cljc | 4 +- common/src/app/common/types/grid.cljc | 10 +-- common/src/app/common/types/page.cljc | 6 +- common/src/app/common/types/shape.cljc | 34 +++---- common/src/app/common/types/shape/blur.cljc | 2 +- common/src/app/common/types/shape/export.cljc | 2 +- .../app/common/types/shape/interactions.cljc | 4 +- common/src/app/common/types/shape/layout.cljc | 10 +-- common/src/app/common/types/shape/path.cljc | 4 +- common/src/app/common/types/shape/shadow.cljc | 2 +- common/src/app/common/types/shape/text.cljc | 4 +- common/src/app/common/types/typography.cljc | 2 +- 24 files changed, 119 insertions(+), 123 deletions(-) diff --git a/backend/src/app/media.clj b/backend/src/app/media.clj index 8d2315352a..0182955468 100644 --- a/backend/src/app/media.clj +++ b/backend/src/app/media.clj @@ -47,7 +47,7 @@ (s/keys :req-un [::path] :opt-un [::mtype])) -(sm/def! ::fs/path +(sm/register! ::fs/path {:type ::fs/path :pred fs/path? :type-properties @@ -59,7 +59,7 @@ ::oapi/format "unix-path" ::oapi/decode fs/path}}) -(sm/def! ::upload +(sm/register! ::upload [:map {:title "Upload"} [:filename :string] [:size :int] diff --git a/backend/src/app/rpc/permissions.clj b/backend/src/app/rpc/permissions.clj index d2f1719ee6..ef1d71072a 100644 --- a/backend/src/app/rpc/permissions.clj +++ b/backend/src/app/rpc/permissions.clj @@ -12,7 +12,7 @@ [app.common.spec :as us] [clojure.spec.alpha :as s])) -(sm/def! ::permissions +(sm/register! ::permissions [:map {:title "Permissions"} [:type {:gen/elements [:membership :share-link]} :keyword] [:is-owner :boolean] diff --git a/backend/src/app/util/time.clj b/backend/src/app/util/time.clj index 7785966245..4c8f6d40ee 100644 --- a/backend/src/app/util/time.clj +++ b/backend/src/app/util/time.clj @@ -368,7 +368,7 @@ (let [p1 (System/nanoTime)] #(duration {:nanos (- (System/nanoTime) p1)}))) -(sm/def! ::instant +(sm/register! ::instant {:type ::instant :pred instant? :type-properties @@ -379,7 +379,7 @@ ::oapi/type "string" ::oapi/format "iso"}}) -(sm/def! ::duration +(sm/register! ::duration {:type :durations :pred duration? :type-properties diff --git a/common/src/app/common/features.cljc b/common/src/app/common/features.cljc index f0c35b26b3..6e55620965 100644 --- a/common/src/app/common/features.cljc +++ b/common/src/app/common/features.cljc @@ -84,7 +84,7 @@ "plugins/runtime"} (into frontend-only-features))) -(sm/def! ::features +(sm/register! ::features [:schema {:title "FileFeatures" ::smdj/inline true diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index 3df8b9d895..f3d0cc71e1 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -33,25 +33,24 @@ (def ^:private schema:operation - (sm/define - [:multi {:dispatch :type :title "Operation" ::smd/simplified true} - [:set - [:map {:title "SetOperation"} - [:type [:= :set]] - [:attr :keyword] - [:val :any] - [:ignore-touched {:optional true} :boolean] - [:ignore-geometry {:optional true} :boolean]]] - [:set-touched - [:map {:title "SetTouchedOperation"} - [:type [:= :set-touched]] - [:touched [:maybe [:set :keyword]]]]] - [:set-remote-synced - [:map {:title "SetRemoteSyncedOperation"} - [:type [:= :set-remote-synced]] - [:remote-synced {:optional true} [:maybe :boolean]]]]])) + [:multi {:dispatch :type :title "Operation" ::smd/simplified true} + [:set + [:map {:title "SetOperation"} + [:type [:= :set]] + [:attr :keyword] + [:val :any] + [:ignore-touched {:optional true} :boolean] + [:ignore-geometry {:optional true} :boolean]]] + [:set-touched + [:map {:title "SetTouchedOperation"} + [:type [:= :set-touched]] + [:touched [:maybe [:set :keyword]]]]] + [:set-remote-synced + [:map {:title "SetRemoteSyncedOperation"} + [:type [:= :set-remote-synced]] + [:remote-synced {:optional true} [:maybe :boolean]]]]]) -(sm/define! ::change +(sm/register! ::change [:schema [:multi {:dispatch :type :title "Change" ::smd/simplified true} [:set-option @@ -246,7 +245,7 @@ [:type [:= :del-typography]] [:id ::sm/uuid]]]]]) -(sm/define! ::changes +(sm/register! ::changes [:sequential {:gen/max 2} ::change]) (def check-change! diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index 12e927ac0f..c3ecbd8a16 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -24,7 +24,7 @@ ;; Auxiliary functions to help create a set of changes (undo + redo) -(sm/define! ::changes +(sm/register! ::changes [:map {:title "changes"} [:redo-changes vector?] [:undo-changes seq?] diff --git a/common/src/app/common/geom/matrix.cljc b/common/src/app/common/geom/matrix.cljc index d435d861cc..7c090a2d65 100644 --- a/common/src/app/common/geom/matrix.cljc +++ b/common/src/app/common/geom/matrix.cljc @@ -90,7 +90,7 @@ (sm/lazy-validator [:and [:fn matrix?] schema:matrix-attrs])) -(sm/def! ::matrix +(sm/register! ::matrix (letfn [(decode [o] (if (map? o) (map->Matrix o) diff --git a/common/src/app/common/geom/point.cljc b/common/src/app/common/geom/point.cljc index 0a04fa7476..560f30a5b1 100644 --- a/common/src/app/common/geom/point.cljc +++ b/common/src/app/common/geom/point.cljc @@ -61,7 +61,7 @@ (sm/lazy-validator [:and [:fn point?] schema:point-attrs])) -(sm/def! ::point +(sm/register! ::point (letfn [(decode [p] (if (map? p) (map->Point p) diff --git a/common/src/app/common/geom/rect.cljc b/common/src/app/common/geom/rect.cljc index 48d620adfc..c23f9942b1 100644 --- a/common/src/app/common/geom/rect.cljc +++ b/common/src/app/common/geom/rect.cljc @@ -80,7 +80,7 @@ [:x2 ::sm/safe-number] [:y2 ::sm/safe-number]]) -(sm/define! ::rect +(sm/register! ::rect [:and {:gen/gen (->> (sg/tuple (sg/small-double) (sg/small-double) diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index 425525ca30..621bd8ec52 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -75,7 +75,8 @@ (-explain s value) (m/explain s value default-options))) -(defn humanize +(defn simplify + "Given an explain data structure, return a simplified version of it" [exp] (me/humanize exp)) @@ -86,10 +87,12 @@ (mg/generate (schema s) o))) (defn form + "Returns a readable form of the schema" [s] (m/form s default-options)) (defn merge + "Merge two schemas" [& items] (apply mu/merge (map schema items))) @@ -102,6 +105,7 @@ (m/deref s)) (defn error-values + "Get error values form explain data structure" [exp] (malli.error/error-value exp {:malli.error/mask-valid-values '...})) @@ -138,18 +142,6 @@ :decoders coders :encoders coders}))) -(defn validator - [s] - (if (lazy-schema? s) - (-get-validator s) - (-> s schema m/validator))) - -(defn explainer - [s] - (if (lazy-schema? s) - (-get-explainer s) - (-> s schema m/explainer))) - (defn encode ([s val transformer] (m/encode s val default-options transformer)) @@ -164,6 +156,18 @@ ([s val options transformer] (m/decode s val options transformer))) +(defn validator + [s] + (if (lazy-schema? s) + (-get-validator s) + (-> s schema m/validator))) + +(defn explainer + [s] + (if (lazy-schema? s) + (-get-explainer s) + (-> s schema m/explainer))) + (defn encoder ([s] (if (lazy-schema? s) @@ -201,6 +205,7 @@ (fn [v] (@vfn v))))) (defn humanize-explain + "Returns a string representation of the explain data structure" [{:keys [schema errors value]} & {:keys [length level]}] (let [errors (mapv #(update % :schema form) errors)] (with-out-str @@ -213,7 +218,6 @@ :level (d/nilv level 8) :length (d/nilv length 12)}))))) - (defmethod v/-format ::schemaless-explain [_ {:keys [schema] :as explanation} printer] {:body [:group @@ -353,15 +357,8 @@ (defn register! [type s] (let [s (if (map? s) (simple-schema s) s)] - (swap! sr/registry assoc type s))) - -(defn def! [type s] - (register! type s) - nil) - -(defn define! [id s] - (register! id s) - nil) + (swap! sr/registry assoc type s) + nil)) (defn define "Create ans instance of ILazySchema" @@ -435,8 +432,8 @@ ;; --- BUILTIN SCHEMAS -(define! :merge (mu/-merge)) -(define! :union (mu/-union)) +(register! :merge (mu/-merge)) +(register! :union (mu/-union)) (def uuid-rx #"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$") @@ -447,7 +444,7 @@ (some->> (re-matches uuid-rx s) uuid/uuid) s)) -(define! ::uuid +(register! ::uuid {:type ::uuid :pred uuid? :type-properties @@ -472,7 +469,7 @@ (and (string? s) (re-seq email-re s))) -(define! ::email +(register! ::email {:type :string :pred email-string? :property-pred @@ -501,7 +498,7 @@ ;; NOTE: this is general purpose set spec and should be used over the other -(define! ::set +(register! ::set {:type :set :min 0 :max 1 @@ -557,7 +554,7 @@ (into #{} xform v)))}}))}) -(define! ::vec +(register! ::vec {:type :vector :min 0 :max 1 @@ -614,7 +611,7 @@ (into [] xform v)))}}))}) -(define! ::set-of-strings +(register! ::set-of-strings {:type ::set-of-strings :pred #(and (set? %) (every? string? %)) :type-properties @@ -630,7 +627,7 @@ (let [v (if (string? v) (str/split v #"[\s,]+") v)] (into #{} non-empty-strings-xf v)))}}) -(define! ::set-of-keywords +(register! ::set-of-keywords {:type ::set-of-keywords :pred #(and (set? %) (every? keyword? %)) :type-properties @@ -646,7 +643,7 @@ (let [v (if (string? v) (str/split v #"[\s,]+") v)] (into #{} (comp non-empty-strings-xf (map keyword)) v)))}}) -(define! ::set-of-emails +(register! ::set-of-emails {:type ::set-of-emails :pred #(and (set? %) (every? string? %)) :type-properties @@ -662,7 +659,7 @@ (let [v (if (string? v) (str/split v #"[\s,]+") v)] (into #{} (keep parse-email) v)))}}) -(define! ::set-of-uuid +(register! ::set-of-uuid {:type ::set-of-uuid :pred #(and (set? %) (every? uuid? %)) :type-properties @@ -678,7 +675,7 @@ (let [v (if (string? v) (str/split v #"[\s,]+") v)] (into #{} (keep parse-uuid) v)))}}) -(define! ::coll-of-uuid +(register! ::coll-of-uuid {:type ::set-of-uuid :pred (partial every? uuid?) :type-properties @@ -694,7 +691,7 @@ (let [v (if (string? v) (str/split v #"[\s,]+") v)] (into [] (keep parse-uuid) v)))}}) -(define! ::one-of +(register! ::one-of {:type ::one-of :min 1 :max 1 @@ -717,7 +714,7 @@ ;; Integer/MIN_VALUE (def min-safe-int -2147483648) -(define! ::safe-int +(register! ::safe-int {:type ::safe-int :pred #(and (int? %) (>= max-safe-int %) (>= % min-safe-int)) :type-properties @@ -732,7 +729,7 @@ (parse-long s) s))}}) -(define! ::safe-number +(register! ::safe-number {:type ::safe-number :pred #(and (number? %) (>= max-safe-int %) (>= % min-safe-int)) :type-properties @@ -748,7 +745,7 @@ (parse-double s) s))}}) -(define! ::safe-double +(register! ::safe-double {:type ::safe-double :pred #(and (double? %) (>= max-safe-int %) (>= % min-safe-int)) :type-properties @@ -763,7 +760,7 @@ (parse-double s) s))}}) -(define! ::contains-any +(register! ::contains-any {:type ::contains-any :min 1 :max 1 @@ -781,7 +778,7 @@ {:title "contains" :description "contains predicate"}}))}) -(define! ::inst +(register! ::inst {:type ::inst :pred inst? :type-properties @@ -793,12 +790,12 @@ ::oapi/type "number" ::oapi/format "int64"}}) -(define! ::fn +(register! ::fn [:schema fn?]) ;; FIXME: deprecated, replace with ::text -(define! ::word-string +(register! ::word-string {:type ::word-string :pred #(and (string? %) (not (str/blank? %))) :property-pred (m/-min-max-pred count) @@ -810,7 +807,7 @@ ::oapi/type "string" ::oapi/format "string"}}) -(define! ::uri +(register! ::uri {:type ::uri :pred u/uri? :property-pred @@ -849,7 +846,7 @@ ::oapi/format "uri" ::oapi/decode (comp u/uri str/trim)}}) -(define! ::text +(register! ::text {:type :string :pred #(and (string? %) (not (str/blank? %))) :property-pred @@ -891,7 +888,7 @@ (str/blank? value)) "errors.field-not-all-whitespace")))}}) -(define! ::password +(register! ::password {:type :string :pred (fn [value] @@ -908,7 +905,7 @@ ;; FIXME: this should not be here -(define! ::plugin-data +(register! ::plugin-data [:map-of {:gen/max 5} :string :string]) ;; ---- PREDICATES diff --git a/common/src/app/common/types/color.cljc b/common/src/app/common/types/color.cljc index dea0ee6fc1..64c8571612 100644 --- a/common/src/app/common/types/color.cljc +++ b/common/src/app/common/types/color.cljc @@ -37,7 +37,7 @@ (.. g (toString 16) (padStart 2 "0")) (.. b (toString 16) (padStart 2 "0")))))) -(sm/define! ::rgb-color +(sm/register! ::rgb-color {:type ::rgb-color :pred #(and (string? %) (some? (re-matches rgb-color-re %))) :type-properties @@ -49,7 +49,7 @@ ::oapi/type "integer" ::oapi/format "int64"}}) -(sm/define! ::image-color +(sm/register! ::image-color [:map {:title "ImageColor"} [:name {:optional true} :string] [:width :int] @@ -58,7 +58,7 @@ [:id ::sm/uuid] [:keep-aspect-ratio {:optional true} :boolean]]) -(sm/define! ::gradient +(sm/register! ::gradient [:map {:title "Gradient"} [:type [::sm/one-of #{:linear :radial}]] [:start-x ::sm/safe-number] @@ -73,7 +73,7 @@ [:opacity {:optional true} [:maybe ::sm/safe-number]] [:offset ::sm/safe-number]]]]]) -(sm/define! ::color +(sm/register! ::color [:and [:map {:title "Color"} [:id {:optional true} ::sm/uuid] @@ -91,7 +91,7 @@ [:map-of {:gen/max 5} :keyword ::sm/plugin-data]]] [::sm/contains-any {:strict true} [:color :gradient :image]]]) -(sm/define! ::recent-color +(sm/register! ::recent-color [:and [:map {:title "RecentColor"} [:opacity {:optional true} [:maybe ::sm/safe-number]] diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index 0313870b66..d8aa12b938 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -26,7 +26,7 @@ (def valid-container-types #{:page :component}) -(sm/define! ::container +(sm/register! ::container [:map [:id ::sm/uuid] [:type {:optional true} diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index c8c7fbe432..b7f7acd7dc 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -34,7 +34,7 @@ ;; SCHEMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/define! ::media-object +(sm/register! ::media-object [:map {:title "FileMediaObject"} [:id ::sm/uuid] [:name :string] @@ -43,7 +43,7 @@ [:mtype :string] [:path {:optional true} [:maybe :string]]]) -(sm/define! ::data +(sm/register! ::data [:map {:title "FileData"} [:pages [:vector ::sm/uuid]] [:pages-index diff --git a/common/src/app/common/types/grid.cljc b/common/src/app/common/types/grid.cljc index 29e90af4c7..72a7ceac61 100644 --- a/common/src/app/common/types/grid.cljc +++ b/common/src/app/common/types/grid.cljc @@ -13,12 +13,12 @@ ;; SCHEMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/def! ::grid-color +(sm/register! ::grid-color [:map {:title "PageGridColor"} [:color ::ctc/rgb-color] [:opacity ::sm/safe-number]]) -(sm/def! ::column-params +(sm/register! ::column-params [:map [:color ::grid-color] [:type {:optional true} [::sm/one-of #{:stretch :left :center :right}]] @@ -27,12 +27,12 @@ [:item-length {:optional true} [:maybe ::sm/safe-number]] [:gutter {:optional true} [:maybe ::sm/safe-number]]]) -(sm/def! ::square-params +(sm/register! ::square-params [:map [:size {:optional true} [:maybe ::sm/safe-number]] [:color ::grid-color]]) -(sm/def! ::grid +(sm/register! ::grid [:multi {:dispatch :type} [:column [:map @@ -52,7 +52,7 @@ [:display :boolean] [:params ::square-params]]]]) -(sm/def! ::saved-grids +(sm/register! ::saved-grids [:map {:title "PageGrid"} [:square {:optional true} ::square-params] [:row {:optional true} ::column-params] diff --git a/common/src/app/common/types/page.cljc b/common/src/app/common/types/page.cljc index 3e31540dbc..b8c9eb3de6 100644 --- a/common/src/app/common/types/page.cljc +++ b/common/src/app/common/types/page.cljc @@ -17,20 +17,20 @@ ;; SCHEMAS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/define! ::flow +(sm/register! ::flow [:map {:title "PageFlow"} [:id ::sm/uuid] [:name :string] [:starting-frame ::sm/uuid]]) -(sm/define! ::guide +(sm/register! ::guide [:map {:title "PageGuide"} [:id ::sm/uuid] [:axis [::sm/one-of #{:x :y}]] [:position ::sm/safe-number] [:frame-id {:optional true} [:maybe ::sm/uuid]]]) -(sm/define! ::page +(sm/register! ::page [:map {:title "FilePage"} [:id ::sm/uuid] [:name :string] diff --git a/common/src/app/common/types/shape.cljc b/common/src/app/common/types/shape.cljc index e22353e750..71a1964d39 100644 --- a/common/src/app/common/types/shape.cljc +++ b/common/src/app/common/types/shape.cljc @@ -85,10 +85,10 @@ :exclude :intersection}) -(sm/define! ::points +(sm/register! ::points [:vector {:gen/max 4 :gen/min 4} ::gpt/point]) -(sm/define! ::fill +(sm/register! ::fill [:map {:title "Fill"} [:fill-color {:optional true} ::ctc/rgb-color] [:fill-opacity {:optional true} ::sm/safe-number] @@ -97,7 +97,7 @@ [:fill-color-ref-id {:optional true} [:maybe ::sm/uuid]] [:fill-image {:optional true} ::ctc/image-color]]) -(sm/define! ::stroke +(sm/register! ::stroke [:map {:title "Stroke"} [:stroke-color {:optional true} :string] [:stroke-color-ref-file {:optional true} ::sm/uuid] @@ -115,7 +115,7 @@ [:stroke-color-gradient {:optional true} ::ctc/gradient] [:stroke-image {:optional true} ::ctc/image-color]]) -(sm/define! ::shape-base-attrs +(sm/register! ::shape-base-attrs [:map {:title "ShapeMinimalRecord"} [:id ::sm/uuid] [:name :string] @@ -127,14 +127,14 @@ [:parent-id ::sm/uuid] [:frame-id ::sm/uuid]]) -(sm/define! ::shape-geom-attrs +(sm/register! ::shape-geom-attrs [:map {:title "ShapeGeometryAttrs"} [:x ::sm/safe-number] [:y ::sm/safe-number] [:width ::sm/safe-number] [:height ::sm/safe-number]]) -(sm/define! ::shape-attrs +(sm/register! ::shape-attrs [:map {:title "ShapeAttrs"} [:name {:optional true} :string] [:component-id {:optional true} ::sm/uuid] @@ -190,12 +190,12 @@ [:plugin-data {:optional true} [:map-of {:gen/max 5} :keyword ::sm/plugin-data]]]) -(sm/define! ::group-attrs +(sm/register! ::group-attrs [:map {:title "GroupAttrs"} [:type [:= :group]] [:shapes [:vector {:gen/max 10 :gen/min 1} ::sm/uuid]]]) -(sm/define! ::frame-attrs +(sm/register! ::frame-attrs [:map {:title "FrameAttrs"} [:type [:= :frame]] [:shapes [:vector {:gen/max 10 :gen/min 1} ::sm/uuid]] @@ -203,7 +203,7 @@ [:show-content {:optional true} :boolean] [:hide-in-viewer {:optional true} :boolean]]) -(sm/define! ::bool-attrs +(sm/register! ::bool-attrs [:map {:title "BoolAttrs"} [:type [:= :bool]] [:shapes [:vector {:gen/max 10 :gen/min 1} ::sm/uuid]] @@ -223,19 +223,19 @@ [:maybe [:map-of {:gen/max 5} :keyword ::sm/safe-number]]]]]]]) -(sm/define! ::rect-attrs +(sm/register! ::rect-attrs [:map {:title "RectAttrs"} [:type [:= :rect]]]) -(sm/define! ::circle-attrs +(sm/register! ::circle-attrs [:map {:title "CircleAttrs"} [:type [:= :circle]]]) -(sm/define! ::svg-raw-attrs +(sm/register! ::svg-raw-attrs [:map {:title "SvgRawAttrs"} [:type [:= :svg-raw]]]) -(sm/define! ::image-attrs +(sm/register! ::image-attrs [:map {:title "ImageAttrs"} [:type [:= :image]] [:metadata @@ -245,17 +245,17 @@ [:mtype {:optional true} [:maybe :string]] [:id ::sm/uuid]]]]) -(sm/define! ::path-attrs +(sm/register! ::path-attrs [:map {:title "PathAttrs"} [:type [:= :path]] [:content ::ctsp/content]]) -(sm/define! ::text-attrs +(sm/register! ::text-attrs [:map {:title "TextAttrs"} [:type [:= :text]] [:content {:optional true} [:maybe ::ctsx/content]]]) -(sm/define! ::shape-map +(sm/register! ::shape-map [:multi {:dispatch :type :title "Shape"} [:group [:and {:title "GroupShape"} @@ -327,7 +327,7 @@ ::text-attrs ::ctsl/layout-child-attrs]]]) -(sm/define! ::shape +(sm/register! ::shape [:and {:title "Shape" :gen/gen (->> (sg/generator ::shape-base-attrs) diff --git a/common/src/app/common/types/shape/blur.cljc b/common/src/app/common/types/shape/blur.cljc index 2c4ce5ab4b..796c0d1707 100644 --- a/common/src/app/common/types/shape/blur.cljc +++ b/common/src/app/common/types/shape/blur.cljc @@ -26,7 +26,7 @@ ;; SCHEMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/def! ::blur +(sm/register! ::blur [:map {:title "Blur"} [:id ::sm/uuid] [:type [:= :layer-blur]] diff --git a/common/src/app/common/types/shape/export.cljc b/common/src/app/common/types/shape/export.cljc index ddbf4263be..91b5cca24b 100644 --- a/common/src/app/common/types/shape/export.cljc +++ b/common/src/app/common/types/shape/export.cljc @@ -10,7 +10,7 @@ (def export-types #{:png :jpeg :svg :pdf}) -(sm/def! ::export +(sm/register! ::export [:map {:title "ShapeExport"} [:type :keyword] [:scale ::sm/safe-number] diff --git a/common/src/app/common/types/shape/interactions.cljc b/common/src/app/common/types/shape/interactions.cljc index 05724ebe88..647e6cf268 100644 --- a/common/src/app/common/types/shape/interactions.cljc +++ b/common/src/app/common/types/shape/interactions.cljc @@ -71,7 +71,7 @@ (def animation-types #{:dissolve :slide :push}) -(sm/define! ::animation +(sm/register! ::animation [:multi {:dispatch :animation-type :title "Animation"} [:dissolve [:map {:title "AnimationDisolve"} @@ -96,7 +96,7 @@ (def check-animation! (sm/check-fn ::animation)) -(sm/define! ::interaction +(sm/register! ::interaction [:multi {:dispatch :action-type} [:navigate [:map diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index d30598974f..16e207d0b8 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -87,7 +87,7 @@ :layout-item-absolute :layout-item-z-index]) -(sm/def! ::layout-attrs +(sm/register! ::layout-attrs [:map {:title "LayoutAttrs"} [:layout {:optional true} [::sm/one-of layout-types]] [:layout-flex-dir {:optional true} [::sm/one-of flex-direction-types]] @@ -130,7 +130,7 @@ (def grid-cell-justify-self-types #{:auto :start :center :end :stretch}) -(sm/def! ::grid-cell +(sm/register! ::grid-cell [:map {:title "GridCell"} [:id ::sm/uuid] [:area-name {:optional true} :string] @@ -144,7 +144,7 @@ [:shapes [:vector {:gen/max 1} ::sm/uuid]]]) -(sm/def! ::grid-track +(sm/register! ::grid-track [:map {:title "GridTrack"} [:type [::sm/one-of grid-track-types]] [:value {:optional true} [:maybe ::sm/safe-number]]]) @@ -166,7 +166,7 @@ (def item-align-self-types #{:start :end :center :stretch}) -(sm/def! ::layout-child-attrs +(sm/register! ::layout-child-attrs [:map {:title "LayoutChildAttrs"} [:layout-item-margin-type {:optional true} [::sm/one-of item-margin-types]] [:layout-item-margin {:optional true} @@ -192,7 +192,7 @@ (def valid-layouts #{:flex :grid}) -(sm/def! ::layout +(sm/register! ::layout [::sm/one-of valid-layouts]) (defn flex-layout? diff --git a/common/src/app/common/types/shape/path.cljc b/common/src/app/common/types/shape/path.cljc index d633bb85c6..f6002a2935 100644 --- a/common/src/app/common/types/shape/path.cljc +++ b/common/src/app/common/types/shape/path.cljc @@ -12,7 +12,7 @@ ;; SCHEMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/define! ::segment +(sm/register! ::segment [:multi {:title "PathSegment" :dispatch :command} [:line-to [:map @@ -43,5 +43,5 @@ [:c2x ::sm/safe-number] [:c2y ::sm/safe-number]]]]]]) -(sm/define! ::content +(sm/register! ::content [:vector ::segment]) diff --git a/common/src/app/common/types/shape/shadow.cljc b/common/src/app/common/types/shape/shadow.cljc index cc2fd81c3c..62bdc2691a 100644 --- a/common/src/app/common/types/shape/shadow.cljc +++ b/common/src/app/common/types/shape/shadow.cljc @@ -11,7 +11,7 @@ (def styles #{:drop-shadow :inner-shadow}) -(sm/def! ::shadow +(sm/register! ::shadow [:map {:title "Shadow"} [:id [:maybe ::sm/uuid]] [:style [::sm/one-of styles]] diff --git a/common/src/app/common/types/shape/text.cljc b/common/src/app/common/types/shape/text.cljc index dff8759561..99d3a55b51 100644 --- a/common/src/app/common/types/shape/text.cljc +++ b/common/src/app/common/types/shape/text.cljc @@ -16,7 +16,7 @@ (def node-types #{"root" "paragraph-set" "paragraph"}) -(sm/def! ::content +(sm/register! ::content [:map [:type [:= "root"]] [:key {:optional true} :string] @@ -64,7 +64,7 @@ -(sm/def! ::position-data +(sm/register! ::position-data [:vector {:min 1 :gen/max 2} [:map [:x ::sm/safe-number] diff --git a/common/src/app/common/types/typography.cljc b/common/src/app/common/types/typography.cljc index 2e5a08b93a..ba9eb12906 100644 --- a/common/src/app/common/types/typography.cljc +++ b/common/src/app/common/types/typography.cljc @@ -15,7 +15,7 @@ ;; SCHEMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/def! ::typography +(sm/register! ::typography [:map {:title "Typography"} [:id ::sm/uuid] [:name :string] From 40f947fc9f5abc3986fd020f813d8a558d0a2b02 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 13:14:36 +0200 Subject: [PATCH 02/21] :bug: Fix issue with schema uri decoder --- common/src/app/common/schema.cljc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index 621bd8ec52..322a3dd5fc 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -844,7 +844,11 @@ :gen/gen (sg/uri) ::oapi/type "string" ::oapi/format "uri" - ::oapi/decode (comp u/uri str/trim)}}) + ::oapi/decode + (fn [val] + (if (u/uri? val) + val + (-> val str/trim u/uri)))}}) (register! ::text {:type :string From a0339132dd2cd4f90bd73970cb5c5773a6e5fd68 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 13:42:09 +0200 Subject: [PATCH 03/21] :paperclip: Update cljfmt config --- .cljfmt.edn | 1 + 1 file changed, 1 insertion(+) diff --git a/.cljfmt.edn b/.cljfmt.edn index 38cfeb89b6..02c567b2e3 100644 --- a/.cljfmt.edn +++ b/.cljfmt.edn @@ -4,6 +4,7 @@ :remove-consecutive-blank-lines? false :extra-indents {rumext.v2/fnc [[:inner 0]] cljs.test/async [[:inner 0]] + app.common.schema/register! [[:inner 0] [:inner 1]] promesa.exec/thread [[:inner 0]] specify! [[:inner 0] [:inner 1]]} } From f973faa409b326ad1ff817ecef0a4d4145d8ce59 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 07:56:29 +0200 Subject: [PATCH 04/21] :paperclip: Add missing SPEC tag on doc entry template --- backend/resources/app/templates/api-doc-entry.tmpl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/resources/app/templates/api-doc-entry.tmpl b/backend/resources/app/templates/api-doc-entry.tmpl index 31c48deebf..9123233a83 100644 --- a/backend/resources/app/templates/api-doc-entry.tmpl +++ b/backend/resources/app/templates/api-doc-entry.tmpl @@ -20,12 +20,19 @@ WEBHOOK {% endif %} + {% if item.params-schema-js %} SCHEMA {% endif %} + {% if item.spec %} + + SPEC + + {% endif %} + {% if item.sse %} SSE From 368917f7f5e13f2bd180bf1c839d5b84687ce675 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 13:41:31 +0200 Subject: [PATCH 05/21] :fire: Replace spec with schema on webhooks rpc methods --- backend/src/app/rpc/commands/webhooks.clj | 60 ++++++++++--------- .../test/backend_tests/rpc_webhooks_test.clj | 2 + 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/backend/src/app/rpc/commands/webhooks.clj b/backend/src/app/rpc/commands/webhooks.clj index 13a5d02101..2649a73a4b 100644 --- a/backend/src/app/rpc/commands/webhooks.clj +++ b/backend/src/app/rpc/commands/webhooks.clj @@ -8,7 +8,7 @@ (:require [app.common.data.macros :as dm] [app.common.exceptions :as ex] - [app.common.spec :as us] + [app.common.schema :as sm] [app.common.uri :as u] [app.common.uuid :as uuid] [app.db :as db] @@ -19,7 +19,6 @@ [app.rpc.doc :as-alias doc] [app.util.services :as sv] [app.util.time :as dt] - [clojure.spec.alpha :as s] [cuerdas.core :as str])) (defn decode-row @@ -29,18 +28,6 @@ ;; --- Mutation: Create Webhook -(s/def ::team-id ::us/uuid) -(s/def ::uri ::us/uri) -(s/def ::is-active ::us/boolean) -(s/def ::mtype - #{"application/json" - "application/transit+json"}) - -(s/def ::create-webhook - (s/keys :req [::rpc/profile-id] - :req-un [::team-id ::uri ::mtype] - :opt-un [::is-active])) - ;; NOTE: for now the quote is hardcoded but this need to be solved in ;; a more universal way for handling properly object quotes (def max-hooks-for-team 8) @@ -99,31 +86,49 @@ {::db/return-keys true}) (decode-row))) + +(def valid-mtypes + #{"application/json" + "application/transit+json"}) + +(def ^:private schema:create-webhook + [:map {:title "create-webhook"} + [:team-id ::sm/uuid] + [:uri ::sm/uri] + [:mtype [::sm/one-of {:format "string"} valid-mtypes]]]) + (sv/defmethod ::create-webhook - {::doc/added "1.17"} + {::doc/added "1.17" + ::sm/params schema:create-webhook} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id] :as params}] (check-edition-permissions! pool profile-id team-id) (validate-quotes! cfg params) (validate-webhook! cfg nil params) (insert-webhook! cfg params)) -(s/def ::update-webhook - (s/keys :req-un [::id ::uri ::mtype ::is-active])) +(def ^:private schema:update-webhook + [:map {:title "update-webhook"} + [:id ::sm/uuid] + [:uri ::sm/uri] + [:mtype [::sm/one-of {:format "string"} valid-mtypes]] + [:is-active :boolean]]) (sv/defmethod ::update-webhook - {::doc/added "1.17"} + {::doc/added "1.17" + ::sm/params schema:update-webhook} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}] (let [whook (-> (db/get pool :webhook {:id id}) (decode-row))] (check-edition-permissions! pool profile-id (:team-id whook)) (validate-webhook! cfg whook params) (update-webhook! cfg whook params))) -(s/def ::delete-webhook - (s/keys :req [::rpc/profile-id] - :req-un [::id])) +(def ^:private schema:delete-webhook + [:map {:title "delete-webhook"} + [:id ::sm/uuid]]) (sv/defmethod ::delete-webhook - {::doc/added "1.17"} + {::doc/added "1.17" + ::sm/params schema:delete-webhook} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id]}] (db/with-atomic [conn pool] (let [whook (-> (db/get conn :webhook {:id id}) decode-row)] @@ -133,16 +138,17 @@ ;; --- Query: Webhooks -(s/def ::team-id ::us/uuid) -(s/def ::get-webhooks - (s/keys :req [::rpc/profile-id] - :req-un [::team-id])) - (def sql:get-webhooks "select id, uri, mtype, is_active, error_code, error_count from webhook where team_id = ? order by uri") +(def ^:private schema:get-webhooks + [:map {:title "get-webhooks"} + [:team-id ::sm/uuid]]) + (sv/defmethod ::get-webhooks + {::doc/added "1.17" + ::sm/params schema:get-webhooks} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id]}] (dm/with-open [conn (db/open pool)] (check-read-permissions! conn profile-id team-id) diff --git a/backend/test/backend_tests/rpc_webhooks_test.clj b/backend/test/backend_tests/rpc_webhooks_test.clj index 76c3de763c..f47472a73f 100644 --- a/backend/test/backend_tests/rpc_webhooks_test.clj +++ b/backend/test/backend_tests/rpc_webhooks_test.clj @@ -39,6 +39,8 @@ (t/is (nil? (:error out))) (t/is (= 1 (:call-count @http-mock))) + ;; (th/print-result! out) + (let [result (:result out)] (t/is (contains? result :id)) (t/is (contains? result :team-id)) From 279c6337e44eae632093008d15eab1867c161086 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 14:03:24 +0200 Subject: [PATCH 06/21] :fire: Replace spec with schema on access-token rpc methods --- backend/src/app/rpc/commands/access_token.clj | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/backend/src/app/rpc/commands/access_token.clj b/backend/src/app/rpc/commands/access_token.clj index 06a6e516ce..e8d9675f99 100644 --- a/backend/src/app/rpc/commands/access_token.clj +++ b/backend/src/app/rpc/commands/access_token.clj @@ -6,7 +6,7 @@ (ns app.rpc.commands.access-token (:require - [app.common.spec :as us] + [app.common.schema :as sm] [app.common.uuid :as uuid] [app.db :as db] [app.main :as-alias main] @@ -16,8 +16,7 @@ [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] - [app.util.time :as dt] - [clojure.spec.alpha :as s])) + [app.util.time :as dt])) (defn- decode-row [row] @@ -44,7 +43,7 @@ :perms (db/create-array conn "text" [])}))) -(defn repl-create-access-token +(defn repl:create-access-token [{:keys [::db/pool] :as system} profile-id name expiration] (db/with-atomic [conn pool] (let [props (:app.setup/props system)] @@ -53,16 +52,14 @@ name expiration)))) -(s/def ::name ::us/not-empty-string) -(s/def ::expiration ::dt/duration) - -(s/def ::create-access-token - (s/keys :req [::rpc/profile-id] - :req-un [::name] - :opt-un [::expiration])) +(def ^:private schema:create-access-token + [:map {:title "create-access-token"} + [:name [:string {:max 250 :min 1}]] + [:expiration {:optional true} ::dt/duration]]) (sv/defmethod ::create-access-token - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:create-access-token} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id name expiration]}] (db/with-atomic [conn pool] (let [cfg (assoc cfg ::db/conn conn)] @@ -72,21 +69,23 @@ (-> (create-access-token cfg profile-id name expiration) (decode-row))))) -(s/def ::delete-access-token - (s/keys :req [::rpc/profile-id] - :req-un [::us/id])) +(def ^:private schema:delete-access-token + [:map {:title "delete-access-token"} + [:id ::sm/uuid]]) (sv/defmethod ::delete-access-token - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:delete-access-token} [{:keys [::db/pool]} {:keys [::rpc/profile-id id]}] (db/delete! pool :access-token {:id id :profile-id profile-id}) nil) -(s/def ::get-access-tokens - (s/keys :req [::rpc/profile-id])) +(def ^:private schema:get-access-tokens + [:map {:title "get-access-tokens"}]) (sv/defmethod ::get-access-tokens - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:get-access-tokens} [{:keys [::db/pool]} {:keys [::rpc/profile-id]}] (->> (db/query pool :access-token {:profile-id profile-id} From bfca3246233ffcbe36c145499f48ce60d2c2fab9 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 14:37:36 +0200 Subject: [PATCH 07/21] :fire: Replace spec with schema on project rpc methods --- backend/src/app/rpc/commands/projects.clj | 73 ++++++++++++----------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/backend/src/app/rpc/commands/projects.clj b/backend/src/app/rpc/commands/projects.clj index 16e892b17a..4901a6efde 100644 --- a/backend/src/app/rpc/commands/projects.clj +++ b/backend/src/app/rpc/commands/projects.clj @@ -8,7 +8,7 @@ (:require [app.common.data.macros :as dm] [app.common.exceptions :as ex] - [app.common.spec :as us] + [app.common.schema :as sm] [app.db :as db] [app.db.sql :as-alias sql] [app.loggers.audit :as-alias audit] @@ -21,11 +21,7 @@ [app.rpc.quotes :as quotes] [app.util.services :as sv] [app.util.time :as dt] - [app.worker :as wrk] - [clojure.spec.alpha :as s])) - -(s/def ::id ::us/uuid) -(s/def ::name ::us/string) + [app.worker :as wrk])) ;; --- Check Project Permissions @@ -75,13 +71,13 @@ (declare get-projects) -(s/def ::team-id ::us/uuid) -(s/def ::get-projects - (s/keys :req [::rpc/profile-id] - :req-un [::team-id])) +(def ^:private schema:get-projects + [:map {:title "get-projects"} + [:team-id ::sm/uuid]]) (sv/defmethod ::get-projects - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:get-projects} [{:keys [::db/pool]} {:keys [::rpc/profile-id team-id]}] (dm/with-open [conn (db/open pool)] (teams/check-read-permissions! conn profile-id team-id) @@ -112,11 +108,12 @@ (declare get-all-projects) -(s/def ::get-all-projects - (s/keys :req [::rpc/profile-id])) +(def ^:private schema:get-all-projects + [:map {:title "get-all-projects"}]) (sv/defmethod ::get-all-projects - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:get-all-projects} [{:keys [::db/pool]} {:keys [::rpc/profile-id]}] (dm/with-open [conn (db/open pool)] (get-all-projects conn profile-id))) @@ -154,12 +151,13 @@ ;; --- QUERY: Get project -(s/def ::get-project - (s/keys :req [::rpc/profile-id] - :req-un [::id])) +(def ^:private schema:get-project + [:map {:title "get-project"} + [:id ::sm/uuid]]) (sv/defmethod ::get-project - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:get-project} [{:keys [::db/pool]} {:keys [::rpc/profile-id id]}] (dm/with-open [conn (db/open pool)] (let [project (db/get-by-id conn :project id)] @@ -170,14 +168,16 @@ ;; --- MUTATION: Create Project -(s/def ::create-project - (s/keys :req [::rpc/profile-id] - :req-un [::team-id ::name] - :opt-un [::id])) +(def ^:private schema:create-project + [:map {:title "create-project"} + [:team-id ::sm/uuid] + [:name [:string {:max 250 :min 1}]] + [:id {:optional true} ::sm/uuid]]) (sv/defmethod ::create-project {::doc/added "1.18" - ::webhooks/event? true} + ::webhooks/event? true + ::sm/params schema:create-project} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id] :as params}] (db/with-atomic [conn pool] (teams/check-edition-permissions! conn profile-id team-id) @@ -205,14 +205,15 @@ on conflict (team_id, project_id, profile_id) do update set is_pinned=?") -(s/def ::is-pinned ::us/boolean) -(s/def ::project-id ::us/uuid) -(s/def ::update-project-pin - (s/keys :req [::rpc/profile-id] - :req-un [::id ::team-id ::is-pinned])) +(def ^:private schema:update-project-pin + [:map {:title "update-project-pin"} + [:team-id ::sm/uuid] + [:is-pinned :boolean] + [:id ::sm/uuid]]) (sv/defmethod ::update-project-pin {::doc/added "1.18" + ::sm/params schema:update-project-pin ::webhooks/batch-timeout (dt/duration "5s") ::webhooks/batch-key (webhooks/key-fn ::rpc/profile-id :id) ::webhooks/event? true} @@ -226,12 +227,14 @@ (declare rename-project) -(s/def ::rename-project - (s/keys :req [::rpc/profile-id] - :req-un [::name ::id])) +(def ^:private schema:rename-project + [:map {:title "rename-project"} + [:name [:string {:max 250 :min 1}]] + [:id ::sm/uuid]]) (sv/defmethod ::rename-project {::doc/added "1.18" + ::sm/params schema:rename-project ::webhooks/event? true} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id name] :as params}] (db/with-atomic [conn pool] @@ -266,12 +269,14 @@ project)) -(s/def ::delete-project - (s/keys :req [::rpc/profile-id] - :req-un [::id])) + +(def ^:private schema:delete-project + [:map {:title "delete-project"} + [:id ::sm/uuid]]) (sv/defmethod ::delete-project {::doc/added "1.18" + ::sm/params schema:delete-project ::webhooks/event? true} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}] (db/with-atomic [conn pool] From e9a28b034f6702810faa11406ffd5f6cfcffef46 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 5 Jun 2024 14:51:29 +0200 Subject: [PATCH 08/21] :fire: Replace spec with schema on file RPC methods --- backend/src/app/rpc/commands/files.clj | 24 +++++-------------- .../app/main/data/workspace/libraries.cljs | 3 +++ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index b0c74feb12..b4d0e8b32e 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -15,7 +15,6 @@ [app.common.logging :as l] [app.common.schema :as sm] [app.common.schema.desc-js-like :as-alias smdj] - [app.common.spec :as us] [app.common.types.components-list :as ctkl] [app.common.types.file :as ctf] [app.config :as cf] @@ -36,7 +35,6 @@ [app.util.services :as sv] [app.util.time :as dt] [app.worker :as wrk] - [clojure.spec.alpha :as s] [cuerdas.core :as str])) ;; --- FEATURES @@ -46,18 +44,6 @@ (when media-id (str (cf/get :public-uri) "/assets/by-id/" media-id))) -;; --- SPECS - -(s/def ::features ::us/set-of-strings) -(s/def ::file-id ::us/uuid) -(s/def ::frame-id ::us/uuid) -(s/def ::id ::us/uuid) -(s/def ::is-shared ::us/boolean) -(s/def ::name ::us/string) -(s/def ::project-id ::us/uuid) -(s/def ::search-term ::us/string) -(s/def ::team-id ::us/uuid) - ;; --- HELPERS (def long-cache-duration @@ -1047,14 +1033,16 @@ {:id file-id} {::db/return-keys true})) -(s/def ::ignore-file-library-sync-status - (s/keys :req [::rpc/profile-id] - :req-un [::file-id ::date])) +(def ^:private schema:ignore-file-library-sync-status + [:map {:title "ignore-file-library-sync-status"} + [:file-id ::sm/uuid] + [:date ::dt/duration]]) ;; TODO: improve naming (sv/defmethod ::ignore-file-library-sync-status "Ignore updates in linked files" - {::doc/added "1.17"} + {::doc/added "1.17" + ::sm/params schema:ignore-file-library-sync-status} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}] (db/with-atomic [conn pool] (check-edition-permissions! conn profile-id file-id) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 5f0498e943..6d7aafc569 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -1042,6 +1042,9 @@ {:file-id file-id :library-id library-id})))))))))) + +;; FIXME: the data should be set on the backend for clock consistency + (def ignore-sync "Mark the file as ignore syncs. All library changes before this moment will not ber notified to sync." From 268f1d40aae453dcb27f9ec04e80d348df09b189 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 6 Jun 2024 10:40:55 +0200 Subject: [PATCH 09/21] :fire: Replace spec with schema on file-share RPC methods --- backend/src/app/rpc/commands/files_share.clj | 33 +++++++++----------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/backend/src/app/rpc/commands/files_share.clj b/backend/src/app/rpc/commands/files_share.clj index bf761b5bf9..752fc0e547 100644 --- a/backend/src/app/rpc/commands/files_share.clj +++ b/backend/src/app/rpc/commands/files_share.clj @@ -7,29 +7,24 @@ (ns app.rpc.commands.files-share "Share link related rpc mutation methods." (:require - [app.common.spec :as us] + [app.common.schema :as sm] [app.common.uuid :as uuid] [app.db :as db] [app.rpc :as-alias rpc] [app.rpc.commands.files :as files] [app.rpc.doc :as-alias doc] - [app.util.services :as sv] - [clojure.spec.alpha :as s])) - -;; --- Helpers & Specs - -(s/def ::file-id ::us/uuid) -(s/def ::who-comment ::us/string) -(s/def ::who-inspect ::us/string) -(s/def ::pages (s/every ::us/uuid :kind set?)) + [app.util.services :as sv])) ;; --- MUTATION: Create Share Link (declare create-share-link) -(s/def ::create-share-link - (s/keys :req [::rpc/profile-id] - :req-un [::file-id ::who-comment ::who-inspect ::pages])) +(def ^:private schema:create-share-link + [:map {:title "create-share-link"} + [:file-id ::sm/uuid] + [:who-comment :string] + [:who-inspect :string] + [:pages [:set ::sm/uuid]]]) (sv/defmethod ::create-share-link "Creates a share-link object. @@ -37,7 +32,8 @@ Share links are resources that allows external users access to specific pages of a file with specific permissions (who-comment and who-inspect)." {::doc/added "1.18" - ::doc/module :files} + ::doc/module :files + ::sm/params schema:create-share-link} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}] (db/with-atomic [conn pool] (files/check-edition-permissions! conn profile-id file-id) @@ -58,13 +54,14 @@ ;; --- MUTATION: Delete Share Link -(s/def ::delete-share-link - (s/keys :req [::rpc/profile-id] - :req-un [::us/id])) +(def ^:private schema:delete-share-link + [:map {:title "delete-share-link"} + [:id ::sm/uuid]]) (sv/defmethod ::delete-share-link {::doc/added "1.18" - ::doc/module ::files} + ::doc/module ::files + ::sm/params schema:delete-share-link} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}] (db/with-atomic [conn pool] (let [slink (db/get-by-id conn :share-link id)] From bbc00891669d5258838828307572a611422fe7d7 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 6 Jun 2024 10:59:36 +0200 Subject: [PATCH 10/21] :fire: Replace spec with schema on verify-token RPC methods --- backend/src/app/rpc/commands/verify_token.clj | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index 1fc83bc85e..de39fed798 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -7,7 +7,7 @@ (ns app.rpc.commands.verify-token (:require [app.common.exceptions :as ex] - [app.common.spec :as us] + [app.common.schema :as sm] [app.db :as db] [app.db.sql :as-alias sql] [app.http.session :as session] @@ -23,21 +23,19 @@ [app.tokens :as tokens] [app.tokens.spec.team-invitation :as-alias spec.team-invitation] [app.util.services :as sv] - [clojure.spec.alpha :as s])) - -(s/def ::iss keyword?) -(s/def ::exp ::us/inst) + [app.util.time :as dt])) (defmulti process-token (fn [_ _ claims] (:iss claims))) -(s/def ::verify-token - (s/keys :req-un [::token] - :opt [::rpc/profile-id])) +(def ^:private schema:verify-token + [:map {:title "verify-token"} + [:token :string]]) (sv/defmethod ::verify-token {::rpc/auth false ::doc/added "1.15" - ::doc/module :auth} + ::doc/module :auth + ::sm/params schema:verify-token} [{:keys [::db/pool] :as cfg} {:keys [token] :as params}] (db/with-atomic [conn pool] (let [claims (tokens/verify (::setup/props cfg) {:token token}) @@ -131,26 +129,28 @@ (assoc member :is-active true))) -(s/def ::spec.team-invitation/profile-id ::us/uuid) -(s/def ::spec.team-invitation/role ::us/keyword) -(s/def ::spec.team-invitation/team-id ::us/uuid) -(s/def ::spec.team-invitation/member-email ::us/email) -(s/def ::spec.team-invitation/member-id (s/nilable ::us/uuid)) +(def schema:team-invitation-claims + [:map {:title "TeamInvitationClaims"} + [:iss :keyword] + [:exp ::dt/instant] + [:profile-id ::sm/uuid] + [:role teams/schema:role] + [:team-id ::sm/uuid] + [:member-email ::sm/email] + [:member-id {:optional true} ::sm/uuid]]) -(s/def ::team-invitation-claims - (s/keys :req-un [::iss ::exp - ::spec.team-invitation/profile-id - ::spec.team-invitation/role - ::spec.team-invitation/team-id - ::spec.team-invitation/member-email] - :opt-un [::spec.team-invitation/member-id])) +(def valid-team-invitation-claims? + (sm/lazy-validator schema:team-invitation-claims)) (defmethod process-token :team-invitation [{:keys [conn] :as cfg} {:keys [::rpc/profile-id token] :as params} {:keys [member-id team-id member-email] :as claims}] - (us/verify! ::team-invitation-claims claims) + (when-not (valid-team-invitation-claims? claims) + (ex/raise :type :validation + :code :invalid-invitation-token + :hint "invitation token contains unexpected data")) (let [invitation (db/get* conn :team-invitation {:team-id team-id :email-to member-email}) From 073621f29ac0c18c2bf77346da95d40bf4573da6 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 08:21:27 +0200 Subject: [PATCH 11/21] :fire: Replace spec with schema on demo RPC methods --- backend/src/app/rpc/commands/demo.clj | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/src/app/rpc/commands/demo.clj b/backend/src/app/rpc/commands/demo.clj index 3dabb96fba..213f6abeca 100644 --- a/backend/src/app/rpc/commands/demo.clj +++ b/backend/src/app/rpc/commands/demo.clj @@ -18,10 +18,7 @@ [app.util.services :as sv] [app.util.time :as dt] [buddy.core.codecs :as bc] - [buddy.core.nonce :as bn] - [clojure.spec.alpha :as s])) - -(s/def ::create-demo-profile any?) + [buddy.core.nonce :as bn])) (sv/defmethod ::create-demo-profile "A command that is responsible of creating a demo purpose From 969c9105fdf10d760fd515ef7fde781a7a2c1a29 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 08:21:40 +0200 Subject: [PATCH 12/21] :fire: Replace spec with schema on feedback RPC methods --- backend/src/app/rpc/commands/feedback.clj | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/backend/src/app/rpc/commands/feedback.clj b/backend/src/app/rpc/commands/feedback.clj index 7d2ab1c883..9bec88dde2 100644 --- a/backend/src/app/rpc/commands/feedback.clj +++ b/backend/src/app/rpc/commands/feedback.clj @@ -8,29 +8,25 @@ "A general purpose feedback module." (:require [app.common.exceptions :as ex] - [app.common.spec :as us] + [app.common.schema :as sm] [app.config :as cf] [app.db :as db] [app.email :as eml] [app.rpc :as-alias rpc] [app.rpc.commands.profile :as profile] [app.rpc.doc :as-alias doc] - [app.util.services :as sv] - [clojure.spec.alpha :as s])) + [app.util.services :as sv])) (declare ^:private send-feedback!) -(s/def ::content ::us/string) -(s/def ::from ::us/email) -(s/def ::subject ::us/string) - -(s/def ::send-user-feedback - (s/keys :req [::rpc/profile-id] - :req-un [::subject - ::content])) +(def ^:private schema:send-user-feedback + [:map {:title "send-user-feedback"} + [:subject :string] + [:content :string]]) (sv/defmethod ::send-user-feedback - {::doc/added "1.18"} + {::doc/added "1.18" + ::sm/params schema:send-user-feedback} [{:keys [::db/pool]} {:keys [::rpc/profile-id] :as params}] (when-not (contains? cf/flags :user-feedback) (ex/raise :type :restriction From 85108672bf96341c61aa775b7bb49789b36a117d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 08:21:56 +0200 Subject: [PATCH 13/21] :fire: Replace spec with schema on file-thumbnails RPC methods --- backend/src/app/rpc/commands/files_thumbnails.clj | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index 760e3bcd3a..87b9736436 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -33,7 +33,6 @@ [app.util.pointer-map :as pmap] [app.util.services :as sv] [app.util.time :as dt] - [clojure.spec.alpha :as s] [cuerdas.core :as str])) ;; --- FEATURES @@ -314,13 +313,15 @@ :object-id object-id :tag tag}))) -(s/def ::delete-file-object-thumbnail - (s/keys :req [::rpc/profile-id] - :req-un [::file-id ::object-id])) +(def ^:private schema:delete-file-object-thumbnail + [:map {:title "delete-file-object-thumbnail"} + [:file-id ::sm/uuid] + [:object-id :string]]) (sv/defmethod ::delete-file-object-thumbnail {::doc/added "1.19" ::doc/module :files + ::sm/params schema:delete-file-object-thumbnail ::audit/skip true} [cfg {:keys [::rpc/profile-id file-id object-id]}] (files/check-edition-permissions! cfg profile-id file-id) From c4cf745d7728a0a15a374e043fb3fc3461c881cd Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 08:22:14 +0200 Subject: [PATCH 14/21] :fire: Replace spec with schema on ldap RPC methods --- backend/src/app/rpc/commands/ldap.clj | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/backend/src/app/rpc/commands/ldap.clj b/backend/src/app/rpc/commands/ldap.clj index dff521500a..0829987d4d 100644 --- a/backend/src/app/rpc/commands/ldap.clj +++ b/backend/src/app/rpc/commands/ldap.clj @@ -8,7 +8,7 @@ (:require [app.auth.ldap :as ldap] [app.common.exceptions :as ex] - [app.common.spec :as us] + [app.common.schema :as sm] [app.db :as db] [app.http.session :as session] [app.loggers.audit :as-alias audit] @@ -19,27 +19,25 @@ [app.rpc.helpers :as rph] [app.setup :as-alias setup] [app.tokens :as tokens] - [app.util.services :as sv] - [clojure.spec.alpha :as s])) + [app.util.services :as sv])) ;; --- COMMAND: login-with-ldap (declare login-or-register) -(s/def ::email ::us/email) -(s/def ::password ::us/string) -(s/def ::invitation-token ::us/string) - -(s/def ::login-with-ldap - (s/keys :req-un [::email ::password] - :opt-un [::invitation-token])) +(def schema:login-with-ldap + [:map {:title "login-with-ldap"} + [:email ::sm/email] + [:password auth/schema:password] + [:invitation-token {:optional true} auth/schema:token]]) (sv/defmethod ::login-with-ldap "Performs the authentication using LDAP backend. Only works if LDAP is properly configured and enabled with `login-with-ldap` flag." {::rpc/auth false ::doc/added "1.15" - ::doc/module :auth} + ::doc/module :auth + ::sm/params schema:login-with-ldap} [{:keys [::setup/props ::ldap/provider] :as cfg} params] (when-not provider (ex/raise :type :restriction From 37fcc74ef80143ffba4a7cdf3c5de919f32d65c3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 08:22:25 +0200 Subject: [PATCH 15/21] :fire: Replace spec with schema on media RPC methods --- backend/src/app/rpc/commands/media.clj | 47 +++++++++++++------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/backend/src/app/rpc/commands/media.clj b/backend/src/app/rpc/commands/media.clj index 08232e8990..28f96ac179 100644 --- a/backend/src/app/rpc/commands/media.clj +++ b/backend/src/app/rpc/commands/media.clj @@ -9,7 +9,7 @@ [app.common.data :as d] [app.common.exceptions :as ex] [app.common.media :as cm] - [app.common.spec :as us] + [app.common.schema :as sm] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] @@ -25,7 +25,6 @@ [app.util.services :as sv] [app.util.time :as dt] [app.worker :as-alias wrk] - [clojure.spec.alpha :as s] [cuerdas.core :as str] [datoteka.io :as io] [promesa.exec :as px])) @@ -39,25 +38,21 @@ :quality 85 :format :jpeg}) -(s/def ::id ::us/uuid) -(s/def ::name ::us/string) -(s/def ::file-id ::us/uuid) -(s/def ::team-id ::us/uuid) - ;; --- Create File Media object (upload) (declare create-file-media-object) -(s/def ::content ::media/upload) -(s/def ::is-local ::us/boolean) - -(s/def ::upload-file-media-object - (s/keys :req [::rpc/profile-id] - :req-un [::file-id ::is-local ::name ::content] - :opt-un [::id])) +(def ^:private schema:upload-file-media-object + [:map {:title "upload-file-media-object"} + [:id {:optional true} ::sm/uuid] + [:file-id ::sm/uuid] + [:is-local :boolean] + [:name :string] + [:content ::media/upload]]) (sv/defmethod ::upload-file-media-object {::doc/added "1.17" + ::sm/params schema:upload-file-media-object ::climit/id [[:process-image/by-profile ::rpc/profile-id] [:process-image/global]]} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id content] :as params}] @@ -176,14 +171,17 @@ (declare ^:private create-file-media-object-from-url) -(s/def ::create-file-media-object-from-url - (s/keys :req [::rpc/profile-id] - :req-un [::file-id ::is-local ::url] - :opt-un [::id ::name])) +(def ^:private schema:create-file-media-object-from-url + [:map {:title "create-file-media-object-from-url"} + [:file-id ::sm/uuid] + [:is-local :boolean] + [:url ::sm/uri] + [:id {:optional true} ::sm/uuid] + [:name {:optional true} :string]]) (sv/defmethod ::create-file-media-object-from-url {::doc/added "1.17" - ::doc/deprecated "1.19"} + ::sm/params schema:create-file-media-object-from-url} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}] (let [cfg (update cfg ::sto/storage media/configure-assets-storage)] (files/check-edition-permissions! pool profile-id file-id) @@ -255,12 +253,15 @@ (declare clone-file-media-object) -(s/def ::clone-file-media-object - (s/keys :req [::rpc/profile-id] - :req-un [::file-id ::is-local ::id])) +(def ^:private schema:clone-file-media-object + [:map {:title "clone-file-media-object"} + [:file-id ::sm/uuid] + [:is-local :boolean] + [:id ::sm/uuid]]) (sv/defmethod ::clone-file-media-object - {::doc/added "1.17"} + {::doc/added "1.17" + ::sm/params schema:clone-file-media-object} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}] (db/with-atomic [conn pool] (files/check-edition-permissions! conn profile-id file-id) From ad6a8644789d7356040e2283339ac911ff83e132 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 14 Jun 2024 08:22:36 +0200 Subject: [PATCH 16/21] :fire: Replace spec with schema on search RPC methods --- backend/src/app/rpc/commands/search.clj | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/backend/src/app/rpc/commands/search.clj b/backend/src/app/rpc/commands/search.clj index 5710156458..1a25a6dcfd 100644 --- a/backend/src/app/rpc/commands/search.clj +++ b/backend/src/app/rpc/commands/search.clj @@ -6,13 +6,12 @@ (ns app.rpc.commands.search (:require - [app.common.spec :as us] + [app.common.schema :as sm] [app.db :as db] [app.rpc :as-alias rpc] [app.rpc.commands.files :refer [resolve-public-uri]] [app.rpc.doc :as-alias doc] - [app.util.services :as sv] - [clojure.spec.alpha :as s])) + [app.util.services :as sv])) (def ^:private sql:search-files "with projects as ( @@ -65,16 +64,14 @@ (assoc :thumbnail-uri (resolve-public-uri media-id))) (dissoc row :media-id)))))) -(s/def ::team-id ::us/uuid) -(s/def ::search-files ::us/string) - -(s/def ::search-files - (s/keys :req [::rpc/profile-id] - :req-un [::team-id] - :opt-un [::search-term])) +(def ^:private schema:search-files + [:map {:title "search-files"} + [:team-id ::sm/uuid] + [:search-term {:optional true} :string]]) (sv/defmethod ::search-files {::doc/added "1.17" - ::doc/module :files} + ::doc/module :files + ::sm/params schema:search-files} [{:keys [::db/pool]} {:keys [::rpc/profile-id team-id search-term]}] (some->> search-term (search-files pool profile-id team-id))) From 05fb46a573aa6b19efb79c781c797a36498c57b4 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 17 Jun 2024 08:14:01 +0200 Subject: [PATCH 17/21] :sparkles: Accept uri instances on http client --- backend/src/app/http/client.clj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/src/app/http/client.clj b/backend/src/app/http/client.clj index 9ef4cc4b2a..4494a1bb0c 100644 --- a/backend/src/app/http/client.clj +++ b/backend/src/app/http/client.clj @@ -54,9 +54,10 @@ "A convencience toplevel function for gradual migration to a new API convention." ([cfg-or-client request] - (let [client (resolve-client cfg-or-client)] + (let [client (resolve-client cfg-or-client) + request (update request :uri str)] (send! client request {:sync? true}))) ([cfg-or-client request options] - (let [client (resolve-client cfg-or-client)] + (let [client (resolve-client cfg-or-client) + request (update request :uri str)] (send! client request (merge {:sync? true} options))))) - From 45c77f97ce8d07280b6afb579715bc0764f1dd11 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 17 Jun 2024 09:58:53 +0200 Subject: [PATCH 18/21] :paperclip: Fix code style issue not catched by the linter Comment indentantion --- backend/src/app/rpc/commands/viewer.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app/rpc/commands/viewer.clj b/backend/src/app/rpc/commands/viewer.clj index 70d5193c16..9d15b3e8fa 100644 --- a/backend/src/app/rpc/commands/viewer.clj +++ b/backend/src/app/rpc/commands/viewer.clj @@ -98,7 +98,7 @@ (assoc ::perms perms) (assoc :profile-id profile-id))] - ;; When we have neither profile nor share, we just return a not + ;; When we have neither profile nor share, we just return a not ;; found response to the user. (when-not perms (ex/raise :type :not-found From 07217609005faeaae9322d0cc6cec8a225c54487 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 25 Jun 2024 16:48:40 +0200 Subject: [PATCH 19/21] :sparkles: Add better schema for shape export property --- common/src/app/common/types/shape/export.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/types/shape/export.cljc b/common/src/app/common/types/shape/export.cljc index 91b5cca24b..7adbf7574e 100644 --- a/common/src/app/common/types/shape/export.cljc +++ b/common/src/app/common/types/shape/export.cljc @@ -12,6 +12,6 @@ (sm/register! ::export [:map {:title "ShapeExport"} - [:type :keyword] + [:type [::sm/one-of export-types]] [:scale ::sm/safe-number] [:suffix :string]]) From 28c2197ba7705fef3dc80b3642fd6b68399edacb Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 20 Jun 2024 08:28:38 +0200 Subject: [PATCH 20/21] :recycle: Add string length validation to backend RPC methods fields --- backend/src/app/rpc/commands/binfile.clj | 10 ++++++---- backend/src/app/rpc/commands/comments.clj | 6 +++--- backend/src/app/rpc/commands/feedback.clj | 4 ++-- backend/src/app/rpc/commands/files.clj | 8 ++++---- backend/src/app/rpc/commands/files_create.clj | 2 +- backend/src/app/rpc/commands/files_share.clj | 4 ++-- backend/src/app/rpc/commands/files_temp.clj | 2 +- backend/src/app/rpc/commands/files_thumbnails.clj | 10 +++++----- backend/src/app/rpc/commands/files_update.clj | 2 +- backend/src/app/rpc/commands/management.clj | 4 ++-- backend/src/app/rpc/commands/media.clj | 4 ++-- backend/src/app/rpc/commands/teams.clj | 2 +- backend/src/app/rpc/commands/verify_token.clj | 2 +- 13 files changed, 31 insertions(+), 29 deletions(-) diff --git a/backend/src/app/rpc/commands/binfile.clj b/backend/src/app/rpc/commands/binfile.clj index 3f5bb931c5..6b2b69c900 100644 --- a/backend/src/app/rpc/commands/binfile.clj +++ b/backend/src/app/rpc/commands/binfile.clj @@ -30,9 +30,10 @@ ;; --- Command: export-binfile -(def ^:private schema:export-binfile +(def ^:private + schema:export-binfile [:map {:title "export-binfile"} - [:name :string] + [:name [:string {:max 250}]] [:file-id ::sm/uuid] [:include-libraries :boolean] [:embed-assets :boolean]]) @@ -74,9 +75,10 @@ {:id project-id}) result)) -(def ^:private schema:import-binfile +(def ^:private + schema:import-binfile [:map {:title "import-binfile"} - [:name :string] + [:name [:string {:max 250}]] [:project-id ::sm/uuid] [:file ::media/upload]]) diff --git a/backend/src/app/rpc/commands/comments.clj b/backend/src/app/rpc/commands/comments.clj index 4949f1a435..41645a8be3 100644 --- a/backend/src/app/rpc/commands/comments.clj +++ b/backend/src/app/rpc/commands/comments.clj @@ -292,7 +292,7 @@ [:map {:title "create-comment-thread"} [:file-id ::sm/uuid] [:position ::gpt/point] - [:content :string] + [:content [:string {:max 250}]] [:page-id ::sm/uuid] [:frame-id ::sm/uuid] [:share-id {:optional true} [:maybe ::sm/uuid]]]) @@ -418,7 +418,7 @@ schema:create-comment [:map {:title "create-comment"} [:thread-id ::sm/uuid] - [:content :string] + [:content [:string {:max 250}]] [:share-id {:optional true} [:maybe ::sm/uuid]]]) (sv/defmethod ::create-comment @@ -477,7 +477,7 @@ schema:update-comment [:map {:title "update-comment"} [:id ::sm/uuid] - [:content :string] + [:content [:string {:max 250}]] [:share-id {:optional true} [:maybe ::sm/uuid]]]) (sv/defmethod ::update-comment diff --git a/backend/src/app/rpc/commands/feedback.clj b/backend/src/app/rpc/commands/feedback.clj index 9bec88dde2..29b79a87ba 100644 --- a/backend/src/app/rpc/commands/feedback.clj +++ b/backend/src/app/rpc/commands/feedback.clj @@ -21,8 +21,8 @@ (def ^:private schema:send-user-feedback [:map {:title "send-user-feedback"} - [:subject :string] - [:content :string]]) + [:subject [:string {:max 250}]] + [:content [:string {:max 250}]]]) (sv/defmethod ::send-user-feedback {::doc/added "1.18" diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index b4d0e8b32e..5c4c93e7de 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -177,7 +177,7 @@ [:features ::cfeat/features] [:has-media-trimmed :boolean] [:comment-thread-seqn {:min 0} :int] - [:name :string] + [:name [:string {:max 250}]] [:revn {:min 0} :int] [:modified-at ::dt/instant] [:is-shared :boolean] @@ -747,19 +747,19 @@ [:map {:title "RenameFileEvent"} [:id ::sm/uuid] [:project-id ::sm/uuid] - [:name :string] + [:name [:string {:max 250}]] [:created-at ::dt/instant] [:modified-at ::dt/instant]] ::sm/params [:map {:title "RenameFileParams"} - [:name {:min 1} :string] + [:name [:string {:min 1 :max 250}]] [:id ::sm/uuid]] ::sm/result [:map {:title "SimplifiedFile"} [:id ::sm/uuid] - [:name :string] + [:name [:string {:max 250}]] [:created-at ::dt/instant] [:modified-at ::dt/instant]]} diff --git a/backend/src/app/rpc/commands/files_create.clj b/backend/src/app/rpc/commands/files_create.clj index ab386eca0b..b65efa3bf8 100644 --- a/backend/src/app/rpc/commands/files_create.clj +++ b/backend/src/app/rpc/commands/files_create.clj @@ -88,7 +88,7 @@ (def ^:private schema:create-file [:map {:title "create-file"} - [:name :string] + [:name [:string {:max 250}]] [:project-id ::sm/uuid] [:id {:optional true} ::sm/uuid] [:is-shared {:optional true} :boolean] diff --git a/backend/src/app/rpc/commands/files_share.clj b/backend/src/app/rpc/commands/files_share.clj index 752fc0e547..98132e06ec 100644 --- a/backend/src/app/rpc/commands/files_share.clj +++ b/backend/src/app/rpc/commands/files_share.clj @@ -22,8 +22,8 @@ (def ^:private schema:create-share-link [:map {:title "create-share-link"} [:file-id ::sm/uuid] - [:who-comment :string] - [:who-inspect :string] + [:who-comment [:string {:max 250}]] + [:who-inspect [:string {:max 250}]] [:pages [:set ::sm/uuid]]]) (sv/defmethod ::create-share-link diff --git a/backend/src/app/rpc/commands/files_temp.clj b/backend/src/app/rpc/commands/files_temp.clj index 4eef262145..2500260763 100644 --- a/backend/src/app/rpc/commands/files_temp.clj +++ b/backend/src/app/rpc/commands/files_temp.clj @@ -35,7 +35,7 @@ (def ^:private schema:create-temp-file [:map {:title "create-temp-file"} - [:name :string] + [:name [:string {:max 250}]] [:project-id ::sm/uuid] [:id {:optional true} ::sm/uuid] [:is-shared :boolean] diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index 87b9736436..7da22f8598 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -85,8 +85,8 @@ ::doc/module :files ::sm/params [:map {:title "get-file-object-thumbnails"} [:file-id ::sm/uuid] - [:tag {:optional true} :string]] - ::sm/result [:map-of :string :string]} + [:tag {:optional true} [:string {:max 50}]]] + ::sm/result [:map-of [:string {:max 250}] [:string {:max 250}]]} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id tag] :as params}] (dm/with-open [conn (db/open pool)] (files/check-read-permissions! conn profile-id file-id) @@ -275,9 +275,9 @@ schema:create-file-object-thumbnail [:map {:title "create-file-object-thumbnail"} [:file-id ::sm/uuid] - [:object-id :string] + [:object-id [:string {:max 250}]] [:media ::media/upload] - [:tag {:optional true} :string]]) + [:tag {:optional true} [:string {:max 50}]]]) (sv/defmethod ::create-file-object-thumbnail {::doc/added "1.19" @@ -316,7 +316,7 @@ (def ^:private schema:delete-file-object-thumbnail [:map {:title "delete-file-object-thumbnail"} [:file-id ::sm/uuid] - [:object-id :string]]) + [:object-id [:string {:max 250}]]]) (sv/defmethod ::delete-file-object-thumbnail {::doc/added "1.19" diff --git a/backend/src/app/rpc/commands/files_update.clj b/backend/src/app/rpc/commands/files_update.clj index b071b3f1a3..f46764129a 100644 --- a/backend/src/app/rpc/commands/files_update.clj +++ b/backend/src/app/rpc/commands/files_update.clj @@ -51,7 +51,7 @@ [:vector [:map [:changes [:vector ::cpc/change]] [:hint-origin {:optional true} :keyword] - [:hint-events {:optional true} [:vector :string]]]]] + [:hint-events {:optional true} [:vector [:string {:max 250}]]]]]] [:skip-validate {:optional true} :boolean]]) (def ^:private diff --git a/backend/src/app/rpc/commands/management.clj b/backend/src/app/rpc/commands/management.clj index bf7883175c..afe3daad89 100644 --- a/backend/src/app/rpc/commands/management.clj +++ b/backend/src/app/rpc/commands/management.clj @@ -91,7 +91,7 @@ (sm/define [:map {:title "duplicate-file"} [:file-id ::sm/uuid] - [:name {:optional true} :string]])) + [:name {:optional true} [:string {:max 250}]]])) (sv/defmethod ::duplicate-file "Duplicate a single file in the same team." @@ -153,7 +153,7 @@ (sm/define [:map {:title "duplicate-project"} [:project-id ::sm/uuid] - [:name {:optional true} :string]])) + [:name {:optional true} [:string {:max 250}]]])) (sv/defmethod ::duplicate-project "Duplicate an entire project with all the files" diff --git a/backend/src/app/rpc/commands/media.clj b/backend/src/app/rpc/commands/media.clj index 28f96ac179..992c5d1da9 100644 --- a/backend/src/app/rpc/commands/media.clj +++ b/backend/src/app/rpc/commands/media.clj @@ -47,7 +47,7 @@ [:id {:optional true} ::sm/uuid] [:file-id ::sm/uuid] [:is-local :boolean] - [:name :string] + [:name [:string {:max 250}]] [:content ::media/upload]]) (sv/defmethod ::upload-file-media-object @@ -177,7 +177,7 @@ [:is-local :boolean] [:url ::sm/uri] [:id {:optional true} ::sm/uuid] - [:name {:optional true} :string]]) + [:name {:optional true} [:string {:max 250}]]]) (sv/defmethod ::create-file-media-object-from-url {::doc/added "1.17" diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index f30bc8870e..42c8ab76fb 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -873,7 +873,7 @@ (def ^:private schema:create-team-with-invitations [:map {:title "create-team-with-invitations"} - [:name :string] + [:name [:string {:max 250}]] [:features {:optional true} ::cfeat/features] [:id {:optional true} ::sm/uuid] [:emails ::sm/set-of-emails] diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index de39fed798..997ba46a87 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -29,7 +29,7 @@ (def ^:private schema:verify-token [:map {:title "verify-token"} - [:token :string]]) + [:token [:string {:max 1000}]]]) (sv/defmethod ::verify-token {::rpc/auth false From f344eee778a661854b4b2ff29ddc7b7712c47193 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 20 Jun 2024 15:29:50 +0200 Subject: [PATCH 21/21] :bug: Fix backend test initialization code --- backend/test/backend_tests/helpers.clj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/test/backend_tests/helpers.clj b/backend/test/backend_tests/helpers.clj index 9f754c2433..5dc4f24d7c 100644 --- a/backend/test/backend_tests/helpers.clj +++ b/backend/test/backend_tests/helpers.clj @@ -104,10 +104,10 @@ (dissoc :app.srepl/server :app.http/server :app.http/router - :app.auth.oidc/google-provider - :app.auth.oidc/gitlab-provider - :app.auth.oidc/github-provider - :app.auth.oidc/generic-provider + :app.auth.oidc.providers/google + :app.auth.oidc.providers/gitlab + :app.auth.oidc.providers/github + :app.auth.oidc.providers/generic :app.setup/templates :app.auth.oidc/routes :app.worker/monitor