hammer-editor/docs/ARCHITECTURE.md
2024-10-20 12:47:36 -07:00

3.6 KiB

Software Architecture

In theory each layer of the architecture should only reference entities from the layer below it. In general they should avoid accessing entities from the layer they belong to.

This is all a work in progress, so how strictly this is adhered to is in flux.

Client Architecture

Multiplatform Code

flowchart TD
	subgraph Common
		direction TB
		Data_Repositories[Data Repositories]
		Application_Components[Application Components]
	end

	subgraph Platform_Specific
		direction TB
		User_Interface[User Interface]
	end

	Data_Repositories --> Application_Components
	Application_Components --> User_Interface
%% Styling for grouping and border thickness
	classDef commonGroup fill: none, stroke: #00ff00, stroke-width: 2px;
	classDef platformSpecificGroup fill: none, stroke: #f8961e, stroke-width: 2px;
	class Common commonGroup;
	class Platform_Specific platformSpecificGroup;

The architecture broadly breaks down into two categories, common code that compiles and runs on all supported platforms, and platform specific which much be implemented for each of the client platforms.

The majority of code falls under common with only the UI layers and some glue code having to be reimplemented per platform.

Architecture Layers

flowchart TD
    UI["fa:fa-desktop UI Layer"]
    Components["fa:fa-cogs Component Layer"]
    Services["fa:fa-server Service Layer"]
    Repositories["fa:fa-database Repository Layer"]
    Datasources["fa:fa-database Datasource Layer"]

    %% Edge connections between nodes
    UI --> Components
    Components --> Services
    Components --> Repositories
    Services --> Repositories
    Repositories --> Datasources

    %% Styling for layers
    style UI fill:#33AB00, stroke:#338800, color:#FFFFFF
    style Components fill:#227700, stroke:#225500, color:#FFFFFF
    style Services fill:#FF3D00, stroke:#FF3D00, color:#FFFFFF
    style Repositories fill:#DD2C00, stroke:#DD2C00, color:#FFFFFF
    style Datasources fill:#6666FC, stroke:#1111AA, color:#FFFFFF

UI

The UI is a dumb and stateless as possible, each platform can have it's own implementation of this layer.

Component

(AKA: ViewModel in other architectures)

These have a one-to-one relationship with UI elements. They are stateful and contain business logic.

Use Cases (not used at the moment)

Contains business logic, is stateless and can combine Services and Repositories

Services

These are stateful and may combine multiple Repositories.

Data Repositories

These use stateful and responsible for transforming, validating, and caching data from the Datasources, and vending it to the layers above.

Datasource

Stateless entities for accessing Data.

Server Architecture

flowchart TD
    Routes["fa:fa-desktop Routes"]
    Repositories["fa:fa-database Repository Layer"]
    Datasources["fa:fa-database Datasource Layer"]

    %% Edge connections between nodes
    Routes --> Repositories
    Repositories --> Datasources

    %% Styling for layers
    style Routes fill:#33AB00, stroke:#338800, color:#FFFFFF
    style Repositories fill:#DD2C00, stroke:#DD2C00, color:#FFFFFF
    style Datasources fill:#6666FC, stroke:#1111AA, color:#FFFFFF

Routes

These are the HTTP handlers that define the various endpoints. They unmarshal data from HTTP requests, call into Repositories, and then marshal data back into HTTP responses.

Repositories

These use stateful and responsible for transforming, validating, and caching data from the Datasources, and vending it to the layers above.

Datasource

Stateless classes for accessing Data.