From 790d2e15e426cee8cbd297ac133abfe557219840 Mon Sep 17 00:00:00 2001 From: Ivan Dugalic Date: Tue, 25 Jun 2024 19:41:07 +0200 Subject: [PATCH] first commit --- .cargo/config.toml | 3 + .github/workflows/lint-and-test.yml | 42 +++ .gitignore | 6 + Cargo.toml | 36 ++ README.md | 67 ++++ fmodel_rust_postgres.control | 5 + restaurant-model.jpg | Bin 0 -> 275138 bytes sql/event_sourcing.sql | 157 +++++++++ src/application/mod.rs | 1 + src/application/order_restaurant_aggregate.rs | 15 + src/domain/api.rs | 277 +++++++++++++++ src/domain/mod.rs | 247 ++++++++++++++ src/domain/order_decider.rs | 88 +++++ src/domain/order_saga.rs | 37 ++ src/domain/order_view.rs | 46 +++ src/domain/restaurant_decider.rs | 111 ++++++ src/domain/restaurant_saga.rs | 28 ++ src/domain/restaurant_view.rs | 51 +++ .../application/event_sourced_aggregate.rs | 228 +++++++++++++ src/framework/application/mod.rs | 1 + src/framework/domain/api.rs | 21 ++ src/framework/domain/mod.rs | 1 + src/framework/infrastructure/errors.rs | 26 ++ .../infrastructure/event_repository.rs | 322 ++++++++++++++++++ src/framework/infrastructure/mod.rs | 2 + src/framework/mod.rs | 3 + src/infrastructure/mod.rs | 1 + .../order_restaurant_event_repository.rs | 15 + src/lib.rs | 121 +++++++ 29 files changed, 1958 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .github/workflows/lint-and-test.yml create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 fmodel_rust_postgres.control create mode 100644 restaurant-model.jpg create mode 100644 sql/event_sourcing.sql create mode 100644 src/application/mod.rs create mode 100644 src/application/order_restaurant_aggregate.rs create mode 100644 src/domain/api.rs create mode 100644 src/domain/mod.rs create mode 100644 src/domain/order_decider.rs create mode 100644 src/domain/order_saga.rs create mode 100644 src/domain/order_view.rs create mode 100644 src/domain/restaurant_decider.rs create mode 100644 src/domain/restaurant_saga.rs create mode 100644 src/domain/restaurant_view.rs create mode 100644 src/framework/application/event_sourced_aggregate.rs create mode 100644 src/framework/application/mod.rs create mode 100644 src/framework/domain/api.rs create mode 100644 src/framework/domain/mod.rs create mode 100644 src/framework/infrastructure/errors.rs create mode 100644 src/framework/infrastructure/event_repository.rs create mode 100644 src/framework/infrastructure/mod.rs create mode 100644 src/framework/mod.rs create mode 100644 src/infrastructure/mod.rs create mode 100644 src/infrastructure/order_restaurant_event_repository.rs create mode 100644 src/lib.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..13c456b --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[target.'cfg(target_os="macos")'] +# Postgres symbols won't be available until runtime +rustflags = ["-Clink-arg=-Wl,-undefined,dynamic_lookup"] diff --git a/.github/workflows/lint-and-test.yml b/.github/workflows/lint-and-test.yml new file mode 100644 index 0000000..ed8e457 --- /dev/null +++ b/.github/workflows/lint-and-test.yml @@ -0,0 +1,42 @@ +name: ๐Ÿงช Lint and Test + +on: + push: + branches-ignore: [wip/**] + +jobs: + test: + runs-on: ubuntu-latest + container: pgxn/pgxn-tools + strategy: + matrix: + pg: [11, 12, 13, 14, 15, 16] + name: ๐Ÿ˜ Postgres ${{ matrix.pg }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Start PostgreSQL ${{ matrix.pg }} + run: pg-start ${{ matrix.pg }} + - name: Setup Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Test on PostgreSQL ${{ matrix.pg }} + run: pgrx-build-test + + lint: + name: โœ… Lint and Cover + runs-on: ubuntu-latest + container: pgxn/pgxn-tools + env: { PGVERSION: 16 } + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Start PostgreSQL ${{ env.PGVERSION }} + run: pg-start ${{ env.PGVERSION }} libxml2-utils + - name: Setup Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Install pgrx + run: make install-pgrx + - name: Initialize pgrx + run: make pgrx-init + - name: Format and Lint + run: make lint \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3906c33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +.idea/ +/target +*.iml +**/*.rs.bk +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f386875 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "fmodel_rust_postgres" +version = "1.0.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[features] +default = ["pg15"] +pg11 = ["pgrx/pg11", "pgrx-tests/pg11" ] +pg12 = ["pgrx/pg12", "pgrx-tests/pg12" ] +pg13 = ["pgrx/pg13", "pgrx-tests/pg13" ] +pg14 = ["pgrx/pg14", "pgrx-tests/pg14" ] +pg15 = ["pgrx/pg15", "pgrx-tests/pg15" ] +pg16 = ["pgrx/pg16", "pgrx-tests/pg16" ] +pg_test = [] + +[dependencies] +pgrx = "=0.11.4" +serde = { version = "1.0.203", features = ["derive"] } +fmodel-rust = "0.7.0" +serde_json = "1.0.117" +uuid = { version = "1.8.0", features = ["serde", "v4"] } + +[dev-dependencies] +pgrx-tests = "=0.11.4" + +[profile.dev] +panic = "unwind" + +[profile.release] +panic = "unwind" +opt-level = 3 +lto = "fat" +codegen-units = 1 diff --git a/README.md b/README.md new file mode 100644 index 0000000..97957a3 --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# `fmodel-rust-postgres` + +Effortlessly transform your domain models into powerful PostgreSQL extensions using our GitHub repository template. +With pre-implemented infrastructure and application layers in the `framework` module, you can focus entirely on your core domain logic while running your models directly within your PostgreSQL database for seamless integration and enhanced performance. + +The template includes a demo domain model of a `restaurant/order management system`, showcasing practical implementation and providing a solid foundation for your own projects. + +![event model](restaurant-model.jpg) + +>Actually, the domain model is copied from the traditional application [fmodel-rust-demo](https://github.com/fraktalio/fmodel-rust-demo), demonstrating how to run your unique and single domain model directly within your PostgreSQL database/`as extension`; or connect the application to the database/`traditionally`. + +## Event Sourcing + +With event sourcing, we delve deeper by capturing every decision or alteration as an event. +Each new transfer or modification to the account state is meticulously documented, providing a comprehensive audit trail +of all activities. +This affords you a 100% accurate historical record of your domain, enabling you to effortlessly traverse back +in time and review the state at any given moment. + +**History is always on!** + +## Technology +This project is using: + +- [`rust` programming language](https://www.rust-lang.org/) to build a high-performance, reliable, and efficient system. +- [fmodel-rust library](https://github.com/fraktalio/fmodel-rust) to implement tactical Domain-Driven Design patterns, optimised for Event Sourcing. +- [pgrx](https://github.com/pgcentralfoundation/pgrx) to simplify the creation of custom Postgres extensions and bring `logic` closer to your data(base). + +## Requirements +- [Rust](https://www.rust-lang.org/tools/install) +- [PGRX subcommand](https://github.com/pgcentralfoundation/pgrx?tab=readme-ov-file#getting-started): `cargo install --locked cargo-pgrx` +- Run `cargo pgrx init` once, to properly configure the pgrx development environment. It downloads the latest releases of supported Postgres versions, configures them for debugging, compiles them with assertions, and installs them to `"${PGRX_HOME}"`. These include all contrib extensions and tools included with Postgres. Other cargo pgrx commands such as `run` and `test` will manage and use these installations on your behalf. + +> No manual Postgres database installation is required. + +## Test it / Run it +Run tests: + +```shell +cargo pgrx test +``` + +Compile/install extension to a pgrx-managed Postgres instance and start psql: +```shell +cargo pgrx run +``` + +Confused? Run `cargo pgrx help` + +## The structure of the project + +The project is structured as follows: +- `lib.rs` file contains the entry point of the package/crate. +- `framework` module contains the generalized and parametrized implementation of infrastructure and application layers. +- `domain` module contains the domain model. It is the core and pure domain logic of the application!!! +- `application` module contains the application layer. It is the orchestration of the domain model and the infrastructure layer (empty, as it is implemented in the `framework` module). +- `infrastructure` module contains the infrastructure layer / fetching and storing data (empty, as it is implemented in the `framework` module). + +The framework module offers a generic implementation of the infrastructure and application layers, which can be reused across multiple domain models. +Your focus should be on the `domain` module, where you can implement your unique domain model. We have provided a demo domain model of a `restaurant/order management system` to get you started. + +## References and further reading +- [pgrx](https://github.com/pgcentralfoundation/pgrx) +- [fmodel-rust](https://github.com/fraktalio/fmodel-rust) + +--- +Created with :heart: by [Fraktalio](https://fraktalio.com/) diff --git a/fmodel_rust_postgres.control b/fmodel_rust_postgres.control new file mode 100644 index 0000000..1077cd2 --- /dev/null +++ b/fmodel_rust_postgres.control @@ -0,0 +1,5 @@ +comment = 'fmodel_rust_postgres: Created by pgrx' +default_version = '@CARGO_VERSION@' +module_pathname = '$libdir/fmodel_rust_postgres' +relocatable = false +superuser = true diff --git a/restaurant-model.jpg b/restaurant-model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02de40c78f9981f37ba19328529519f8c0f522a1 GIT binary patch literal 275138 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

