| 
														
															@@ -50,11 +50,11 @@ specific role and responsibility.`DDD` consists of four layers. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 **Infrastructure Layer**: 
														 | 
														
														 | 
														
															 **Infrastructure Layer**: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 * Provides generic technical capabilities that support the higher layers. It deals with APIs, persistence and network, etc. 
														 | 
														
														 | 
														
															 * Provides generic technical capabilities that support the higher layers. It deals with APIs, persistence and network, etc. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-* Implements the repository interface and hiding the complexity of the Domain layer. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+* Implements the repository interface and hides the complexity of the Domain layer. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-As you see, the `Complexity` and `Abstraction` of these layers are depicted in this diagram. Software system are composed in layers, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+As you see, the `Complexity` and `Abstraction` of these layers are depicted in the following diagram. Software system are composed in layers, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 where higher layers use the facilities provided by lower layers. Each layer provides a different abstraction from the layer above 
														 | 
														
														 | 
														
															 where higher layers use the facilities provided by lower layers. Each layer provides a different abstraction from the layer above 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-and below it. As a developer, we should pull the complexity downwards. Simple interface and powerful implementation(Think about the 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+and below it. As developers, we should pull the complexity downwards. Simple interfaces and powerful implementations (Think about the 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 [open](https://man7.org/linux/man-pages/man2/open.2.html) function). Another way of expressing this idea is that it is more important 
														 | 
														
														 | 
														
															 [open](https://man7.org/linux/man-pages/man2/open.2.html) function). Another way of expressing this idea is that it is more important 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 for a module to have a simple interface than a simple implementation. 
														 | 
														
														 | 
														
															 for a module to have a simple interface than a simple implementation. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -76,25 +76,21 @@ for a module to have a simple interface than a simple implementation. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ### Data Model 
														 | 
														
														 | 
														
															 ### Data Model 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-DDD classifies data as referenceable objects, or entities, and non-referenceable objects, or value objects. Let's introduces 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-some terminologies from DDD. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+DDD classifies data as referenceable objects, or entities, and non-referenceable objects, or value objects. Let's introduce some DDD terminology. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 **Entity** 
														 | 
														
														 | 
														
															 **Entity** 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-`Entities` are referenceable because they carry an identity which allows us to reference them. e.g. user, order, book, etc. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-You can use `entities` to express your business model and encapsulate them into Factory that provides simple API interface 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-to create Entities. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+`Entities` are plain objects that carry an identity which allows us to reference them. e.g. user, order, book, etc. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+You use `entities` to express your business model and encapsulate them into Factory that provides a simple API to create Entities. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 **Value Object** 
														 | 
														
														 | 
														
															 **Value Object** 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-`Value Object` can't be referenced. They can be only included into entities and serve as attributes. Value objects could be 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-simple and treat as immutable. e.g. email, phone number, name, etc. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+`Value Object` can't be referenced. They can be only included into entities and serve as attributes. Value objects could be simple and treat as immutable. e.g. email, phone number, name, etc. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 **Aggregate** 
														 | 
														
														 | 
														
															 **Aggregate** 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-`Entity` or `Value object` can be grouped into aggregates. Aggregates can simplify the model by accessing the entire aggregate. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-For instance, Table has lots of row. Each row using the table_id to reference to the 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+`Entities` and `Value objects` can be grouped into aggregates. Aggregates can simplify the model by accessing the entire aggregate. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+For instance, Table has lots of rows. Each row using the table_id to reference to the 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 table. TableAggregate includes two entities: Table and the Row. 
														 | 
														
														 | 
														
															 table. TableAggregate includes two entities: Table and the Row. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ``` 
														 | 
														
														 | 
														
															 ``` 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -113,10 +109,7 @@ table. TableAggregate includes two entities: Table and the Row. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 **Service** 
														 | 
														
														 | 
														
															 **Service** 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-When a significant process of transformation in the domain is not a natural responsibility of an `Entity` or `Value object`, add 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-an operation to the model as standalone interface declared as a Service. For instance: The `Value object`, EmailAddress, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-uses the function `validateEmailAddress` to verify the email address is valid or not. `Service` exists in Application, Domain and 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-Infrastructure. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+When a significant process of transformation in the domain is not a natural responsibility of an `Entity` or `Value object`, add an operation to the model as standalone interface declared as a Service. For instance: The `Value object`  EmailAddress uses the function `validateEmailAddress` to verify if the email address is valid or not. `Service` exists in Application, Domain and Infrastructure. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ``` 
														 | 
														
														 | 
														
															 ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 class EmailAddress  { 
														 | 
														
														 | 
														
															 class EmailAddress  { 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -127,7 +120,7 @@ class EmailAddress  { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       validateEmailAddress(input), 
														 | 
														
														 | 
														
															       validateEmailAddress(input), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     ); 
														 | 
														
														 | 
														
															     ); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   } 
														 | 
														
														 | 
														
															   } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-   
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   const EmailAddress._(this.value); 
														 | 
														
														 | 
														
															   const EmailAddress._(this.value); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -139,9 +132,12 @@ Either<Failure<String>, String> validateEmailAddress(String? input) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 **Repository** 
														 | 
														
														 | 
														
															 **Repository** 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-Repository offer an interface to retrieve and persist aggregates and entities. They hide the database or network details from the domain. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-The Repository interfaces are declared in the Domain Layer, but the repositories themselves are implemented in the Infrastructure Layer. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-You can replace the interface implementation without impacting the domain layer. For instance: 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+Repositories offer an interface to retrieve and persist aggregates and entities. They hide the database or network details from the domain. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+Repository interfaces are declared in the Domain Layer, but the repositories themselves are implemented in the Infrastructure Layer. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+You can replace the interface implementation without impacting the domain layer. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+For instance: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ``` 
														 | 
														
														 | 
														
															 ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 // Interface: 
														 | 
														
														 | 
														
															 // Interface: 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -161,7 +157,7 @@ The diagram below is a navigational map. It shows the patterns that form the bui 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ](imgs/domain_model_relation.png) 
														 | 
														
														 | 
														
															 ](imgs/domain_model_relation.png) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-## ๐ฅ Operation Flow 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+## Operation Flow 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ``` 
														 | 
														
														 | 
														
															 ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -194,9 +190,7 @@ interaction    โ          โ โโโโโโโโฒโโโโโโโโ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ``` 
														 | 
														
														 | 
														
															 ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-1.  Widget accepts user interaction and transfers the interactions into specific events. The events will be send to the Application layer, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    handled by the specific `bloc`. The `bloc` send the states changed by the events back to the widget, and finally the `Widget` update 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    the UI according to the state. The pattern is depicted in this diagram. (More about the flutter [bloc](https://bloclibrary.dev/#/coreconcepts?id=bloc)) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+1.  Widget accepts user interaction and translates the interactions into specific Events. The events will be sent to the Application layer, handled by the specific `bloc`. The `bloc` sends the states changed by the events back to the widget, and finally the `Widget` updates the UI according to the state. The pattern is depicted in this diagram. (More about the flutter [bloc](https://bloclibrary.dev/#/coreconcepts?id=bloc)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     ``` 
														 | 
														
														 | 
														
															     ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                        โโโโโโโโโโโโโ     State     โโโโโโโโโโโโโ 
														 | 
														
														 | 
														
															                        โโโโโโโโโโโโโ     State     โโโโโโโโโโโโโ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                        โ                                       โ 
														 | 
														
														 | 
														
															                        โ                                       โ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -209,15 +203,17 @@ interaction    โ          โ โโโโโโโโฒโโโโโโโโ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                        โ                                     โฒ 
														 | 
														
														 | 
														
															                        โ                                     โฒ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                        โ                                     โ 
														 | 
														
														 | 
														
															                        โ                                     โ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                        โโโโโโโโโโโ     Event     โโโโโโโโโโโโโ 
														 | 
														
														 | 
														
															                        โโโโโโโโโโโ     Event     โโโโโโโโโโโโโ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-     
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     ``` 
														 | 
														
														 | 
														
															     ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-2.  The `bloc` process the events using the services provided by the `Domain` layer. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+2.  The `bloc` processes the events using the services provided by the `Domain` layer. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     1. Convert DTO (Data Transfer Object) to domain model and Domain Model to DTO. 
														 | 
														
														 | 
														
															     1. Convert DTO (Data Transfer Object) to domain model and Domain Model to DTO. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    2. Domain model is the place where all your business logics, business validation and business behaviors will be implemented. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    2. Domain model is the place where all your business logic, business validation and business behaviors will be implemented. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															        The Aggregate Roots, Entities and Value Objects will help to achieve the business logic. 
														 | 
														
														 | 
														
															        The Aggregate Roots, Entities and Value Objects will help to achieve the business logic. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-3. Calling repositories to perform additional operations. The repositories interfaces are declared in `Domain`, implemented in `Infrastructure`. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-   You can reimplement the repository interface with different languages, such as `Rust`, `C++` or `Flutter`. etc. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+3. Calling repositories to perform additional operations. The repositories interfaces are declared in the `Domain` layer and are implemented in the `Infrastructure` layer. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+   You can reimplement the repository interface with different languages, such as `Rust`, `C++` or `Dart`. etc. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															    ``` 
														 | 
														
														 | 
														
															    ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															               Domain                       Infrastructure 
														 | 
														
														 | 
														
															               Domain                       Infrastructure 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -234,10 +230,9 @@ interaction    โ          โ โโโโโโโโฒโโโโโโโโ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     โ โ โ โ โ โ โ โ โ โ โ โ โ โ  โ  โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ 
														 | 
														
														 | 
														
															     โ โ โ โ โ โ โ โ โ โ โ โ โ โ  โ  โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 
														 | 
														
														 | 
														
															     โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															    ``` 
														 | 
														
														 | 
														
															    ``` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-4. Responsibility of [Unit of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html) is to maintain a list of objects affected by a 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-   business transaction and coordinates the writing out of changes and the resolution of concurrency problems((No intermediate state)). 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+4. The responsibility of [Unit of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html) is to maintain a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems((No intermediate state)). 
														 | 
													
												
											
												
													
														| 
														 | 
														
															    If any one persistence service fails, the whole transaction will be failed so, roll back operation will be called to put the object 
														 | 
														
														 | 
														
															    If any one persistence service fails, the whole transaction will be failed so, roll back operation will be called to put the object 
														 | 
													
												
											
												
													
														| 
														 | 
														
															    back in initial state. 
														 | 
														
														 | 
														
															    back in initial state. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 5. Handling operations (INSERT, UPDATE and DELETE) with SQLite to persis the data. 
														 | 
														
														 | 
														
															 5. Handling operations (INSERT, UPDATE and DELETE) with SQLite to persis the data. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-6. Saving or querying the data in the cloud to finish the operation. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+6. Saving or querying the data in the cloud to finish the operation. 
														 |