From 2ddcd0ce15b820f9808bbaf2d80dba7f5fd27518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 16 Apr 2025 17:35:39 +0200 Subject: [PATCH] :books: Update Tech Guide about abstraction levels --- .../abstraction-levels/abstraction-levels.png | Bin 0 -> 90552 bytes .../developer/abstraction-levels.md | 371 ++++++++++++++++++ .../developer/architecture/index.md | 2 +- docs/technical-guide/developer/backend.md | 2 +- docs/technical-guide/developer/common.md | 2 +- docs/technical-guide/developer/data-guide.md | 213 +--------- .../developer/data-model/index.md | 2 +- docs/technical-guide/developer/devenv.md | 2 +- docs/technical-guide/developer/frontend.md | 2 +- .../developer/subsystems/index.md | 2 +- docs/technical-guide/developer/ui.md | 2 +- 11 files changed, 380 insertions(+), 220 deletions(-) create mode 100644 docs/img/abstraction-levels/abstraction-levels.png create mode 100644 docs/technical-guide/developer/abstraction-levels.md diff --git a/docs/img/abstraction-levels/abstraction-levels.png b/docs/img/abstraction-levels/abstraction-levels.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb2c31aefe25fd6f7f721f43ea709a5b104a50f GIT binary patch literal 90552 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 kh@6mpje$>d8bZ#mF!^*z$`OV%_I=_GUE;MD1 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 d|DG$B4op88DB6rEYiRJ;6Em+t literal 0 HcmV?d00001 diff --git a/docs/technical-guide/developer/abstraction-levels.md b/docs/technical-guide/developer/abstraction-levels.md new file mode 100644 index 000000000..40ba1c499 --- /dev/null +++ b/docs/technical-guide/developer/abstraction-levels.md @@ -0,0 +1,371 @@ +--- +title: 3.07. Abstraction levels +--- + +# Code organization in abstraction levels + +Initially, Penpot data model implementation was organized in a different way. +We are currently in a process of reorganization. The objective is to have data +manipulation code structured in abstraction layers, with well-defined +boundaries, and a hierarchical structure (each level may only use same or +lower levels, but not higher). + +![Abstraction levels](/img/abstraction-levels/abstraction-levels.png) + +At this moment the namespace structure is already organized as described here, +but there is much code that does not comply with these rules, and needs to be +moved or refactored. We expect to be refactoring existing modules incrementally, +each time we do an important functionality change. + +## Basic data + +```text +▾ common/ + ▾ src/app/common/ + data.cljc + ▾ src/app/data/ + macros.cljc +``` + +A level for generic data structures or operations, that are not specifically part +of the domain model (e.g. trees, strings, maps, iterators, etc.). Also may belong +here some functions in app.common.geom/ and app.common.files.helpers.cljc. + +We need to create a new directory for this and move there all functions in this +leve. + + +## Abstract data types + +```text +▾ common/ + ▾ src/app/common/ + ▾ types/ + file.cljc + page.cljc + shape.cljc + color.cljc + component.cljc + tokens_lib.cljc + ... +``` + +Namespaces here represent a single data entity of the domain model, or a +fragment of one, as an [Abstract Data Type](https://www.geeksforgeeks.org/abstract-data-types/). +An ADT is a data component that is defined through a series of properties and +operations, and that abstracts out the details of how it's implemented and what +is the internal structure. This allows to simplify the logic of the client +code, and also to make future changes in the ADT without affecting callers (if +the abstract interface does not change). + +Each structure in this module has: + +* A **schema spec** that defines the structure of the type and its values: + + ```clojure + (def ::fill + [:map {:title "Fill"} + [:fill-color {:optional true} ::ctc/rgb-color] + [:fill-opacity {:optional true} ::sm/safe-number] + ...) + + (def ::shape-attrs + [:map {:title "ShapeAttrs"} + [:name {:optional true} :string] + [:selrect {:optional true} ::grc/rect] + [:points {:optional true} ::points] + [:blocked {:optional true} :boolean] + [:fills {:optional true} + [:vector {:gen/max 2} ::fill]] + ...) + + (def schema:token-set-attrs + [:map {:title "TokenSet"} + [:name :string] + [:description {:optional true} :string] + [:modified-at {:optional true} ::sm/inst] + [:tokens {:optional true} [:and + [:map-of {:gen/max 5} + :string + schema:token] + [:fn d/ordered-map?]]]]) + ``` + +* A **protocol** that define the external interface to be used for this entity. + + (NOTE: this is currently only implemented in Design Tokens subsystem). + + ```clojure + (defprotocol ITokenSet + (update-name [_ set-name] "change a token set name while keeping the path") + (add-token [_ token] "add a token at the end of the list") + (update-token [_ token-name f] "update a token in the list") + (delete-token [_ token-name] "delete a token from the list") + (get-token [_ token-name] "return token by token-name") + (get-tokens [_] "return an ordered sequence of all tokens in the set")) + ``` + +* A **custom data type** that implements this protocol. __Functions here are the only + ones allowed to modify the internal structure of the type__. + + Clojure allows us two kinds of custom data types: + * [**`deftype`**](https://funcool.github.io/clojurescript-unraveled/#deftype). We'll + use it when we want the internal structure to be completely opaque and + data accessed through protocol functions. Clojure allows access to the + attributes with the (.-attr) + syntax, but we prefer not to use it. + * [**`defrecord`**](https://funcool.github.io/clojurescript-unraveled/#defrecord). + We'll use it when we want the structure to be exposed as a plain clojure + map, and thus allowing to read attributes with (:attr t), to use get, keys, vals, etc. Note that this also allows + modifying the object with assoc, + update, etc. But in general we + prefer to do all modification via protocol methods, because this way + it's easier to track down where the failure is if an invalid structure + is detected in a validation check, and add business logic like "update + modified-at whenever any other + attribute is changed". + + ```clojure + (defrecord TokenSet [name description modified-at tokens] + ITokenSet + (add-token [_ token] + (let [token (check-token token)] + (TokenSet. name + description + (dt/now) + (assoc tokens (:name token) token)))) + ``` + + +* **Additional helper functions** the protocol should be made as small and compact + as possible. If we need functions for business logic or complex queries that + do not need to directly access the internal structure, but can be implemented by + only calling the abstract procotol, they should be created as standalone functions. + At this level, they must be functions that operate only on instances of the given + domain model entity. They must always ensure the internal integrity of the data. + + ```clojure + (defn sets-tree-seq + "Get tokens sets tree as a flat list" + [token-sets] + ...) + +> IMPORTANT SUMMARY +> * Code in this level only knows about one domain model entity. +> * All functions ensure the internal integrity of the data. +> * For this, the schema is used, and the functions must check parameters +> and output values as needed. +> * No outside code should get any knowledge of the internal structure, so it +> can be changed in the future without breaking cliente code. +> * All modifications of the data should be done via protocol methods (even in +> defrecords). This allows a) more +> control of the internal data dependencies, b) easier bug tracking of +> corrupted data, and c) easier refactoring when the structure is modified. + +Currently most of Penpot code does not follow those requirements, but it +should do in new code or in any refactor. + +## File operations + +```text +▾ common/ + ▾ src/app/common/ + ▾ files/ + helpers.cljc + shapes_helpers.cljc + ... +``` + +Functions that modify a file object (or a part of it) in place, returning the +file object changed. They ensure the referential integrity within the file, or +between a file and its libraries. + +**These functions are used when we need to manipulate objects of different +domain entities inside a file.** + +```clojure +(defn resolve-component + "Retrieve the referenced component, from the local file or from a library" + [shape file libraries & {:keys [include-deleted?] :or {include-deleted? False}}] + (if (= (:component-file shape) (:id file)) + (ctkl/get-component (:data file) (:component-id shape) include-deleted?) + (get-component libraries + (:component-file shape) + (:component-id shape) + :include-deleted? include-deleted?))) + +(defn delete-component +"Mark a component as deleted and store the main instance shapes inside it, to +be able to be recovered later." +[file-data component-id skip-undelete? Main-instance] +(let [components-v2 (dm/get-in file-data [:options :components-v2])] + (if (or (not components-v2) skip-undelete?) + (ctkl/delete-component file-data component-id) + (let [set-main-instance ;; If there is a saved main-instance, restore it. + #(if main-instance + (assoc-in % [:objects (:main-instance-id %)] main-instance) + %)] + (-> file-data + (ctkl/update-component component-id load-component-objects) + (ctkl/update-component component-id set-main-instance) + (ctkl/mark-component-deleted component-id)))))) +``` + +> This module is still needing an important refactor. Mainly to take functions +> from common.types and move them here. + +### File validation and repair + +There is a function in app.common.files.validate that checks a file for +referential and semantic integrity. It's called automatically when file changes +are sent to backend, but may be invoked manually whenever it's needed. + +## File changes objects + +```text +▾ common/ + ▾ src/app/common/ + ▾ files/ + changes_builder.cljc + changes.cljc + ... +``` + +This layer is how we adopt the [Event sourcing pattern](https://www.geeksforgeeks.org/event-sourcing-pattern/). +Instead of directly modifying files, we create changes +objects, that represent one modification, and that can be serialized, stored, +send to backend, logged, etc. Then it can be *materialized* by a **processing +function**, that takes a file and a change, and returns the updated file. + +This also allows an important feature: undoing changes. + +Processing functions should not contain business logic or algorithms. Just +adapt the change interface to the operations in **File** or **Abstract Data +Types** levels. + +There exists a changes-builder module +with helper functions to conveniently build changes objects, and to +automatically calculate the reverse undo change. + +```clojure +(sm/define! ::changes + [:map {:title "changes"} + [:redo-changes vector?] + [:undo-changes seq?] + [:origin {:optional true} any?] + [:save-undo? {:optional true} boolean?] + [:stack-undo? {:optional true} boolean?] + [:undo-group {:optional true} any?]]) + +(defmethod process-change :add-component + [file-data params] + (ctkl/add-component file-data params)) +``` + +> IMPORTANT RULES +> +> All changes must satisfy two properties: +> * **[Idempotence](https://en.wikipedia.org/wiki/Idempotence)**. The event +> sourcing architecture and multiuser capability may cause that the same +> change may be applied more than once to a file. So changes must not, for +> example, be like *increment counter* but rather *set counter to value x*. +> * **Minimal scope**. To reduce conflicts, changes should only modify the +> relevant part of the domain entity. This way, if a concurrent change on +> the same entity arrives, from another user, and it modifies a different +> part of the data, they may ve processed without overriding. + +## Business logic + +```text +▾ common/ + ▾ src/app/common/ + ▾ logic/ + shapes.cljc + libraries.cljc +``` + +At this level there are functions that implement high level user actions, in an +abstract way (independent of UI). Here may be complex business logic (eg. to +create a component copy we must clone all shapes, assign new ids, relink +parents, change the head structure to be a copy and link each shape in the copy +with the corresponding one in the main). + +They don't directly modify files, but generate changes objects, that may be +executed in frontend or sent to backend. + +Those functions may also be composed in even higher level actions. For example +a "update shape attr" action may use "unapply token" actions when the attribute +has an applied token. + +```clojure +(defn generate-instantiate-component +"Generate changes to create a new instance from a component." +[changes objects file-id component-id position page libraries old-id parent-id + frame-id {:keys [force-frame?] :or {force-frame? False}}] + (let [component (ctf/get-component libraries file-id component-id) + parent (when parent-id (get objects parent-id)) + library (get libraries file-id) + components-v2 (dm/get-in library [:data :options :components-v2]) + [new-shape new-shapes]º + (ctn/make-component-instance page + Component + (:data library) + Position + Components-v2 + (cond-> {} + force-frame? (assoc :force-frame-id frame-id))) + changes (cond-> (pcb/add-object changes first-shape {:ignore-touched true}) + (some? old-id) (pcb/amend-last-change #(assoc % :old-id old-id))) + changes (reduce #(pcb/add-object %1 %2 {:ignore-touched true}) + changes + (rest new-shapes))] +[new-shape changes])) +``` + +## Data events + +```text +▾ frontend/ + ▾ src/app/main/data/ + ▾ dashboard/ + ▾ viewer/ + ▾ workspace/ +``` + +This is the intersection of the logic and the presentation in Penpot. Data +events belong to the presentation interface and they manage the global state of +the application. But they may also work on loaded files by using **File** or +**Abstract Data Types** operations to query the data, and by creating and +commiting **changes** via the **Business logic** generate functions. + +**IMPORTANT: data events must not contain business logic theirselves**, or +directly manipulate data structures. They only may modify or query the global +state, and delegate all logic to lower level functions. + +In current Penpot code, there is some quantity of business logic in data events, +that should be progressively moved elsewhere as we keep refactoring. + +```clojure +(defn detach-component + "Remove all references to components in the shape with the given id, + and all its children, at the current page." + [id] + (dm/assert! (uuid? id)) + (ptk/reify ::detach-component + ptk/WatchEvent + (watch [it state _] + (let [page-id (:current-page-id state) + file-id (:current-file-id state) + + fdata (dsh/lookup-file-data state file-id) + libraries (dsh/lookup-libraries state) + + changes (-> (pcb/empty-changes it) + (cll/generate-detach-component id fdata page-id libraries))] + + (rx/of (dch/commit-changes changes)))))) +``` diff --git a/docs/technical-guide/developer/architecture/index.md b/docs/technical-guide/developer/architecture/index.md index 19ea7e4c2..1160393d9 100644 --- a/docs/technical-guide/developer/architecture/index.md +++ b/docs/technical-guide/developer/architecture/index.md @@ -1,5 +1,5 @@ --- -title: 3.1. Architecture +title: 3.01. Architecture desc: Dive into architecture, backend, frontend, data models, and development environments. Contribute and self-host for free! See Penpot's technical guide. --- diff --git a/docs/technical-guide/developer/backend.md b/docs/technical-guide/developer/backend.md index 672b71879..1a0c69d01 100644 --- a/docs/technical-guide/developer/backend.md +++ b/docs/technical-guide/developer/backend.md @@ -1,5 +1,5 @@ --- -title: 3.6. Backend Guide +title: 3.06. Backend Guide --- # Backend guide # diff --git a/docs/technical-guide/developer/common.md b/docs/technical-guide/developer/common.md index 5b921dc74..ab2f51292 100644 --- a/docs/technical-guide/developer/common.md +++ b/docs/technical-guide/developer/common.md @@ -1,5 +1,5 @@ --- -title: 3.4. Common Guide +title: 3.04. Common Guide desc: "View Penpot's technical guide: self-hosting, configuration, developer insights, architecture, data model, integration, and troubleshooting." --- diff --git a/docs/technical-guide/developer/data-guide.md b/docs/technical-guide/developer/data-guide.md index 24157f012..793ff365c 100644 --- a/docs/technical-guide/developer/data-guide.md +++ b/docs/technical-guide/developer/data-guide.md @@ -1,5 +1,5 @@ --- -title: 3.7. Data Guide +title: 3.08. Data Guide desc: Learn about data structures, code organization, file operations, migrations, shape editing, and component syncing. See Penpot's technical guide. Try it free! --- @@ -30,217 +30,6 @@ all of this is important in general. Clojure (for example ending it with ? for boolean values), because this may cause problems when exporting. -## Code organization in abstraction levels - -Initially, Penpot data model implementation was organized in a different way. -We are currently in a process of reorganization. The objective is to have data -manipulation code structured in abstraction layers, with well-defined -boundaries. - -At this moment the namespace structure is already organized as described here, -but there is much code that does not comply with these rules, and needs to be -moved or refactored. We expect to be refactoring existing modules incrementally, -each time we do an important functionality change. - -### Abstract data types - -```text -▾ common/ - ▾ src/app/common/ - ▾ types/ - file.cljc - page.cljc - shape.cljc - color.cljc - component.cljc - ... -``` - -Namespaces here represent a single data structure, or a fragment of one, as an -abstract data type. Each structure has: - -* A **schema spec** that defines the structure of the type and its values: - - ```clojure - (sm/define! ::fill - [:map {:title "Fill"} - [:fill-color {:optional true} ::ctc/rgb-color] - [:fill-opacity {:optional true} ::sm/safe-number] - ...) - - (sm/define! ::shape-attrs - [:map {:title "ShapeAttrs"} - [:name {:optional true} :string] - [:selrect {:optional true} ::grc/rect] - [:points {:optional true} ::points] - [:blocked {:optional true} :boolean] - [:fills {:optional true} - [:vector {:gen/max 2} ::fill]] - ...) - ``` - -* **Helper functions** to create, query and manipulate the structure. Helpers - at this level only are allowed to see the internal attributes of a type. - Updaters receive an object of the type, and return a new object modified, - also ensuring the internal integrity of the data after the change. - - ```clojure - (defn setup-shape - "A function that initializes the geometric data of the shape. The props must - contain at least :x :y :width :height." - [{:keys [type] :as props}] - ...) - - (defn has-direction? - [interaction] - (#{:slide :push} (-> interaction :animation :animation-type))) - - (defn set-direction - [interaction direction] - (dm/assert! - "expected valid interaction map" - (check-interaction! interaction)) - (dm/assert! - "expected valid direction" - (contains? direction-types direction)) - (dm/assert! - "expected compatible interaction map" - (has-direction? interaction)) - (update interaction :animation assoc :direction direction)) - ``` - -> IMPORTANT: we should always use helper functions to access and modify these data -> structures. Avoid direct attribute read or using functions like assoc or -> update, even if the information is contained in a single attribute. This way -> it will be much simpler to add validation checks or to modify the internal -> representation of a type, and will be easier to search for places in the code -> where this data item is used. -> -> Currently much of Penpot code does not follow this requirement, but it -should do in new code or in any refactor. - -### File operations - -```text -▾ common/ - ▾ src/app/common/ - ▾ files/ - helpers.cljc - shapes_helpers.cljc - ... -``` - -Functions that modify a file object (or a part of it) in place, returning the -file object changed. They ensure the referential integrity within the file, or -between a file and its libraries. - -```clojure -(defn resolve-component - "Retrieve the referenced component, from the local file or from a library" - [shape file libraries & {:keys [include-deleted?] :or {include-deleted? False}}] - (if (= (:component-file shape) (:id file)) - (ctkl/get-component (:data file) (:component-id shape) include-deleted?) - (get-component libraries - (:component-file shape) - (:component-id shape) - :include-deleted? include-deleted?))) - -(defn delete-component -"Mark a component as deleted and store the main instance shapes inside it, to -be able to be recovered later." -[file-data component-id skip-undelete? Main-instance] -(let [components-v2 (dm/get-in file-data [:options :components-v2])] - (if (or (not components-v2) skip-undelete?) - (ctkl/delete-component file-data component-id) - (let [set-main-instance ;; If there is a saved main-instance, restore it. - #(if main-instance - (assoc-in % [:objects (:main-instance-id %)] main-instance) - %)] - (-> file-data - (ctkl/update-component component-id load-component-objects) - (ctkl/update-component component-id set-main-instance) - (ctkl/mark-component-deleted component-id)))))) -``` - -> This module is still needing an important refactor. Mainly to take functions -> from common.types and move them here. - -#### File validation and repair - -There is a function in app.common.files.validate that checks a file for -referential and semantic integrity. It's called automatically when file changes -are sent to backend, but may be invoked manually whenever it's needed. - -### File changes objects - -```text -▾ common/ - ▾ src/app/common/ - ▾ files/ - changes_builder.cljc - changes.cljc - ... -``` - -Wrap the update functions in file operations module into changes objects, that -may be serialized, stored, sent to backend and executed to actually modify a file -object. They should not contain business logic or algorithms. Only adapt the -interface to the file operations or types. - -```clojure -(sm/define! ::changes - [:map {:title "changes"} - [:redo-changes vector?] - [:undo-changes seq?] - [:origin {:optional true} any?] - [:save-undo? {:optional true} boolean?] - [:stack-undo? {:optional true} boolean?] - [:undo-group {:optional true} any?]]) - -(defmethod process-change :add-component - [file-data params] - (ctkl/add-component file-data params)) -``` - -### Business logic - -```text -▾ common/ - ▾ src/app/common/ - ▾ logic/ - shapes.cljc - libraries.cljc -``` - -Functions that implement semantic user actions, in an abstract way (independent -of UI). They don't directly modify files, but generate changes objects, that -may be executed in frontend or sent to backend. - -```clojure -(defn generate-instantiate-component -"Generate changes to create a new instance from a component." -[changes objects file-id component-id position page libraries old-id parent-id - frame-id {:keys [force-frame?] :or {force-frame? False}}] - (let [component (ctf/get-component libraries file-id component-id) - parent (when parent-id (get objects parent-id)) - library (get libraries file-id) - components-v2 (dm/get-in library [:data :options :components-v2]) - [new-shape new-shapes]º - (ctn/make-component-instance page - Component - (:data library) - Position - Components-v2 - (cond-> {} - force-frame? (assoc :force-frame-id frame-id))) - changes (cond-> (pcb/add-object changes first-shape {:ignore-touched true}) - (some? old-id) (pcb/amend-last-change #(assoc % :old-id old-id))) - changes (reduce #(pcb/add-object %1 %2 {:ignore-touched true}) - changes - (rest new-shapes))] -[new-shape changes])) -``` - ## Data migrations ```text diff --git a/docs/technical-guide/developer/data-model/index.md b/docs/technical-guide/developer/data-model/index.md index 21999f93c..6d384825f 100644 --- a/docs/technical-guide/developer/data-model/index.md +++ b/docs/technical-guide/developer/data-model/index.md @@ -1,5 +1,5 @@ --- -title: 3.2. Data model +title: 3.02. Data model desc: Learn about self-hosting, configuration, developer tools, data models, architecture, and integrations. View Penpot's technical guide. Free to use! --- diff --git a/docs/technical-guide/developer/devenv.md b/docs/technical-guide/developer/devenv.md index 27c42c201..61eb4f92b 100644 --- a/docs/technical-guide/developer/devenv.md +++ b/docs/technical-guide/developer/devenv.md @@ -1,5 +1,5 @@ --- -title: 3.3. Dev environment +title: 3.03. Dev environment desc: Dive into Penpot's development environment. Learn about self-hosting, configuration, developer tools, architecture, and more. See the Penpot Technical Guide! --- diff --git a/docs/technical-guide/developer/frontend.md b/docs/technical-guide/developer/frontend.md index 9b5feb6ba..bbab7a6eb 100644 --- a/docs/technical-guide/developer/frontend.md +++ b/docs/technical-guide/developer/frontend.md @@ -1,5 +1,5 @@ --- -title: 3.5. Frontend Guide +title: 3.05. Frontend Guide desc: "See Penpot's technical guide: self-hosting, configuration, developer insights (architecture, data model), frontend, backend, and integrations & more!" --- diff --git a/docs/technical-guide/developer/subsystems/index.md b/docs/technical-guide/developer/subsystems/index.md index aea446a12..f53b59adb 100644 --- a/docs/technical-guide/developer/subsystems/index.md +++ b/docs/technical-guide/developer/subsystems/index.md @@ -1,5 +1,5 @@ --- -title: 3.8. Penpot subsystems +title: 3.09. Penpot subsystems desc: Learn about architecture, data models, and subsystems. View Penpot's technical guide for self-hosting, configuration, and development insights. Free! --- diff --git a/docs/technical-guide/developer/ui.md b/docs/technical-guide/developer/ui.md index 103bc4025..5105e2bc5 100644 --- a/docs/technical-guide/developer/ui.md +++ b/docs/technical-guide/developer/ui.md @@ -1,5 +1,5 @@ --- -title: 3.9. UI Guide +title: 3.10. UI Guide desc: Learn UI development with React & Rumext, design system implementation, and performance considerations. See Penpot's technical guide. Free to use! ---