gVtrK 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�)J~K0It|YezeEDg;8C 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 literal 0 HcmV?d00001 diff --git a/sql/event_sourcing.sql b/sql/event_sourcing.sql new file mode 100644 index 0000000..ccf95a8 --- /dev/null +++ b/sql/event_sourcing.sql @@ -0,0 +1,157 @@ +-- ######################## +-- ######## TABLES ######## +-- ######################## + +-- Registered deciders and the respectful events that these deciders can publish (decider can publish and/or source its own state from these event types only) +CREATE TABLE IF NOT EXISTS deciders +( + -- decider name/type + "decider" TEXT NOT NULL, + -- event name/type that this decider can publish + "event" TEXT NOT NULL, + PRIMARY KEY ("decider", "event") +); + +INSERT INTO deciders ("decider", "event") VALUES ('Restaurant', 'RestaurantCreated'); +INSERT INTO deciders ("decider", "event") VALUES ('Restaurant', 'RestaurantNotCreated'); +INSERT INTO deciders ("decider", "event") VALUES ('Restaurant', 'RestaurantMenuChanged'); +INSERT INTO deciders ("decider", "event") VALUES ('Restaurant', 'RestaurantMenuNotChanged'); +INSERT INTO deciders ("decider", "event") VALUES ('Restaurant', 'OrderPlaced'); +INSERT INTO deciders ("decider", "event") VALUES ('Restaurant', 'OrderNotPlaced'); +INSERT INTO deciders ("decider", "event") VALUES ('Order', 'OrderCreated'); +INSERT INTO deciders ("decider", "event") VALUES ('Order', 'OrderPrepared'); +INSERT INTO deciders ("decider", "event") VALUES ('Order', 'OrderNotCreated'); +INSERT INTO deciders ("decider", "event") VALUES ('Order', 'OrderNotPrepared'); + + +-- Events +CREATE TABLE IF NOT EXISTS events +( + -- event name/type. Part of a composite foreign key to `deciders` + "event" TEXT NOT NULL, + -- event ID. This value is used by the next event as it's `previous_id` value to guard against a Lost-EventModel problem / optimistic locking. + "event_id" UUID NOT NULL UNIQUE, + -- decider name/type. Part of a composite foreign key to `deciders` + "decider" TEXT NOT NULL, + -- business identifier for the decider + "decider_id" TEXT NOT NULL, + -- event data in JSON format + "data" JSONB NOT NULL, + -- command ID causing this event + "command_id" UUID NULL, + -- previous event uuid; null for first event; null does not trigger UNIQUE constraint; we defined a function `check_first_event_for_decider` + "previous_id" UUID UNIQUE, + -- indicator if the event stream for the `decider_id` is final + "final" BOOLEAN NOT NULL DEFAULT FALSE, + -- The timestamp of the event insertion. AUTOPOPULATESโ€”DO NOT INSERT + "created_at" TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL, + -- ordering sequence/offset for all events in all deciders. AUTOPOPULATESโ€”DO NOT INSERT + "offset" BIGSERIAL PRIMARY KEY, + FOREIGN KEY ("decider", "event") REFERENCES deciders ("decider", "event") +); + + +CREATE INDEX IF NOT EXISTS decider_index ON events ("decider_id", "offset"); + +-- ######################## +-- ##### SIDE EFFECTS ##### +-- ######################## + +-- Many things that can be done using triggers can also be implemented using the Postgres rule system. +-- What currently cannot be implemented by rules are some kinds of constraints. +-- It is possible, to place a qualified rule that rewrites a query to NOTHING if the value of a column does not appear in another table. +-- But then the data is silently thrown away, and that's not a good idea. +-- If checks for valid values are required, and in the case of an invalid value an error message should be generated, it must be done by a trigger for now. + +-- SIDE EFFECT (rule): immutable decider - ignore deleting already registered events +--CREATE OR REPLACE RULE ignore_delete_decider_events AS ON DELETE TO deciders +-- DO INSTEAD NOTHING; + +-- SIDE EFFECT (rule): immutable decider - ignore updating already registered events +--CREATE OR REPLACE RULE ignore_update_decider_events AS ON UPDATE TO deciders +-- DO INSTEAD NOTHING; + +-- SIDE EFFECT (rule): immutable events - ignore delete +CREATE OR REPLACE RULE ignore_delete_events AS ON DELETE TO events + DO INSTEAD NOTHING; + +-- SIDE EFFECT (rule): immutable events - ignore update +CREATE OR REPLACE RULE ignore_update_events AS ON UPDATE TO events + DO INSTEAD NOTHING; + + +-- SIDE EFFECT (trigger): Can only use null previousId for first event in an decider +CREATE OR REPLACE FUNCTION check_first_event_for_decider() RETURNS trigger AS +' + BEGIN + IF (NEW.previous_id IS NULL + AND EXISTS(SELECT 1 + FROM events + WHERE NEW.decider_id = decider_id + AND NEW.decider = decider)) + THEN + RAISE EXCEPTION ''previous_id can only be null for first decider event''; + END IF; + RETURN NEW; + END; +' + LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS t_check_first_event_for_decider ON events; +CREATE TRIGGER t_check_first_event_for_decider + BEFORE INSERT + ON events + FOR EACH ROW +EXECUTE FUNCTION check_first_event_for_decider(); + + +-- SIDE EFFECT (trigger): can only append events if the decider_id stream is not finalized already +CREATE OR REPLACE FUNCTION check_final_event_for_decider() RETURNS trigger AS +' + BEGIN + IF EXISTS(SELECT 1 + FROM events + WHERE NEW.decider_id = decider_id + AND "final" = TRUE + AND NEW.decider = decider) + THEN + RAISE EXCEPTION ''last event for this decider stream is already final. the stream is closed, you can not append events to it.''; + END IF; + RETURN NEW; + END; +' + LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS t_check_final_event_for_decider ON events; +CREATE TRIGGER t_check_final_event_for_decider + BEFORE INSERT + ON events + FOR EACH ROW +EXECUTE FUNCTION check_final_event_for_decider(); + + +-- SIDE EFFECT (trigger): previousId must be in the same decider as the event +CREATE OR REPLACE FUNCTION check_previous_id_in_same_decider() RETURNS trigger AS +' + BEGIN + IF (NEW.previous_id IS NOT NULL + AND NOT EXISTS(SELECT 1 + FROM events + WHERE NEW.previous_id = event_id + AND NEW.decider_id = decider_id + AND NEW.decider = decider)) + THEN + RAISE EXCEPTION ''previous_id must be in the same decider''; + END IF; + RETURN NEW; + END; +' + LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS t_check_previous_id_in_same_decider ON events; +CREATE TRIGGER t_check_previous_id_in_same_decider + BEFORE INSERT + ON events + FOR EACH ROW +EXECUTE FUNCTION check_previous_id_in_same_decider(); + diff --git a/src/application/mod.rs b/src/application/mod.rs new file mode 100644 index 0000000..712a76c --- /dev/null +++ b/src/application/mod.rs @@ -0,0 +1 @@ +pub mod order_restaurant_aggregate; diff --git a/src/application/order_restaurant_aggregate.rs b/src/application/order_restaurant_aggregate.rs new file mode 100644 index 0000000..5ce8888 --- /dev/null +++ b/src/application/order_restaurant_aggregate.rs @@ -0,0 +1,15 @@ +use crate::domain::order_decider::Order; +use crate::framework::application::event_sourced_aggregate::EventSourcedOrchestratingAggregate; + +use crate::domain::restaurant_decider::Restaurant; +use crate::domain::{Command, Event}; +use crate::infrastructure::order_restaurant_event_repository::OrderAndRestaurantEventRepository; + +/// A convenient type alias for the order and restaurant aggregate. +pub type OrderAndRestaurantAggregate<'a> = EventSourcedOrchestratingAggregate< + 'a, + Command, + (Option, Option), + Event, + OrderAndRestaurantEventRepository, +>; diff --git a/src/domain/api.rs b/src/domain/api.rs new file mode 100644 index 0000000..ed12d4b --- /dev/null +++ b/src/domain/api.rs @@ -0,0 +1,277 @@ +use pgrx::{PostgresEnum, PostgresType}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +// ######################################################## +// #################### Value Objects ##################### +// ######################################################## + +// The 'newtype' pattern is typical in functional programming. In Haskell, this pattern is supported via the 'newtype' declaration, which allows the programmer to define a new type identical to an existing one except for its name. This is useful for creating type-safe abstractions, enabling the programmer to enforce stronger type constraints on using specific values. +// Similarly, in Rust, the 'newtype' idiom brings compile-time guarantees that the correct value type is supplied. The 'newtype' is a struct that wraps a single value and provides a new type for that value. A 'newtype' is the same as the underlying type at runtime, so it will not introduce any performance overhead. +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct RestaurantId(pub Uuid); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct RestaurantName(pub String); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct OrderId(pub Uuid); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct Reason(pub String); + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct Money(pub u64); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct MenuId(pub Uuid); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct MenuItemId(pub Uuid); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct MenuItemName(pub String); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct OrderLineItemId(pub Uuid); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct OrderLineItemQuantity(pub u32); + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct MenuItem { + pub id: MenuItemId, + pub name: MenuItemName, + pub price: Money, +} + +#[derive(PostgresEnum, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub enum RestaurantMenuCuisine { + Italian, + Indian, + Chinese, + Japanese, + American, + Mexican, + French, + Thai, + Vietnamese, + Greek, + Korean, + Spanish, + Lebanese, + Turkish, + Ethiopian, + Moroccan, + Egyptian, + Brazilian, + Polish, + German, + British, + Irish, + Other, +} + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct RestaurantMenu { + pub menu_id: MenuId, + pub items: Vec, + pub cuisine: RestaurantMenuCuisine, +} + +#[derive(PostgresType, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct OrderLineItem { + pub id: OrderLineItemId, + pub quantity: OrderLineItemQuantity, + pub menu_item_id: MenuItemId, + pub name: MenuItemName, +} + +#[derive(PostgresEnum, Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub enum OrderStatus { + Created, + Prepared, + Cancelled, + Rejected, +} + +// ######################################################## +// ####################### COMMANDS ####################### +// ######################################################## + +// #### RESTAURANT #### +/// All possible command variants that could be sent to a restaurant +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +#[serde(tag = "type")] +pub enum RestaurantCommand { + CreateRestaurant(CreateRestaurant), + ChangeMenu(ChangeRestaurantMenu), + PlaceOrder(PlaceOrder), +} +/// Intent/Command to create a new restaurant +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct CreateRestaurant { + pub identifier: RestaurantId, + pub name: RestaurantName, + pub menu: RestaurantMenu, +} + +/// Intent/Command to change the menu of a restaurant +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct ChangeRestaurantMenu { + pub identifier: RestaurantId, + pub menu: RestaurantMenu, +} + +/// Intent/Command to place an order at a restaurant +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct PlaceOrder { + pub identifier: RestaurantId, + pub order_identifier: OrderId, + pub line_items: Vec, +} + +// #### ORDER #### + +/// All possible command variants that could be sent to an order +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +#[serde(tag = "type")] +pub enum OrderCommand { + Create(CreateOrder), + MarkAsPrepared(MarkOrderAsPrepared), +} + +/// Intent/Command to create a new order +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct CreateOrder { + pub identifier: OrderId, + pub restaurant_identifier: RestaurantId, + pub line_items: Vec, +} + +/// Intent/Command to mark an order as prepared +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct MarkOrderAsPrepared { + pub identifier: OrderId, +} + +// ######################################################## +// ######################## EVENTS ######################## +// ######################################################## + +// #### RESTAURANT #### + +/// All possible event variants that could be used to update a restaurant +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone)] +#[serde(tag = "type")] +pub enum RestaurantEvent { + Created(RestaurantCreated), + NotCreated(RestaurantNotCreated), + MenuChanged(RestaurantMenuChanged), + MenuNotChanged(RestaurantMenuNotChanged), + OrderPlaced(OrderPlaced), + OrderNotPlaced(OrderNotPlaced), +} + +/// Fact/Event that a restaurant was created +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct RestaurantCreated { + pub identifier: RestaurantId, + pub name: RestaurantName, + pub menu: RestaurantMenu, + pub r#final: bool, +} + +/// Fact/Event that a restaurant was not created (with reason) +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct RestaurantNotCreated { + pub identifier: RestaurantId, + pub name: RestaurantName, + pub menu: RestaurantMenu, + pub reason: Reason, + pub r#final: bool, +} + +/// Fact/Event that a restaurant's menu was changed +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct RestaurantMenuChanged { + pub identifier: RestaurantId, + pub menu: RestaurantMenu, + pub r#final: bool, +} + +/// Fact/Event that a restaurant's menu was not changed (with reason) +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct RestaurantMenuNotChanged { + pub identifier: RestaurantId, + pub menu: RestaurantMenu, + pub reason: Reason, + pub r#final: bool, +} + +/// Fact/Event that an order was placed +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct OrderPlaced { + pub identifier: RestaurantId, + pub order_identifier: OrderId, + pub line_items: Vec, + pub r#final: bool, +} + +/// Fact/Event that an order was not placed (with reason) +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct OrderNotPlaced { + pub identifier: RestaurantId, + pub order_identifier: OrderId, + pub line_items: Vec, + pub reason: Reason, + pub r#final: bool, +} + +// #### ORDER #### + +/// All possible event variants that could be used to update an order +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone)] +#[serde(tag = "type")] +pub enum OrderEvent { + Created(OrderCreated), + NotCreated(OrderNotCreated), + Prepared(OrderPrepared), + NotPrepared(OrderNotPrepared), +} + +/// Fact/Event that an order was created +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct OrderCreated { + pub identifier: OrderId, + pub restaurant_identifier: RestaurantId, + pub status: OrderStatus, + pub line_items: Vec, + pub r#final: bool, +} + +/// Fact/Event that an order was not created (with reason) +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct OrderNotCreated { + pub identifier: OrderId, + pub restaurant_identifier: RestaurantId, + pub line_items: Vec, + pub reason: Reason, + pub r#final: bool, +} + +/// Fact/Event that an order was prepared +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct OrderPrepared { + pub identifier: OrderId, + pub status: OrderStatus, + pub r#final: bool, +} + +/// Fact/Event that an order was not prepared (with reason) +#[derive(PostgresType, Serialize, Deserialize, Debug, PartialEq, Clone, Eq)] +pub struct OrderNotPrepared { + pub identifier: OrderId, + pub reason: Reason, + pub r#final: bool, +} diff --git a/src/domain/mod.rs b/src/domain/mod.rs new file mode 100644 index 0000000..f3fc54d --- /dev/null +++ b/src/domain/mod.rs @@ -0,0 +1,247 @@ +use crate::domain::api::{ + ChangeRestaurantMenu, CreateOrder, CreateRestaurant, MarkOrderAsPrepared, OrderCommand, + OrderNotCreated, OrderNotPlaced, OrderNotPrepared, PlaceOrder, RestaurantCommand, + RestaurantMenuNotChanged, RestaurantNotCreated, +}; +use crate::domain::order_decider::{order_decider, Order}; +use crate::domain::order_saga::order_saga; +use crate::domain::restaurant_decider::{restaurant_decider, Restaurant}; +use crate::domain::restaurant_saga::restaurant_saga; +use crate::framework::domain::api::{DeciderType, EventType, Identifier, IsFinal}; +use api::{ + OrderCreated, OrderEvent, OrderPlaced, OrderPrepared, RestaurantCreated, RestaurantEvent, + RestaurantMenuChanged, +}; +use fmodel_rust::decider::Decider; +use fmodel_rust::saga::Saga; +use fmodel_rust::Sum; +use pgrx::PostgresType; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +pub mod api; +pub mod order_decider; +pub mod order_saga; +pub mod order_view; +pub mod restaurant_decider; +pub mod restaurant_saga; +pub mod restaurant_view; + +/// A convenient type alias for the combined Decider +/// This decider is used to combine the Restaurant and Order deciders into a single decider that can handle both Restaurant and Order commands. +pub type OrderAndRestaurantDecider<'a> = + Decider<'a, Command, (Option, Option), Event>; + +/// A convenient type alias for the combined Saga +/// This saga is used to combine the Restaurant and Order choreography sagas into a single orchestrating saga that can handle both Restaurant and Order events, and produce Restaurant and Order commands as a result. +pub type OrderAndRestaurantSaga<'a> = Saga<'a, Event, Command>; + +/// Combined Decider, combining the Restaurant and Order deciders into a single decider that can handle both Restaurant and Order commands. +pub fn order_restaurant_decider<'a>() -> OrderAndRestaurantDecider<'a> { + restaurant_decider() + .combine(order_decider()) + .map_command(&command_to_sum) + .map_event(&event_to_sum, &sum_to_event) +} + +/// Combined Saga, combining the Restaurant and Order choreography sagas into a single orchestrating saga that can handle both Restaurant and Order events, and produce Restaurant and Order commands as a result. +pub fn order_restaurant_saga<'a>() -> OrderAndRestaurantSaga<'a> { + restaurant_saga() + .combine(order_saga()) + .map_action_result(&event_to_sum2) + .map_action(&sum_to_command) +} + +/// All possible commands in the order&restaurant domains +#[derive(PostgresType, Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(tag = "type")] +pub enum Command { + CreateRestaurant(CreateRestaurant), + ChangeRestaurantMenu(ChangeRestaurantMenu), + PlaceOrder(PlaceOrder), + CreateOrder(CreateOrder), + MarkOrderAsPrepared(MarkOrderAsPrepared), +} + +/// Implement the Identifier trait for the Command enum +impl Identifier for Command { + fn identifier(&self) -> Uuid { + match self { + Command::CreateRestaurant(cmd) => cmd.identifier.0, + Command::ChangeRestaurantMenu(cmd) => cmd.identifier.0, + Command::PlaceOrder(cmd) => cmd.identifier.0, + Command::CreateOrder(cmd) => cmd.identifier.0, + Command::MarkOrderAsPrepared(cmd) => cmd.identifier.0, + } + } +} + +/// All possible events in the order&restaurant domains +#[derive(PostgresType, Serialize, Deserialize, Debug, Eq, PartialEq, Clone)] +#[serde(tag = "type")] +pub enum Event { + RestaurantCreated(RestaurantCreated), + RestaurantNotCreated(RestaurantNotCreated), + RestaurantMenuChanged(RestaurantMenuChanged), + RestaurantMenuNotChanged(RestaurantMenuNotChanged), + OrderPlaced(OrderPlaced), + OrderNotPlaced(OrderNotPlaced), + OrderCreated(OrderCreated), + OrderNotCreated(OrderNotCreated), + OrderPrepared(OrderPrepared), + OrderNotPrepared(OrderNotPrepared), +} + +/// Implement the Identifier trait for the Event enum +impl Identifier for Event { + fn identifier(&self) -> Uuid { + match self { + Event::RestaurantCreated(evt) => evt.identifier.0, + Event::RestaurantMenuChanged(evt) => evt.identifier.0, + Event::OrderPlaced(evt) => evt.identifier.0, + Event::OrderCreated(evt) => evt.identifier.0, + Event::OrderPrepared(evt) => evt.identifier.0, + Event::RestaurantNotCreated(evt) => evt.identifier.0, + Event::RestaurantMenuNotChanged(evt) => evt.identifier.0, + Event::OrderNotPlaced(evt) => evt.identifier.0, + Event::OrderNotCreated(evt) => evt.identifier.0, + Event::OrderNotPrepared(evt) => evt.identifier.0, + } + } +} + +/// Implement the EventType trait for the Event enum +impl EventType for Event { + fn event_type(&self) -> String { + match self { + Event::RestaurantCreated(_) => "RestaurantCreated".to_string(), + Event::RestaurantMenuChanged(_) => "RestaurantMenuChanged".to_string(), + Event::OrderPlaced(_) => "OrderPlaced".to_string(), + Event::OrderCreated(_) => "OrderCreated".to_string(), + Event::OrderPrepared(_) => "OrderPrepared".to_string(), + Event::RestaurantNotCreated(_) => "RestaurantNotCreated".to_string(), + Event::RestaurantMenuNotChanged(_) => "RestaurantMenuNotChanged".to_string(), + Event::OrderNotPlaced(_) => "OrderNotPlaced".to_string(), + Event::OrderNotCreated(_) => "OrderNotCreated".to_string(), + Event::OrderNotPrepared(_) => "OrderNotPrepared".to_string(), + } + } +} + +/// Implement the IsFinal trait for the Event enum +impl IsFinal for Event { + fn is_final(&self) -> bool { + match self { + Event::RestaurantCreated(evt) => evt.r#final, + Event::RestaurantMenuChanged(evt) => evt.r#final, + Event::OrderPlaced(evt) => evt.r#final, + Event::OrderCreated(evt) => evt.r#final, + Event::OrderPrepared(evt) => evt.r#final, + Event::RestaurantNotCreated(evt) => evt.r#final, + Event::RestaurantMenuNotChanged(evt) => evt.r#final, + Event::OrderNotPlaced(evt) => evt.r#final, + Event::OrderNotCreated(evt) => evt.r#final, + Event::OrderNotPrepared(evt) => evt.r#final, + } + } +} + +/// Implement the DeciderType trait for the Event enum +impl DeciderType for Event { + fn decider_type(&self) -> String { + match self { + Event::RestaurantCreated(_) => "Restaurant".to_string(), + Event::RestaurantMenuChanged(_) => "Restaurant".to_string(), + Event::OrderPlaced(_) => "Restaurant".to_string(), + Event::RestaurantNotCreated(_) => "Restaurant".to_string(), + Event::RestaurantMenuNotChanged(_) => "Restaurant".to_string(), + Event::OrderNotPlaced(_) => "Restaurant".to_string(), + Event::OrderCreated(_) => "Order".to_string(), + Event::OrderPrepared(_) => "Order".to_string(), + Event::OrderNotCreated(_) => "Order".to_string(), + Event::OrderNotPrepared(_) => "Order".to_string(), + } + } +} + +/// Mapper functions to convert between the `FModel` Sum type and the more appropriate domain specific Command/API type +/// This is necessary because the `FModel` Sum type is used to combine the Restaurant and Order deciders into a single decider that can handle both Restaurant and Order commands. +/// We don't want to expose the `FModel` Sum type to the API, so we need to convert between the `FModel` Sum type and the more appropriate Command/API type. +pub fn command_to_sum(command: &Command) -> Sum { + match command { + Command::CreateRestaurant(c) => { + Sum::First(RestaurantCommand::CreateRestaurant(c.to_owned())) + } + Command::ChangeRestaurantMenu(c) => Sum::First(RestaurantCommand::ChangeMenu(c.to_owned())), + Command::PlaceOrder(c) => Sum::First(RestaurantCommand::PlaceOrder(c.to_owned())), + Command::CreateOrder(c) => Sum::Second(OrderCommand::Create(c.to_owned())), + Command::MarkOrderAsPrepared(c) => Sum::Second(OrderCommand::MarkAsPrepared(c.to_owned())), + } +} + +pub fn event_to_sum(event: &Event) -> Sum { + match event { + Event::RestaurantCreated(e) => Sum::First(RestaurantEvent::Created(e.to_owned())), + Event::RestaurantNotCreated(e) => Sum::First(RestaurantEvent::NotCreated(e.to_owned())), + Event::RestaurantMenuChanged(e) => Sum::First(RestaurantEvent::MenuChanged(e.to_owned())), + Event::RestaurantMenuNotChanged(e) => { + Sum::First(RestaurantEvent::MenuNotChanged(e.to_owned())) + } + Event::OrderPlaced(e) => Sum::First(RestaurantEvent::OrderPlaced(e.to_owned())), + Event::OrderNotPlaced(e) => Sum::First(RestaurantEvent::OrderNotPlaced(e.to_owned())), + Event::OrderCreated(e) => Sum::Second(OrderEvent::Created(e.to_owned())), + Event::OrderNotCreated(e) => Sum::Second(OrderEvent::NotCreated(e.to_owned())), + Event::OrderPrepared(e) => Sum::Second(OrderEvent::Prepared(e.to_owned())), + Event::OrderNotPrepared(e) => Sum::Second(OrderEvent::NotPrepared(e.to_owned())), + } +} + +pub fn event_to_sum2(event: &Event) -> Sum { + match event { + Event::RestaurantCreated(e) => Sum::Second(RestaurantEvent::Created(e.to_owned())), + Event::RestaurantNotCreated(e) => Sum::Second(RestaurantEvent::NotCreated(e.to_owned())), + Event::RestaurantMenuChanged(e) => Sum::Second(RestaurantEvent::MenuChanged(e.to_owned())), + Event::RestaurantMenuNotChanged(e) => { + Sum::Second(RestaurantEvent::MenuNotChanged(e.to_owned())) + } + Event::OrderPlaced(e) => Sum::Second(RestaurantEvent::OrderPlaced(e.to_owned())), + Event::OrderNotPlaced(e) => Sum::Second(RestaurantEvent::OrderNotPlaced(e.to_owned())), + Event::OrderCreated(e) => Sum::First(OrderEvent::Created(e.to_owned())), + Event::OrderNotCreated(e) => Sum::First(OrderEvent::NotCreated(e.to_owned())), + Event::OrderPrepared(e) => Sum::First(OrderEvent::Prepared(e.to_owned())), + Event::OrderNotPrepared(e) => Sum::First(OrderEvent::NotPrepared(e.to_owned())), + } +} + +pub fn sum_to_command(command: &Sum) -> Command { + match command { + Sum::Second(c) => match c { + RestaurantCommand::CreateRestaurant(c) => Command::CreateRestaurant(c.to_owned()), + RestaurantCommand::ChangeMenu(c) => Command::ChangeRestaurantMenu(c.to_owned()), + RestaurantCommand::PlaceOrder(c) => Command::PlaceOrder(c.to_owned()), + }, + Sum::First(c) => match c { + OrderCommand::Create(c) => Command::CreateOrder(c.to_owned()), + OrderCommand::MarkAsPrepared(c) => Command::MarkOrderAsPrepared(c.to_owned()), + }, + } +} + +pub fn sum_to_event(event: &Sum) -> Event { + match event { + Sum::First(e) => match e { + RestaurantEvent::Created(e) => Event::RestaurantCreated(e.to_owned()), + RestaurantEvent::NotCreated(e) => Event::RestaurantNotCreated(e.to_owned()), + RestaurantEvent::MenuChanged(e) => Event::RestaurantMenuChanged(e.to_owned()), + RestaurantEvent::MenuNotChanged(e) => Event::RestaurantMenuNotChanged(e.to_owned()), + RestaurantEvent::OrderPlaced(e) => Event::OrderPlaced(e.to_owned()), + RestaurantEvent::OrderNotPlaced(e) => Event::OrderNotPlaced(e.to_owned()), + }, + Sum::Second(e) => match e { + OrderEvent::Created(e) => Event::OrderCreated(e.to_owned()), + OrderEvent::NotCreated(e) => Event::OrderNotCreated(e.to_owned()), + OrderEvent::Prepared(e) => Event::OrderPrepared(e.to_owned()), + OrderEvent::NotPrepared(e) => Event::OrderNotPrepared(e.to_owned()), + }, + } +} diff --git a/src/domain/order_decider.rs b/src/domain/order_decider.rs new file mode 100644 index 0000000..b3c96d0 --- /dev/null +++ b/src/domain/order_decider.rs @@ -0,0 +1,88 @@ +use fmodel_rust::decider::Decider; + +use crate::domain::api::{ + OrderCommand, OrderCreated, OrderEvent, OrderId, OrderLineItem, OrderNotCreated, + OrderNotPrepared, OrderPrepared, OrderStatus, Reason, RestaurantId, +}; + +/// The state of the Order is represented by this struct. It belongs to the Domain layer. +#[derive(Clone, PartialEq, Debug)] +pub struct Order { + pub identifier: OrderId, + pub restaurant_identifier: RestaurantId, + pub status: OrderStatus, + pub line_items: Vec, +} + +/// A convenient type alias for the Order decider +pub type OrderDecider<'a> = Decider<'a, OrderCommand, Option, OrderEvent>; + +/// Decider is a datatype/struct that represents the main decision-making algorithm. It belongs to the Domain layer. +pub fn order_decider<'a>() -> OrderDecider<'a> { + Decider { + // Decide new events based on the current state and the command + // Exhaustive pattern matching on the command + decide: Box::new(|command, state| match command { + OrderCommand::Create(command) => { + if state.is_some() { + vec![OrderEvent::NotCreated(OrderNotCreated { + identifier: command.identifier.to_owned(), + restaurant_identifier: command.restaurant_identifier.to_owned(), + line_items: command.line_items.to_owned(), + reason: Reason("Order already exists".to_string()), + r#final: false, + })] + } else { + vec![OrderEvent::Created(OrderCreated { + identifier: command.identifier.to_owned(), + restaurant_identifier: command.restaurant_identifier.to_owned(), + status: OrderStatus::Created, + line_items: command.line_items.to_owned(), + r#final: false, + })] + } + } + OrderCommand::MarkAsPrepared(command) => { + if state + .clone() + .is_some_and(|s| OrderStatus::Created == s.status) + { + vec![OrderEvent::Prepared(OrderPrepared { + identifier: command.identifier.to_owned(), + status: OrderStatus::Prepared, + r#final: true, + })] + } else { + vec![OrderEvent::NotPrepared(OrderNotPrepared { + identifier: command.identifier.to_owned(), + reason: Reason("Order in the wrong status previously".to_string()), + r#final: false, + })] + } + } + }), + // Evolve the state based on the current state and the event + // Exhaustive pattern matching on the event + evolve: Box::new(|state, event| match event { + OrderEvent::Created(event) => Some(Order { + identifier: event.identifier.to_owned(), + restaurant_identifier: event.restaurant_identifier.to_owned(), + status: event.status.to_owned(), + line_items: event.line_items.to_owned(), + }), + // On error event we choose NOT TO change the state of the Order, for example. + OrderEvent::NotCreated(..) => state.clone(), + OrderEvent::Prepared(event) => state.clone().map(|s| Order { + identifier: event.identifier.to_owned(), + restaurant_identifier: s.restaurant_identifier, + status: event.status.to_owned(), + line_items: s.line_items, + }), + // On error event we choose NOT TO change the state of the Order, for example. + OrderEvent::NotPrepared(..) => state.clone(), + }), + + // The initial state of the decider + initial_state: Box::new(|| None), + } +} diff --git a/src/domain/order_saga.rs b/src/domain/order_saga.rs new file mode 100644 index 0000000..3bacc2e --- /dev/null +++ b/src/domain/order_saga.rs @@ -0,0 +1,37 @@ +use fmodel_rust::saga::Saga; + +use crate::domain::api::{CreateOrder, OrderCommand, RestaurantEvent}; + +/// A convenient type alias for the Order choreography saga +type OrderSaga<'a> = Saga<'a, RestaurantEvent, OrderCommand>; + +/// The Order choreography saga - represents the central point of control deciding what to execute next. +/// It is a function that takes an event and returns a list of commands. +pub fn order_saga<'a>() -> OrderSaga<'a> { + Saga { + react: Box::new(|event| match event { + RestaurantEvent::OrderPlaced(event) => { + vec![OrderCommand::Create(CreateOrder { + identifier: event.order_identifier.to_owned(), + restaurant_identifier: event.identifier.to_owned(), + line_items: event.line_items.to_owned(), + })] + } + RestaurantEvent::OrderNotPlaced(..) => { + vec![] + } + RestaurantEvent::NotCreated(..) => { + vec![] + } + RestaurantEvent::MenuNotChanged(..) => { + vec![] + } + RestaurantEvent::Created(..) => { + vec![] + } + RestaurantEvent::MenuChanged(..) => { + vec![] + } + }), + } +} diff --git a/src/domain/order_view.rs b/src/domain/order_view.rs new file mode 100644 index 0000000..02d1726 --- /dev/null +++ b/src/domain/order_view.rs @@ -0,0 +1,46 @@ +use fmodel_rust::view::View; +use serde::{Deserialize, Serialize}; + +use crate::domain::api::{OrderEvent, OrderId, OrderLineItem, OrderStatus, RestaurantId}; + +/// The state of the Order is represented by this struct. It belongs to the Domain layer. +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +pub struct OrderViewState { + pub identifier: OrderId, + pub restaurant_identifier: RestaurantId, + pub status: OrderStatus, + pub line_items: Vec, +} + +/// A convenient type alias for the Order view +type OrderView<'a> = View<'a, Option, OrderEvent>; + +/// View represents the event handling algorithm. It belongs to the Domain layer. +pub fn order_view<'a>() -> OrderView<'a> { + View { + // Evolve the state based on the current state and the event + // Exhaustive pattern matching on the event + evolve: Box::new(|state, event| match event { + OrderEvent::Created(event) => Some(OrderViewState { + identifier: event.identifier.to_owned(), + restaurant_identifier: event.restaurant_identifier.to_owned(), + status: event.status.to_owned(), + line_items: event.line_items.to_owned(), + }), + // On error event we choose NOT TO change the state of the Order, for example. + OrderEvent::NotCreated(..) => state.clone(), + + OrderEvent::Prepared(event) => state.clone().map(|s| OrderViewState { + identifier: event.identifier.to_owned(), + restaurant_identifier: s.restaurant_identifier, + status: event.status.to_owned(), + line_items: s.line_items, + }), + // On error event we choose NOT TO change the state of the Order, for example. + OrderEvent::NotPrepared(..) => state.clone(), + }), + + // The initial state of the decider + initial_state: Box::new(|| None), + } +} diff --git a/src/domain/restaurant_decider.rs b/src/domain/restaurant_decider.rs new file mode 100644 index 0000000..391fe13 --- /dev/null +++ b/src/domain/restaurant_decider.rs @@ -0,0 +1,111 @@ +use fmodel_rust::decider::Decider; + +use crate::domain::api::{ + OrderNotPlaced, OrderPlaced, Reason, RestaurantCommand, RestaurantCreated, RestaurantEvent, + RestaurantId, RestaurantMenu, RestaurantMenuChanged, RestaurantMenuNotChanged, RestaurantName, + RestaurantNotCreated, +}; + +/// The state of the Restaurant is represented by this struct. It belongs to the Domain layer. +#[derive(Clone, PartialEq, Debug)] +pub struct Restaurant { + identifier: RestaurantId, + name: RestaurantName, + menu: RestaurantMenu, +} + +/// A convenient type alias for the Restaurant decider +pub type RestaurantDecider<'a> = + Decider<'a, RestaurantCommand, Option, RestaurantEvent>; + +/// Decider is a datatype/struct that represents the main decision-making algorithm. It belongs to the Domain layer. +pub fn restaurant_decider<'a>() -> RestaurantDecider<'a> { + Decider { + // Decide new events based on the current state and the command + // Exhaustive pattern matching on the command + decide: Box::new(|command, state| match command { + RestaurantCommand::CreateRestaurant(command) => { + if state.is_some() { + vec![RestaurantEvent::NotCreated(RestaurantNotCreated { + identifier: command.identifier.to_owned(), + name: command.name.to_owned(), + menu: command.menu.to_owned(), + reason: Reason("Restaurant already exists".to_string()), + r#final: false, + })] + } else { + vec![RestaurantEvent::Created(RestaurantCreated { + identifier: command.identifier.to_owned(), + name: command.name.to_owned(), + menu: command.menu.to_owned(), + r#final: false, + })] + } + } + RestaurantCommand::ChangeMenu(command) => { + if state.is_some() { + vec![RestaurantEvent::MenuChanged(RestaurantMenuChanged { + identifier: command.identifier.to_owned(), + menu: command.menu.to_owned(), + r#final: false, + })] + } else { + vec![RestaurantEvent::MenuNotChanged(RestaurantMenuNotChanged { + identifier: command.identifier.to_owned(), + menu: command.menu.to_owned(), + reason: Reason("Restaurant does not exist".to_string()), + r#final: false, + })] + } + } + RestaurantCommand::PlaceOrder(command) => { + if state.is_some() { + vec![RestaurantEvent::OrderPlaced(OrderPlaced { + identifier: command.identifier.to_owned(), + order_identifier: command.order_identifier.to_owned(), + line_items: command.line_items.to_owned(), + r#final: false, + })] + } else { + vec![RestaurantEvent::OrderNotPlaced(OrderNotPlaced { + identifier: command.identifier.to_owned(), + order_identifier: command.order_identifier.to_owned(), + line_items: command.line_items.to_owned(), + reason: Reason("Restaurant does not exist".to_string()), + r#final: false, + })] + } + } + }), + // Evolve the state based on the current state and the event + // Exhaustive pattern matching on the event + evolve: Box::new(|state, event| match event { + RestaurantEvent::Created(event) => Some(Restaurant { + identifier: event.identifier.to_owned(), + name: event.name.to_owned(), + menu: event.menu.to_owned(), + }), + // On error event we choose NOT TO change the state of the Restaurant, for example. + RestaurantEvent::NotCreated(..) => state.clone(), + + RestaurantEvent::MenuChanged(event) => state.clone().map(|s| Restaurant { + identifier: event.identifier.to_owned(), + name: s.name, + menu: event.menu.to_owned(), + }), + // On error event we choose NOT TO change the state of the Restaurant, for example. + RestaurantEvent::MenuNotChanged(..) => state.clone(), + + RestaurantEvent::OrderPlaced(event) => state.clone().map(|s| Restaurant { + identifier: event.identifier.to_owned(), + name: s.name, + menu: s.menu, + }), + // On error event we choose NOT TO change the state of the Restaurant, for example. + RestaurantEvent::OrderNotPlaced(..) => state.clone(), + }), + + // The initial state of the decider + initial_state: Box::new(|| None), + } +} diff --git a/src/domain/restaurant_saga.rs b/src/domain/restaurant_saga.rs new file mode 100644 index 0000000..e1c42db --- /dev/null +++ b/src/domain/restaurant_saga.rs @@ -0,0 +1,28 @@ +use fmodel_rust::saga::Saga; + +use crate::domain::api::{OrderEvent, RestaurantCommand}; + +/// A convenient type alias for the Restaurant choreography saga +type RestaurantSaga<'a> = Saga<'a, OrderEvent, RestaurantCommand>; + +/// The Restaurant choreography saga - represents the central point of control deciding what to execute next. +/// It is a function that takes an event and returns a list of commands. +/// This Saga is not doing much ;) +pub fn restaurant_saga<'a>() -> RestaurantSaga<'a> { + Saga { + react: Box::new(|_event| match _event { + OrderEvent::Created(..) => { + vec![] + } + OrderEvent::NotCreated(..) => { + vec![] + } + OrderEvent::Prepared(..) => { + vec![] + } + OrderEvent::NotPrepared(..) => { + vec![] + } + }), + } +} diff --git a/src/domain/restaurant_view.rs b/src/domain/restaurant_view.rs new file mode 100644 index 0000000..b43682c --- /dev/null +++ b/src/domain/restaurant_view.rs @@ -0,0 +1,51 @@ +use fmodel_rust::view::View; +use serde::{Deserialize, Serialize}; + +use crate::domain::api::{RestaurantEvent, RestaurantId, RestaurantMenu, RestaurantName}; + +/// The state of the Restaurant View is represented by this struct. It belongs to the Domain layer. +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +pub struct RestaurantViewState { + pub identifier: RestaurantId, + pub name: RestaurantName, + pub menu: RestaurantMenu, +} + +/// A convenient type alias for the Restaurant view +type RestaurantView<'a> = View<'a, Option, RestaurantEvent>; + +/// View represents the event handling algorithm. It belongs to the Domain layer. +pub fn restaurant_view<'a>() -> RestaurantView<'a> { + View { + // Evolve the state based on the current state and the event + // Exhaustive pattern matching on the event + evolve: Box::new(|state, event| match event { + RestaurantEvent::Created(event) => Some(RestaurantViewState { + identifier: event.identifier.to_owned(), + name: event.name.to_owned(), + menu: event.menu.to_owned(), + }), + // On error event we choose NOT TO change the state of the RestaurantView, for example. + RestaurantEvent::NotCreated(..) => state.clone(), + + RestaurantEvent::MenuChanged(event) => state.clone().map(|s| RestaurantViewState { + identifier: event.identifier.to_owned(), + name: s.name, + menu: event.menu.to_owned(), + }), + // On error event we choose NOT TO change the state of the RestaurantView, for example. + RestaurantEvent::MenuNotChanged(..) => state.clone(), + + RestaurantEvent::OrderPlaced(event) => state.clone().map(|s| RestaurantViewState { + identifier: event.identifier.to_owned(), + name: s.name, + menu: s.menu, + }), + // On error event we choose NOT TO change the state of the RestaurantView, for example. + RestaurantEvent::OrderNotPlaced(..) => state.clone(), + }), + + // The initial state of the decider + initial_state: Box::new(|| None), + } +} diff --git a/src/framework/application/event_sourced_aggregate.rs b/src/framework/application/event_sourced_aggregate.rs new file mode 100644 index 0000000..bddf95f --- /dev/null +++ b/src/framework/application/event_sourced_aggregate.rs @@ -0,0 +1,228 @@ +// ################################################################### +// ###################### Regular Aggregate ########################## +// ################################################################### + +use crate::framework::domain::api::{DeciderType, EventType, Identifier, IsFinal}; +use crate::framework::infrastructure::errors::ErrorMessage; +use crate::framework::infrastructure::event_repository::{ + EventOrchestratingRepository, EventRepository, +}; +use fmodel_rust::decider::{Decider, EventComputation}; +use fmodel_rust::saga::Saga; +use serde::de::DeserializeOwned; +use serde::Serialize; +use std::fmt::Debug; +use std::marker::PhantomData; +use uuid::Uuid; + +/// Event sourced aggregate is composed of a repository and a decider. +/// The repository is responsible for fetching and saving events, and it is `sync`, not `async`. +#[allow(dead_code)] +pub struct EventSourcedAggregate +where + Repository: EventRepository, + Decider: EventComputation, + C: Identifier, + E: EventType + Identifier + IsFinal + DeciderType + DeserializeOwned + Serialize, +{ + repository: Repository, + decider: Decider, + _marker: PhantomData<(C, S, E)>, +} + +/// Implementation of the event computation for the event sourced aggregate. +impl EventComputation + for EventSourcedAggregate +where + Repository: EventRepository, + Decider: EventComputation, + C: Identifier, + E: EventType + Identifier + IsFinal + DeciderType + DeserializeOwned + Serialize, +{ + /// Computes new events based on the current events and the command. + fn compute_new_events(&self, current_events: &[E], command: &C) -> Vec { + self.decider.compute_new_events(current_events, command) + } +} + +impl EventSourcedAggregate +where + Repository: EventRepository, + Decider: EventComputation, + C: Identifier, + E: EventType + Identifier + IsFinal + DeciderType + DeserializeOwned + Serialize, +{ + /// Creates a new event sourced aggregate. + #[allow(dead_code)] + pub fn new(repository: Repository, decider: Decider) -> Self { + EventSourcedAggregate { + repository, + decider, + _marker: PhantomData, + } + } + /// Handles the command and returns the new events. + #[allow(dead_code)] + pub fn handle(&self, command: &C) -> Result, ErrorMessage> { + let events: Vec<(E, Uuid)> = self.repository.fetch_events(command)?; + let mut version: Option = None; + let mut current_events: Vec = vec![]; + for (event, ver) in events { + version = Some(ver); + current_events.push(event); + } + let new_events = self.decider.compute_new_events(¤t_events, command); + self.repository.save(&new_events, &version) + } +} + +// ################################################################### +// ################### Orchestrating Aggregate ####################### +// ################################################################### + +/// Event sourced orchestrating aggregate is composed of a repository, a decider, and a saga. +/// The repository is responsible for fetching and saving events, and it is `sync`, not `async`. +pub struct EventSourcedOrchestratingAggregate<'a, C, S, E, Repository> +where + Repository: EventOrchestratingRepository, + C: Identifier, + E: Clone + + EventType + + Identifier + + IsFinal + + DeciderType + + DeserializeOwned + + Serialize + + Debug, +{ + repository: Repository, + decider: Decider<'a, C, S, E>, + saga: Saga<'a, E, C>, + _marker: PhantomData<(C, S, E)>, +} + +/// Implementation of the event computation for the event sourced orchestrating aggregate. +impl<'a, C, S, E, Repository> EventComputation + for EventSourcedOrchestratingAggregate<'a, C, S, E, Repository> +where + Repository: EventOrchestratingRepository, + C: Identifier, + E: Clone + + EventType + + Identifier + + IsFinal + + DeciderType + + DeserializeOwned + + Serialize + + Debug, +{ + fn compute_new_events(&self, current_events: &[E], command: &C) -> Vec { + let current_state: S = current_events + .iter() + .fold((self.decider.initial_state)(), |state, event| { + (self.decider.evolve)(&state, event) + }); + + // Initial resulting events from the decider's decision. + let initial_events = (self.decider.decide)(command, ¤t_state); + + // Commands to process derived from initial resulting events. + let commands_to_process: Vec = initial_events + .iter() + .flat_map(|event| (self.saga.react)(event)) + .collect(); + + // Collect all events including recursively computed new events. + let mut all_events = initial_events.clone(); // Start with initial events. + + for command in commands_to_process.iter() { + let previous_events = [ + self.repository + .fetch_events(command) + .unwrap_or_default() + .iter() + .map(|(e, _)| e.clone()) + .collect::>(), + initial_events.clone(), + ] + .concat(); + + // Recursively compute new events and extend the accumulated events list. + let new_events = self.compute_new_events(&previous_events, command); + all_events.extend(new_events); + } + + all_events + } +} + +impl<'a, C, S, E, Repository> EventSourcedOrchestratingAggregate<'a, C, S, E, Repository> +where + Repository: EventOrchestratingRepository, + C: Identifier, + E: Clone + + EventType + + Identifier + + IsFinal + + DeciderType + + DeserializeOwned + + Serialize + + Debug, +{ + /// Creates a new event sourced orchestrating aggregate. + pub fn new( + repository: Repository, + decider: Decider<'a, C, S, E>, + saga: Saga<'a, E, C>, + ) -> Self { + EventSourcedOrchestratingAggregate { + repository, + decider, + saga, + _marker: PhantomData, + } + } + /// Handles the command and returns the new events that are persisted. + pub fn handle(&self, command: &C) -> Result, ErrorMessage> { + let events: Vec = self + .repository + .fetch_events(command)? + .into_iter() + .map(|(e, _)| e) + .collect(); + let new_events = self.compute_new_events(&events, command); + self.repository.save(&new_events) + } + + /// Handles the list of commands and returns the new events that are persisted. + /// This method is useful for processing multiple commands in a single transaction. + /// Effects/Events of the previous commands are visible to the subsequent commands. + pub fn handle_all(&self, commands: &[C]) -> Result, ErrorMessage> { + let mut all_new_events: Vec = Vec::new(); + + for command in commands { + // Fetch events for the current command + let fetched_events: Vec = self + .repository + .fetch_events(command)? + .into_iter() + .map(|(e, _)| e) + .collect(); + + // Combine all previous new events with fetched events for the current command + let combined_events: Vec = fetched_events + .into_iter() + .chain(all_new_events.iter().cloned()) + .collect(); + + // Compute new events based on the combined events and the current command + let new_events = self.compute_new_events(&combined_events, command); + + // Accumulate all new events + all_new_events.extend(new_events); + } + + // Save all new events at the end + self.repository.save(&all_new_events) + } +} diff --git a/src/framework/application/mod.rs b/src/framework/application/mod.rs new file mode 100644 index 0000000..aec0f7b --- /dev/null +++ b/src/framework/application/mod.rs @@ -0,0 +1 @@ +pub mod event_sourced_aggregate; diff --git a/src/framework/domain/api.rs b/src/framework/domain/api.rs new file mode 100644 index 0000000..2ca0915 --- /dev/null +++ b/src/framework/domain/api.rs @@ -0,0 +1,21 @@ +use uuid::Uuid; + +/// A trait for identifying messages/events/commands +pub trait Identifier { + fn identifier(&self) -> Uuid; +} + +/// A trait for identifying the type/name of an event +pub trait EventType { + fn event_type(&self) -> String; +} + +/// A trait for identifying if an event is final +pub trait IsFinal { + fn is_final(&self) -> bool; +} + +/// A trait for identifying the type/name of a decider in the event. +pub trait DeciderType { + fn decider_type(&self) -> String; +} diff --git a/src/framework/domain/mod.rs b/src/framework/domain/mod.rs new file mode 100644 index 0000000..e5fdf85 --- /dev/null +++ b/src/framework/domain/mod.rs @@ -0,0 +1 @@ +pub mod api; diff --git a/src/framework/infrastructure/errors.rs b/src/framework/infrastructure/errors.rs new file mode 100644 index 0000000..e4a1d0f --- /dev/null +++ b/src/framework/infrastructure/errors.rs @@ -0,0 +1,26 @@ +use serde::{Deserialize, Serialize}; +use std::error::Error; +use std::fmt; + +/// Error message to be returned to the client +#[derive(Serialize, Deserialize)] +pub struct ErrorMessage { + pub message: String, +} + +/// Implement Display for ErrorMessage +impl fmt::Display for ErrorMessage { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.message) + } +} + +/// Implement Debug for ErrorMessage +impl fmt::Debug for ErrorMessage { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "ErrorMessage: {}", self.message) + } +} + +/// Implement Error for ErrorMessage +impl Error for ErrorMessage {} diff --git a/src/framework/infrastructure/event_repository.rs b/src/framework/infrastructure/event_repository.rs new file mode 100644 index 0000000..89bd828 --- /dev/null +++ b/src/framework/infrastructure/event_repository.rs @@ -0,0 +1,322 @@ +use crate::framework::domain::api::{DeciderType, EventType, Identifier, IsFinal}; +use crate::framework::infrastructure::errors::ErrorMessage; +use pgrx::{IntoDatum, JsonB, PgBuiltInOids, Spi, Uuid}; +use serde::de::DeserializeOwned; +use serde::Serialize; +use std::fmt::Debug; +use uuid::Uuid as UUID; + +/// Converts a `JsonB` to an event payload type. +fn to_event(jsonb: JsonB) -> Result { + let value = jsonb.0.clone(); + serde_json::from_value(value).map_err(|err| ErrorMessage { + message: "Failed to deserialize event: ".to_string() + &err.to_string(), + }) +} +/// A trait for event repositories. +pub trait EventRepository +where + C: Identifier, + E: Identifier + EventType + IsFinal + DeciderType + DeserializeOwned + Serialize, +{ + /// Fetches current events, based on the command. + fn fetch_events(&self, command: &C) -> Result, ErrorMessage> { + let query = "SELECT * FROM events WHERE decider_id = $1 ORDER BY events.offset"; + Spi::connect(|client| { + let mut results = Vec::new(); + let tup_table = client + .select( + query, + None, + Some(vec![( + PgBuiltInOids::TEXTOID.oid(), + command.identifier().to_string().into_datum(), + )]), + ) + .map_err(|err| ErrorMessage { + message: "Failed to fetch events: ".to_string() + &err.to_string(), + })?; + for row in tup_table { + let data = row["data"].value::().map_err(|err| ErrorMessage { + message: "Failed to fetch event data/payload (map `data` to `JsonB`): ".to_string() + &err.to_string(), + })?.ok_or(ErrorMessage { + message: "Failed to fetch event data/payload (map `data` to `JsonB`): No data/payload found".to_string(), + })?; + let event_id = row["event_id"] + .value::() + .map_err(|err| ErrorMessage { + message: "Failed to fetch event id (map `event_id` to `Uuid`): " + .to_string() + + &err.to_string(), + })? + .ok_or(ErrorMessage { + message: + "Failed to fetch event id (map `data` to `JsonB`): No event id found" + .to_string(), + })?; + + results.push((to_event(data)?, UUID::from_bytes(*event_id.as_bytes()))); + } + Ok(results) + }) + } + /// Saves events. + fn save( + &self, + events: &[E], + latest_version: &Option, + ) -> Result, ErrorMessage> { + let query = " + INSERT INTO events (event, event_id, decider, decider_id, data, command_id, previous_id, final) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) + RETURNING *"; + + Spi::connect(|mut client| { + let mut results = Vec::new(); + let mut version = latest_version.to_owned(); + for event in events { + let data = serde_json::to_value(event).map_err(|err| ErrorMessage { + message: "Failed to save event! Failed to serialize event data/payload: " + .to_string() + + &err.to_string(), + })?; + let event_id: UUID = UUID::new_v4(); + let tup_table = client + .update( + query, + None, + Some(vec![ + ( + PgBuiltInOids::TEXTOID.oid(), + event.event_type().into_datum(), + ), + ( + PgBuiltInOids::UUIDOID.oid(), + event_id.to_string().into_datum(), + ), + ( + PgBuiltInOids::TEXTOID.oid(), + event.decider_type().into_datum(), + ), + ( + PgBuiltInOids::UUIDOID.oid(), + event.identifier().to_string().into_datum(), + ), + (PgBuiltInOids::JSONBOID.oid(), JsonB(data).into_datum()), + ( + PgBuiltInOids::UUIDOID.oid(), + event_id.to_string().into_datum(), + ), + ( + PgBuiltInOids::UUIDOID.oid(), + version + .map(|v| Uuid::from_bytes(v.into_bytes())) + .into_datum(), + ), + (PgBuiltInOids::BOOLOID.oid(), event.is_final().into_datum()), + ]), + ) + .map_err(|err| ErrorMessage { + message: "Failed to save event: ".to_string() + &err.to_string(), + })?; + + for row in tup_table { + let data = row["data"].value::().map_err(|err| ErrorMessage { + message: "Failed to save event data/payload (map `data` to `JsonB`): ".to_string() + &err.to_string(), + })?.ok_or(ErrorMessage { + message: "Failed to save event data/payload (map `data` to `JsonB`): No data/payload found".to_string(), + })?; + let event_id = row["event_id"] + .value::() + .map_err(|err| ErrorMessage { + message: "Failed to save event id (map `event_id` to `Uuid`): " + .to_string() + + &err.to_string(), + })? + .ok_or(ErrorMessage { + message: + "Failed to save event id (map `data` to `JsonB`): No event id found" + .to_string(), + })?; + + results.push((to_event(data)?, UUID::from_bytes(*event_id.as_bytes()))); + } + version = Some(event_id); + } + Ok(results) + }) + } +} + +/// A trait for event orchestrating repositories. +pub trait EventOrchestratingRepository +where + C: Identifier, + E: Clone + + Identifier + + EventType + + IsFinal + + DeciderType + + DeserializeOwned + + Serialize + + Debug, +{ + /// Fetches current events, based on the command. + fn fetch_events(&self, command: &C) -> Result, ErrorMessage> { + let query = "SELECT * FROM events WHERE decider_id = $1 ORDER BY events.offset"; + Spi::connect(|client| { + let mut results = Vec::new(); + let tup_table = client + .select( + query, + None, + Some(vec![( + PgBuiltInOids::TEXTOID.oid(), + command.identifier().to_string().into_datum(), + )]), + ) + .map_err(|err| ErrorMessage { + message: "Failed to fetch events: ".to_string() + &err.to_string(), + })?; + for row in tup_table { + let data = row["data"].value::().map_err(|err| ErrorMessage { + message: "Failed to fetch event data/payload (map `data` to `JsonB`): ".to_string() + &err.to_string(), + })?.ok_or(ErrorMessage { + message: "Failed to fetch event data/payload (map `data` to `JsonB`): No data/payload found".to_string(), + })?; + let event_id = row["event_id"] + .value::() + .map_err(|err| ErrorMessage { + message: "Failed to fetch event id (map `event_id` to `Uuid`): " + .to_string() + + &err.to_string(), + })? + .ok_or(ErrorMessage { + message: + "Failed to fetch event id (map `data` to `JsonB`): No event id found" + .to_string(), + })?; + results.push((to_event(data)?, UUID::from_bytes(*event_id.as_bytes()))); + } + Ok(results) + }) + } + + /// Fetches the latest version of the event stream to which the event belongs. + fn fetch_latest_version(&self, event: &E) -> Result, ErrorMessage> { + let query = + "SELECT * FROM events WHERE decider_id = $1 ORDER BY events.offset DESC LIMIT 1"; + Spi::connect(|client| { + let mut results = Vec::new(); + let tup_table = client + .select( + query, + None, + Some(vec![( + PgBuiltInOids::TEXTOID.oid(), + event.identifier().to_string().into_datum(), + )]), + ) + .map_err(|err| ErrorMessage { + message: "Failed to fetch latest event / version: ".to_string() + + &err.to_string(), + })?; + for row in tup_table { + let event_id = row["event_id"] + .value::() + .map_err(|err| ErrorMessage { + message: "Failed to fetch latest event id (map `event_id` to `Uuid`): " + .to_string() + + &err.to_string(), + })? + .ok_or(ErrorMessage { + message: + "Failed to fetch latest event id (map `data` to `JsonB`): No event id found" + .to_string(), + })?; + results.push(UUID::from_bytes(*event_id.as_bytes())); + } + Ok(results.first().cloned()) + }) + } + /// Saves events. + fn save(&self, events: &[E]) -> Result, ErrorMessage> { + let query = " + INSERT INTO events (event, event_id, decider, decider_id, data, command_id, previous_id, final) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) + RETURNING *"; + + Spi::connect(|mut client| { + let mut results = Vec::new(); + for event in events { + let data = serde_json::to_value(event).map_err(|err| ErrorMessage { + message: "Failed to save event! Failed to serialize event data/payload: " + .to_string() + + &err.to_string(), + })?; + let version = self.fetch_latest_version(event)?; + let event_id: UUID = UUID::new_v4(); + let tup_table = client + .update( + query, + None, + Some(vec![ + ( + PgBuiltInOids::TEXTOID.oid(), + event.event_type().into_datum(), + ), + ( + PgBuiltInOids::UUIDOID.oid(), + event_id.to_string().into_datum(), + ), + ( + PgBuiltInOids::TEXTOID.oid(), + event.decider_type().into_datum(), + ), + ( + PgBuiltInOids::TEXTOID.oid(), + event.identifier().to_string().into_datum(), + ), + (PgBuiltInOids::JSONBOID.oid(), JsonB(data).into_datum()), + ( + PgBuiltInOids::UUIDOID.oid(), + event_id.to_string().into_datum(), + ), + ( + PgBuiltInOids::UUIDOID.oid(), + version + .map(|v| Uuid::from_bytes(v.into_bytes())) + .into_datum(), + ), + (PgBuiltInOids::BOOLOID.oid(), event.is_final().into_datum()), + ]), + ) + .map_err(|err| ErrorMessage { + message: "Failed to save event: ".to_string() + &err.to_string(), + })?; + + for row in tup_table { + let data = row["data"].value::().map_err(|err| ErrorMessage { + message: "Failed to save event data/payload (map `data` to `JsonB`): ".to_string() + &err.to_string(), + })?.ok_or(ErrorMessage { + message: "Failed to save event data/payload (map `data` to `JsonB`): No data/payload found".to_string(), + })?; + let event_id = row["event_id"] + .value::() + .map_err(|err| ErrorMessage { + message: "Failed to save event id (map `event_id` to `Uuid`): " + .to_string() + + &err.to_string(), + })? + .ok_or(ErrorMessage { + message: + "Failed to save event id (map `data` to `JsonB`): No event id found" + .to_string(), + })?; + results.push((to_event(data)?, UUID::from_bytes(*event_id.as_bytes()))); + } + } + Ok(results) + }) + } +} diff --git a/src/framework/infrastructure/mod.rs b/src/framework/infrastructure/mod.rs new file mode 100644 index 0000000..b8ff3c6 --- /dev/null +++ b/src/framework/infrastructure/mod.rs @@ -0,0 +1,2 @@ +pub mod errors; +pub mod event_repository; diff --git a/src/framework/mod.rs b/src/framework/mod.rs new file mode 100644 index 0000000..50d0795 --- /dev/null +++ b/src/framework/mod.rs @@ -0,0 +1,3 @@ +pub mod application; +pub mod domain; +pub mod infrastructure; diff --git a/src/infrastructure/mod.rs b/src/infrastructure/mod.rs new file mode 100644 index 0000000..2f9ca1d --- /dev/null +++ b/src/infrastructure/mod.rs @@ -0,0 +1 @@ +pub mod order_restaurant_event_repository; diff --git a/src/infrastructure/order_restaurant_event_repository.rs b/src/infrastructure/order_restaurant_event_repository.rs new file mode 100644 index 0000000..11f4581 --- /dev/null +++ b/src/infrastructure/order_restaurant_event_repository.rs @@ -0,0 +1,15 @@ +use crate::domain::{Command, Event}; +use crate::framework::infrastructure::event_repository::EventOrchestratingRepository; + +/// An event repository for the restaurant and order domain(s). +pub struct OrderAndRestaurantEventRepository {} + +/// Implementation of the event orchestrating repository for the restaurant and order domain(s). +impl EventOrchestratingRepository for OrderAndRestaurantEventRepository {} + +impl OrderAndRestaurantEventRepository { + /// Creates a new restaurant and order event repository. + pub fn new() -> Self { + OrderAndRestaurantEventRepository {} + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..62af7d8 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,121 @@ +use crate::application::order_restaurant_aggregate::OrderAndRestaurantAggregate; +use crate::domain::{order_restaurant_decider, order_restaurant_saga, Command, Event}; +use crate::framework::infrastructure::errors::ErrorMessage; +use crate::infrastructure::order_restaurant_event_repository::OrderAndRestaurantEventRepository; +use pgrx::prelude::*; + +mod application; +mod domain; +mod framework; +mod infrastructure; + +pg_module_magic!(); + +extension_sql_file!( + "../sql/event_sourcing.sql", + name = "event_sourcing", + bootstrap +); + +/// Command handler for the whole domain / both, orders and restaurants included. +/// It handles a single command and returns a list of events that were generated and persisted. +#[pg_extern] +fn handle(command: Command) -> Result, ErrorMessage> { + let repository = OrderAndRestaurantEventRepository::new(); + let aggregate = OrderAndRestaurantAggregate::new( + repository, + order_restaurant_decider(), + order_restaurant_saga(), + ); + aggregate + .handle(&command) + .map(|res| res.into_iter().map(|(e, _)| e.clone()).collect()) +} + +/// Compound command handler for the domain / both, orders and restaurants included +/// It handles a list of commands and returns a list of events that were generated and persisted. +/// All commands are executed in a single transaction, and the effects/events of the previous commands are visible to the subsequent commands. +/// If any of the commands fail, the transaction is rolled back, and no events are persisted. +/// This is useful when you need to ensure that all commands are executed or none. +#[pg_extern] +fn handle_all(commands: Vec) -> Result, ErrorMessage> { + let repository = OrderAndRestaurantEventRepository::new(); + let aggregate = OrderAndRestaurantAggregate::new( + repository, + order_restaurant_decider(), + order_restaurant_saga(), + ); + aggregate + .handle_all(&commands) + .map(|res| res.into_iter().map(|(e, _)| e.clone()).collect()) +} + +#[cfg(any(test, feature = "pg_test"))] +#[pg_schema] +mod tests { + use crate::domain::api::{CreateRestaurant, RestaurantCreated}; + use crate::domain::api::{ + MenuId, MenuItem, MenuItemId, MenuItemName, Money, RestaurantId, RestaurantMenu, + RestaurantMenuCuisine, RestaurantName, + }; + use crate::domain::{Command, Event}; + use pgrx::prelude::*; + use uuid::Uuid; + + #[pg_test] + fn create_restaurant_test() { + let restaurant_identifier = + RestaurantId(Uuid::parse_str("02f09a3f-1624-3b1d-8409-44eff7708208").unwrap()); + let restaurant_name = RestaurantName("Test Restaurant".to_string()); + let menu_item_id = + MenuItemId(Uuid::parse_str("02f09a3f-1624-3b1d-8409-44eff7708210").unwrap()); + let menu_id = MenuId(Uuid::parse_str("02f09a3f-1624-3b1d-8409-44eff7708210").unwrap()); + let menu_items = vec![MenuItem { + id: menu_item_id, + name: MenuItemName("Item 1".to_string()), + price: Money(100u64), + }]; + + let create_restaurant_command = Command::CreateRestaurant(CreateRestaurant { + identifier: restaurant_identifier.clone(), + name: restaurant_name.clone(), + menu: RestaurantMenu { + menu_id: menu_id.clone(), + items: menu_items.clone(), + cuisine: RestaurantMenuCuisine::Vietnamese, + }, + }); + let restaurant_created_event = Event::RestaurantCreated(RestaurantCreated { + identifier: restaurant_identifier.clone(), + name: restaurant_name.clone(), + menu: RestaurantMenu { + menu_id: menu_id.clone(), + items: menu_items.clone(), + cuisine: RestaurantMenuCuisine::Vietnamese, + }, + r#final: false, + }); + + assert_eq!( + Some(restaurant_created_event.clone()), + crate::handle(create_restaurant_command) + .unwrap() + .into_iter() + .next() + ); + } +} + +/// This module is required by `cargo pgrx test` invocations. +/// It must be visible at the root of your extension crate. +#[cfg(test)] +pub mod pg_test { + pub fn setup(_options: Vec<&str>) { + // perform one-off initialization when the pg_test framework starts + } + + pub fn postgresql_conf_options() -> Vec<&'static str> { + // return any postgresql.conf settings that are required for your tests + vec![] + } +}