blob: 7e16e88634e4975668dcac2256a956676fea6a80 [file] [log] [blame]
= Principles
== RESTful API
The platform exposes all its functionality via a *practically-RESTful API*, that communicates using JSON.
We use the term *practically-RESTful* in order to make it clear we are not trying to be fully REST compliant but still maintain important RESTful attributes like:
* Stateless: platform maintains no conversational or session-based state. The result of this is ability to scale horizontally with ease.
* Resource-oriented: API is focussed around set of resources using HTTP vocabulary and conventions e.g GET, PUT, POST, DELETE, HTTP status codes. This results in a simple and consistent API for clients.
See online API Documentation for more detail.
== Multi-tenanted
The Fineract platform has been developed with support for multi-tenancy at the core of its design. This means that it is just as easy to use the platform for Software-as-a-Service (SaaS) type offerings as it is for local installations.
The platform uses an approach that isolates an FIs data per database/schema (See Separate Databases and Shared Database, Separate Schemas).
== Extensible
Whilst each tenant will have a set of core tables, the platform tables can be extended in different ways for each tenant through the use of Data tables functionality.
== Command Query Separation
We separate *commands* (that change data) from *queries* (that read data).
Why? There are numerous reasons for choosing this approach which at present is not an attempt at full blown CQRS. The main advantages at present are:
* State changing commands are persisted providing an audit of all state changes.
* Used to support a general approach to *maker-checker*.
* State changing commands use the Object-Oriented paradigm (and hence ORM) whilst querys can stay in the data paradigm.
== Maker-Checker
Also known as *four-eyes principal*. Enables apps to support a maker-checker style workflow process. Commands that pass validation will be persisted. Maker-checker can be enabled/disabled at fine-grained level for any state changing API.
Fine grained access control
A fine grained permission is associated with each API. Administrators have fine grained control over what roles or users have access to.
== Package Structure
The intention is for platform code to be packaged in a vertical slice way (as opposed to layers).
Source code starts from https://github.com/apache/fineract/tree/develop/fineract-provider/src/main/java/org/apache/fineract
* accounting
* useradministration
* infrastructure
* portfolio
** charge
** client
** fund
** loanaccount
* accounting
Within each vertical slice is some common packaging structure:
* api - XXXApiResource.java - REST api implementation files
* handler - XXXCommandHandler.java - specific handlers invoked
* service - contains read + write services for functional area
* domain - OO concepts for the functional area
* data - Data concepts for the area
* serialization - ability to convert from/to API JSON for functional area