FINERACT-1191: Finceract Documentation in Asciidoc
This commit is contained in:
committed by
Michael Vorburger ⛑️
parent
db53a422b2
commit
e380df187d
@@ -0,0 +1,39 @@
|
||||
== Introduction
|
||||
|
||||
=== Platform for Digital Financial Services
|
||||
|
||||
Apache Fineract (\’fīn-,ә-,rakt\) is open source software for financial services.
|
||||
|
||||
Fineract provides a reliable, robust, and affordable solution for entrepreneurs, financial institutions, and service providers to offer financial services to the world’s 2 billion underbanked and unbanked. Fineract is aimed at innovative mobile and cloud-based solutions, and enables digital transaction accounts for all.
|
||||
|
||||
Fineract 1.x is a mature platform with open APIs, while Fineract CN is a cloud native, microservice architecture also supporting open banking APIs.
|
||||
|
||||
=== About
|
||||
|
||||
Apache Fineract can be deployed in any environment: cloud or on-premise. It can support front end interfaces on or offline, mobile or PC. It’s extensible enough to support any organizational type or delivery channel, and flexible enough to support any product, service, or lending methodology. For any organization, big or small, it provides the client data management, loan and savings portfolio management, integrated real time accounting, and social and financial reporting needed to bring digital financial services to a modern connected world.
|
||||
|
||||
Fineract 1.x compares well to other core banking systems and draws from requirements in credit unions, microfinance institutions, and small non-banking financial institutions. Features include flexible product configuration, KYC documentation support, business rule sets, payment transactions, and portfolio management. It includes an open API that dates to 2011 and is deployed in relatively high transaction volume environments.
|
||||
|
||||
Fineract CN operates on the principle that financial services are an innovative space and so each fineract microservice encapsulates a domain that can be combined with other microservices to create new platform offerings. Fineract CN microservices can be combined to create new software platforms for digital financial service providers. Fineract CN is still in its early days, but preliminary tests have shown that a simple single-instance laptop deployment of Fineract CN can process over 1000 transactions/second. Fineract CN also includes a fully Apache-licensed backoffice UI.
|
||||
|
||||
Fineract 1.x began incubation at Apache in December 2015 and is used by an active community of companies who build solutions for both financial inclusion and fintech innovation.
|
||||
|
||||
=== Contribute
|
||||
|
||||
The Apache Fineract community welcomes contributors who want to support the Fineract technology. Our community builds everything from this website, to the Fineract code to documentation and best practices information.
|
||||
|
||||
We especially welcome additions and corrections to the documentation, wiki, and website to improve the user experience. Bug reports and fixes and additions to the Apache Fineract code are welcome. Helping users learn best practices also earns good karma in our community.
|
||||
|
||||
=== Mailing Lists
|
||||
|
||||
Users & Developers
|
||||
|
||||
If you use, build on top of, deploy or are building contributions and modifications to Apache Fineract, this is the list for you.
|
||||
To subscribe, send a blank email to dev-subscribe@fineract.apache.org.
|
||||
To unsubscribe later, just send a blank email to dev-unsubscribe@fineract.apache.org.
|
||||
You can also read the archives on lists.apache.org or on MarkMail.org.
|
||||
Commits
|
||||
|
||||
This list receives an email whenever new code is contributed to Apache Fineract.
|
||||
To subscribe, send a blank email to commits-subscribe@fineract.apache.org.
|
||||
You can also read the archives.
|
||||
@@ -0,0 +1,209 @@
|
||||
== Fineract Platform Software Architecture Document
|
||||
|
||||
=== Summary
|
||||
|
||||
This document captures the major architectural decisions in platform. The purpose of the document is to provide a guide to the overall structure of the platform; where it fits in the overall context of an MIS solution and its internals so that contributors can more effectively understand how changes that they are considering can be made, and the consequences of those changes.
|
||||
|
||||
The target audience for this report is both system integrators (who will use the document to gain an understanding of the structure of the platform and its design rationale) and platform contributors who will use the document to reason about future changes and who will update the document as the system evolves.
|
||||
|
||||
=== Introduction
|
||||
|
||||
==== The Idea
|
||||
|
||||
Mifos was an idea born out of a wish to create and deploy technology that allows the microfinance industry to scale. The goal is to:
|
||||
|
||||
- Produce a gold standard management information system suitable for microfinance operations
|
||||
- Acts as the basis of a platform for microfinance
|
||||
- Open source, owned and driven by member organisations in the community
|
||||
- Enabling potential for eco-system of providers located near to MFIs
|
||||
|
||||
==== History
|
||||
|
||||
- 2006: Project intiated by Grameen Foundation
|
||||
- Late 2011: Grameen Foundation handed over full responsibility to open source community.
|
||||
- 2012: Mifos X platform started. Previous members of project come together under the name of Community for Open Source Microfinance (COSM / OpenMF)
|
||||
- 2013: COSM / OpenMF officially rebranded to Mifos Initiative and receive US 501c3 status.
|
||||
|
||||
==== Project Related
|
||||
|
||||
- Project url is https://github.com/openMF/mifosx
|
||||
- Download from https://sourceforge.net/projects/mifos/
|
||||
- Download stats
|
||||
|
||||
=== System Overview
|
||||
|
||||
.Platform System Overview
|
||||
image::images/platform-systemview.png[]
|
||||
|
||||
Financial institutions deliver their services to customers through a variety of means today.
|
||||
|
||||
- Customers can call direct into branches (teller model)
|
||||
- Customers can organise into groups (or centers) and agree to meetup at a location and time with FI staff (traditional microfinance).
|
||||
- An FI might have a public facing information portal that customers can use for variety of reasons including account management (online banking).
|
||||
- An FI might be integrated into a ATM/POS/Card services network that the customer can use.
|
||||
- An FI might be integrated with a mobile money operator and support mobile money services for customer (present/future microfinance).
|
||||
- An FI might use third party agents to sell on products/services from other banks/FIs.
|
||||
|
||||
As illustrated in the above diagram, the various stakeholders leverage business apps to perform specific customer or FI related actions. The functionality contained in these business apps can be bundled up and packaged in any way. In the diagram, several of the apps may be combined into one app or any one of the blocks representing an app could be further broken up as needed.
|
||||
|
||||
The platform is the core engine of the MIS. It hides alot of the complexity that exists in the business and technical domains needed for an MIS in FIs behind a relatively simple API. It is this API that frees up app developers to innovate and produce apps that can be as general or as bespoke as FIs need them to be.
|
||||
|
||||
=== Functional Overview
|
||||
|
||||
As ALL capabilities of the platform are exposed through an API, The API docs are the best place to view a detailed breakdown of what the platform does. See online API Documentation.
|
||||
|
||||
.Platform Functional Overview
|
||||
image::images/platform-categories.png[]
|
||||
|
||||
At a higher level though we see the capabilities fall into the following categories:
|
||||
|
||||
* Infrastructure
|
||||
** Codes
|
||||
** Extensible Data Tables
|
||||
** Reporting
|
||||
|
||||
* User Administration
|
||||
** Users
|
||||
** Roles
|
||||
** Permissions
|
||||
|
||||
* Organisation Modelling
|
||||
** Offices
|
||||
** Staff
|
||||
** Currency
|
||||
|
||||
* Product Configuration
|
||||
** Charges
|
||||
** Loan Products
|
||||
** Deposit Products
|
||||
|
||||
* Client Data
|
||||
** Know Your Client (KYC)
|
||||
|
||||
* Portfolio Management
|
||||
** Loan Accounts
|
||||
** Deposit Accounts
|
||||
** Client/Groups
|
||||
|
||||
* GL Account Management
|
||||
** Chart of Accounts
|
||||
** General Ledger
|
||||
|
||||
=== Technology
|
||||
|
||||
* Java 11: http://www.oracle.com/technetwork/java/javase/downloads/index.html
|
||||
* JAX-RS 1.0: using Jersey (1.17.x)
|
||||
* JSON using Google GSON
|
||||
* Spring I/O Platform: http://spring.io/platform
|
||||
** Spring Framework
|
||||
** Spring Boot
|
||||
** Spring Security
|
||||
** Spring Data (JPA) backed by Hibernate
|
||||
* MySQL: http://www.oracle.com/us/products/mysql/overview/index.html
|
||||
|
||||
=== Principals
|
||||
|
||||
==== 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 mifos 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 Seperation
|
||||
|
||||
We seperate *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 paradign (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.
|
||||
|
||||
=== Code Packaging
|
||||
|
||||
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
|
||||
|
||||
=== Design Overview
|
||||
|
||||
NOTE: The implementation of the platform code to process commands through handlers whilst supporting maker-checker and authorisation checks is a little bit convoluted at present and is an area pin-pointed for clean up to make it easier to on board new platform developers. In the mean time below content is used to explain its workings at present.
|
||||
|
||||
.CQRS
|
||||
image::images/command-query.png[]
|
||||
|
||||
Taking into account example shown above for the *users* resource.
|
||||
|
||||
* Query: GET /users
|
||||
* HTTPS API: retrieveAll method on *org.apache.fineract.useradministration.api.UsersApiResource* invoked
|
||||
* UsersApiResource.retrieveAll: Check user has permission to access this resources data.
|
||||
* UsersApiResource.retrieveAll: Use 'read service' to fetch all users data ('read services' execute simple SQL queries against Database using JDBC)
|
||||
* UsersApiResource.retrieveAll: Data returned to coverted into JSON response
|
||||
* Command: POST /users (Note: data passed in request body)
|
||||
* HTTPS API: create method on org.apache.fineract.useradministration.api.UsersApiResource invoked
|
||||
|
||||
.UsersApiResource.create
|
||||
[source,java]
|
||||
----
|
||||
include::{rootdir}/fineract-provider/src/main/java/org/apache/fineract/useradministration/api/UsersApiResource.java[lines=168..188]
|
||||
----
|
||||
|
||||
.Create a CommandWrapper object that represents this create user command and JSON request body. Pass off responsiblity for processing to PortfolioCommandSourceWritePlatformService.logCommandSource
|
||||
[source,java]
|
||||
----
|
||||
include::{rootdir}/fineract-provider/src/main/java/org/apache/fineract/commands/service/PortfolioCommandSourceWritePlatformServiceImpl.java[lines=69..129]
|
||||
----
|
||||
|
||||
.Check user has permission for this action. if ok, a) parse the json request body, b) create a JsonCommand object to wrap the command details, c) use CommandProcessingService to handle command
|
||||
[source,java]
|
||||
----
|
||||
include::{rootdir}/fineract-provider/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java[lines=84..150]
|
||||
----
|
||||
|
||||
NOTE: if a RollbackTransactionAsCommandIsNotApprovedByCheckerException occurs at this point. The original transaction will of been aborted and we only log an entry for the command in the audit table setting its status as 'Pending'.
|
||||
|
||||
* Check that if maker-checker configuration enabled for this action. If yes and this is not a 'checker' approving the command - rollback at the end. We rollback at the end in order to test if the command will pass 'domain validation' which requires commit to database for full check.
|
||||
* findCommandHandler - Find the correct Hanlder to process this command.
|
||||
* Process command using handler (In transactional scope).
|
||||
* CommandSource object created/updated with all details for logging to 'm_portfolio_command_source' table.
|
||||
* In update scenario, we check to see if there where really any changes/updates. If so only JSON for changes is stored in audit log.
|
||||
@@ -0,0 +1,41 @@
|
||||
== OAuth
|
||||
|
||||
Fineract has (basic) OAuth (2.0?) support. Here's how to use it:
|
||||
|
||||
=== Build
|
||||
|
||||
You must re-build the distribution JAR (or WAR) using the special `-Psecurity=oauth` flag:
|
||||
|
||||
----
|
||||
./gradlew bootJAR -Psecurity=oauth
|
||||
java -jar build/libs/fineract-provider.jar
|
||||
----
|
||||
|
||||
Downloads from https://fineract.apache.org, or using e.g. the https://hub.docker.com/r/apache/fineract container image, or on https://www.fineract.dev, this will not work, because they have not been built using this flag.
|
||||
|
||||
=== Invoke `/fineract-provider/api/oauth/token`
|
||||
|
||||
----
|
||||
curl [--insecure] --location --request POST \
|
||||
'https://localhost:8443/fineract-provider/api/oauth/token' \
|
||||
--header 'Fineract-Platform-TenantId: default' \
|
||||
--header 'Content-Type: application/x-www-form-urlencoded' \
|
||||
--data-urlencode 'username=mifos' \
|
||||
--data-urlencode 'password=password' \
|
||||
--data-urlencode 'client_id=community-app' \
|
||||
--data-urlencode 'grant_type=password' \
|
||||
--data-urlencode 'client_secret=123'
|
||||
----
|
||||
|
||||
Note that the `client_id` and `client_secret` are stored in the `oauth_client_details` table in the database.
|
||||
|
||||
=== Invoke APIs and pass `Authorization: bearer ...` header
|
||||
|
||||
----
|
||||
curl --location --request GET \
|
||||
'https://localhost:8443/fineract-provider/api/v1/clients' \
|
||||
--header 'Fineract-Platform-TenantId: default' \
|
||||
--header 'Authorization: bearer RzfUyQ0wEnxxq4PyFCF1J-XGFCI'
|
||||
----
|
||||
|
||||
NOTE: See also https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm#authentication_oauth
|
||||
@@ -0,0 +1,7 @@
|
||||
== Fineract OpenAPI Documentation
|
||||
|
||||
include::{generated}/overview.adoc[]
|
||||
|
||||
include::{generated}/paths.adoc[]
|
||||
|
||||
include::{generated}/definitions.adoc[]
|
||||
@@ -0,0 +1,34 @@
|
||||
== Generate Apache Fineract API Client
|
||||
|
||||
Apache Fineract supports client code generation using https://openapi-generator.tech[OpenAPI Generator]. It uses https://swagger.io/specification/[OpenAPI Specification Version 3.0.3].
|
||||
|
||||
=== Fineract SDK Java API Client
|
||||
|
||||
The `fineract-client.jar` will eventually be available on Maven Central (watch https://issues.apache.org/jira/browse/FINERACT-1102[FINERACT-1102]). Until it is, you can quite easily build the latest and greatest version locally from source, see below.
|
||||
|
||||
The https://github.com/apache/fineract/search?q=FineractClient.java[`FineractClient`] is the entry point to the _Fineract SDK Java API Client_. https://github.com/apache/fineract/search?q=Calls.java[`Calls`] is a convenient and recommended utility to simplify the use of the https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html[`retrofit2.Call`] type which all API operations return. Their benefit is illustrated e.g. in the https://github.com/apache/fineract/search?q=FineractClientTest.java[`FineractClientTest`], but in short:
|
||||
|
||||
[source,java]
|
||||
// /home/spaddo/workspace/fineract/vidakovic-fineract-develop/
|
||||
----
|
||||
import org.apache.fineract.client.util.FineractClient;
|
||||
import static org.apache.fineract.client.util.Calls.ok;
|
||||
|
||||
include::{rootdir}/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTest.java[lines=44..45]
|
||||
|
||||
System.out.println(ok(fineract.clients.retrieveAll(...).getTotalFilteredRecords());
|
||||
----
|
||||
|
||||
=== Generate API Client
|
||||
|
||||
The API client is built as part of the standard overall Fineract Gradle build. The client JAR can be found in `fineract-client/build/libs` as `fineract-client.jar`.
|
||||
|
||||
If you need to save time to incrementally work on making small changes to Swagger annotations in an IDE, you can execute e.g. the following line in root directory of the project to exclude non-require Gradle tasks:
|
||||
|
||||
----
|
||||
./gradlew -x compileJava -x compileTest -x spotlessJava -x enhance resolve prepareInputYaml :fineract-client:buildJavaSdk
|
||||
----
|
||||
|
||||
=== Validate OpenAPI Spec File
|
||||
|
||||
The `resolve` task in https://github.com/apache/fineract/blob/develop/fineract-provider/build.gradle#L80[build.gradle] file will generate the OpenAPI Spec File for the project. To make sure Swagger Codegen generates a correct library, it is important for the OpenAPI Spec file to be valid. Validation is done automatically by the OpenAPI code generator Gradle plugin. If you still have problems during code generation please use https://validator.swagger.io/[Swagger OpenAPI Validator] to validate the spec file.
|
||||
@@ -0,0 +1,34 @@
|
||||
== Validation
|
||||
|
||||
=== Programmatic
|
||||
|
||||
Use the [DataValidatorBuilder](https://github.com/apache/fineract/search?q=%22class+DataValidatorBuilder%22), e.g. like so:
|
||||
|
||||
[source,java]
|
||||
----
|
||||
new DataValidatorBuilder().resource("fileUpload")
|
||||
.reset().parameter("Content-Length").value(contentLength).notBlank().integerGreaterThanNumber(0)
|
||||
.reset().parameter("FormDataContentDisposition").value(fileDetails).notNull()
|
||||
.throwValidationErrors();
|
||||
----
|
||||
|
||||
Such code is often encapsulated in [`*Validator`](https://github.com/apache/fineract/search?q=Validator)
|
||||
classes (if more than a few lines, and/or reused from several places; avoid copy/paste), like so:
|
||||
|
||||
[source,java]
|
||||
----
|
||||
public class YourThingValidator {
|
||||
|
||||
public void validate(YourThing thing) {
|
||||
new DataValidatorBuilder().resource("yourThing")
|
||||
...
|
||||
.throwValidationErrors();
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
|
||||
=== Declarative
|
||||
|
||||
[FINERACT-1229](https://issues.apache.org/jira/browse/FINERACT-1229) is an open issue about adopting
|
||||
Bean Validation for _declarative_ instead of _programmatic_ (as above) validation. Contributions welcome!
|
||||
@@ -0,0 +1 @@
|
||||
[appendix]
|
||||
@@ -0,0 +1,35 @@
|
||||
[colophon]
|
||||
|
||||
//ifdef::backend-pdf[]
|
||||
//{empty} +
|
||||
//endif::[]
|
||||
|
||||
*Version*: {revnumber}
|
||||
|
||||
*Date*: {docdate}
|
||||
|
||||
//ifdef::backend-pdf[]
|
||||
//{empty} +
|
||||
//endif::[]
|
||||
|
||||
.Authors
|
||||
|===
|
||||
^| Name ^| Email
|
||||
|
||||
| Michael Vorburger | mailto:mike@vorburger.ch[]
|
||||
| Aleksandar Vidakovic | mailto:aleks@apache.org[]
|
||||
|===
|
||||
|
||||
//ifdef::backend-pdf[]
|
||||
//{empty} +
|
||||
//endif::[]
|
||||
|
||||
.History
|
||||
[cols="<.^2a,<.^4a,^.^2a,^.^1a"]
|
||||
|===
|
||||
^| Authors ^| Description ^| Date ^| Version
|
||||
|
||||
| Aleksandar Vidakovic | Initial version | 2020-10-26 | 1.4.0
|
||||
|===
|
||||
|
||||
toc::[]
|
||||
@@ -0,0 +1,45 @@
|
||||
:doctype: book
|
||||
:compat-mode!:
|
||||
:optimize: printer
|
||||
:media: printer
|
||||
:compress:
|
||||
:pdf-page-size: LETTER
|
||||
:experimental:
|
||||
:pdf-version: 1.7
|
||||
:page-layout: base
|
||||
:toc-title: Table of Contents
|
||||
:toc: macro
|
||||
:icons: font
|
||||
:source-highlighter: coderay
|
||||
:experimental:
|
||||
:source-language: java
|
||||
:diagramsdir: diagrams
|
||||
:imagesdir: images
|
||||
:years: 2017-2020
|
||||
:lang: en
|
||||
:encoding: utf-8
|
||||
:linkattrs:
|
||||
:hide-uri-scheme:
|
||||
:data-uri:
|
||||
:xrefstyle: short
|
||||
:front-cover-image: {imagesdir}/apache-fineract-logo.png
|
||||
:email: dev@fineract.apache.org
|
||||
:checkedbox: pass:normal[{startsb}✔{endsb}]
|
||||
:table-stripes: even
|
||||
|
||||
// ifeval::["{draft}"=="true"]
|
||||
// :title-page-background-image: image:{commondir}/images/draft.svg[position=top]
|
||||
// endif::[]
|
||||
|
||||
ifdef::env-vscode[]
|
||||
:source-highlighter: highlightjs
|
||||
:kroki-fetch-diagram:
|
||||
endif::[]
|
||||
|
||||
ifdef::env-github[]
|
||||
:tip-caption: :bulb:
|
||||
:note-caption: :information_source:
|
||||
:important-caption: :heavy_exclamation_mark:
|
||||
:caution-caption: :fire:
|
||||
:warning-caption: :warning:
|
||||
endif::[]
|
||||
@@ -0,0 +1,47 @@
|
||||
@startuml
|
||||
!include <awslib/AWSCommon>
|
||||
|
||||
' Uncomment the following line to create simplified view
|
||||
!include <awslib/AWSSimplified>
|
||||
|
||||
!include <awslib/General/Users>
|
||||
!include <awslib/Mobile/APIGateway>
|
||||
!include <awslib/SecurityIdentityAndCompliance/Cognito>
|
||||
!include <awslib/Compute/Lambda>
|
||||
!include <awslib/Database/DynamoDB>
|
||||
!include <awslib/Storage/SimpleStorageServiceS3>
|
||||
!include <awslib/InternetOfThings/IoTRule>
|
||||
!include <awslib/InternetOfThings/IoTAction>
|
||||
!include <awslib/Analytics/KinesisDataStreams>
|
||||
!include <awslib/ApplicationIntegration/SQSQueue>
|
||||
|
||||
left to right direction
|
||||
|
||||
agent "Published Event" as event #fff
|
||||
|
||||
IoTRule(iotRule, "Action Error Rule", "error if Kinesis fails")
|
||||
KinesisDataStreams(eventStream, "IoT Events", "2 shards")
|
||||
SQSQueue(errorQueue, "Rule Error Queue", "failed Rule actions")
|
||||
|
||||
event --> iotRule : JSON message
|
||||
iotRule --> eventStream : messages
|
||||
iotRule --> errorQueue : Failed action message
|
||||
|
||||
Users(sources, "Events", "millions of users")
|
||||
APIGateway(votingAPI, "Voting API", "user votes")
|
||||
Cognito(userAuth, "User Authentication", "jwt to submit votes")
|
||||
Lambda(generateToken, "User Credentials", "return jwt")
|
||||
Lambda(recordVote, "Record Vote", "enter or update vote per user")
|
||||
DynamoDB(voteDb, "Vote Database", "one entry per user")
|
||||
|
||||
SimpleStorageServiceS3(s3_partner, "Vendor's S3", "Technology", "Optional Description")
|
||||
SimpleStorageServiceS3(s3_internal, "Internal", "Technology", "Optional Description")
|
||||
|
||||
s3_internal <- s3_partner
|
||||
|
||||
sources --> userAuth
|
||||
sources --> votingAPI
|
||||
userAuth <--> generateToken
|
||||
votingAPI --> recordVote
|
||||
recordVote --> voteDb
|
||||
@enduml
|
||||
@@ -0,0 +1,64 @@
|
||||
@startuml
|
||||
!includeurl https://raw.githubusercontent.com/ebbypeter/Archimate-PlantUML/master/Archimate.puml
|
||||
'!include <archimate/Archimate.puml>
|
||||
|
||||
title Archimate Example - Relationships
|
||||
|
||||
'LAYOUT_AS_SKETCH
|
||||
'LAYOUT_LEFT_RIGHT
|
||||
'LAYOUT_TOP_DOWN
|
||||
|
||||
Business_Service(Service01, "Service 01")
|
||||
Application_Service(Service02, "Service 02")
|
||||
Technology_Service(Service03, "Service03")
|
||||
|
||||
Rel_Composition_Right(Service01, Service02, "Composition")
|
||||
Rel_Aggregation(Service01, Service02, "Aggregation")
|
||||
Rel_Assignment(Service01, Service02, "Assignment")
|
||||
Rel_Specialization(Service01, Service02, "Specialization")
|
||||
Rel_Serving(Service01, Service02, "Serving")
|
||||
Rel_Association(Service02, Service03, "Association")
|
||||
Rel_Flow(Service02, Service03, "Flow")
|
||||
Rel_Realization(Service02, Service03, "Realization")
|
||||
Rel_Triggering(Service02, Service03, "Triggering")
|
||||
Rel_Access(Service02, Service03, "Access")
|
||||
Rel_Influence(Service02, Service03, " + Influence")
|
||||
|
||||
Grouping(Example01, "Example 01"){
|
||||
Strategy_Capability(TestCapability01, "Test Capability")
|
||||
Business_Product(TestProduct01, "Test Product")
|
||||
Application_Service(TestService01, "Test Service")
|
||||
Technology_Device(TestDevice01, "Test Device")
|
||||
|
||||
Rel_Composition(TestCapability01, TestProduct01, "C-P")
|
||||
Rel_Composition_Down(TestProduct01, TestService01, "P-S")
|
||||
Rel_Composition_Left(TestService01, TestDevice01, "S-D")
|
||||
Rel_Composition_Up(TestDevice01, TestCapability01, "D-C")
|
||||
}
|
||||
|
||||
Lay_D(Service01, Example01)
|
||||
|
||||
Group(Example02, "Group Type 02"){
|
||||
Motivation_Stakeholder(StakeholderElement, "Stakeholder Description")
|
||||
Business_Service(BService, "Business Service")
|
||||
}
|
||||
|
||||
Motivation_Requirement(ReqPayrollStandard, "Do Payroll with a standard system")
|
||||
Motivation_Requirement(ReqBudgetPlanning, "Do budget planning within the ERP system")
|
||||
|
||||
Application_Service(ASPayroll,"Payroll Service")
|
||||
Application_Service(ASBudgetPlanning,"Budget Planning Service")
|
||||
Application_Component(ACSAPFinanceAccRec, "SAP Finance - Accounts Recievables")
|
||||
Application_Component(ACSAPHR, "SAP Human Resources")
|
||||
Application_Component(ACSAPFin, "SAP Finance")
|
||||
Application_Component(ACSAP,"SAP")
|
||||
|
||||
Rel_Realization_Up(ASPayroll, ReqPayrollStandard)
|
||||
Rel_Realization_Up(ASBudgetPlanning, ReqBudgetPlanning)
|
||||
Rel_Realization_Up(ACSAPFinanceAccRec, ASBudgetPlanning)
|
||||
Rel_Realization_Up(ACSAPHR, ASPayroll)
|
||||
|
||||
Rel_Composition_Up(ACSAPFin, ACSAPFinanceAccRec)
|
||||
Rel_Composition_Up(ACSAP, ACSAPHR)
|
||||
Rel_Composition_Up(ACSAP, ACSAPFin)
|
||||
@enduml
|
||||
@@ -0,0 +1,49 @@
|
||||
@startuml
|
||||
' see: https://github.com/RicardoNiepel/C4-PlantUML
|
||||
'!includeurl https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Container.puml
|
||||
!include <c4/C4_Container.puml>
|
||||
|
||||
LAYOUT_TOP_DOWN
|
||||
' LAYOUT_WITH_LEGEND
|
||||
|
||||
Person_Ext(anonymous_user, "Anonymous User")
|
||||
Person(aggregated_user, "Aggregated User")
|
||||
Person(administration_user, "Administration User")
|
||||
|
||||
System_Boundary(c1, "techtribes.js"){
|
||||
|
||||
Container(web_app, "Web Application", "Java, Spring MVC, Tomcat 7.x", "Allows users to view people, tribes, content, events, jobs, etc. from the local tech, digital and IT sector")
|
||||
|
||||
ContainerDb(rel_db, "Relational Database", "MySQL 5.5.x", "Stores people, tribes, tribe membership, talks, events, jobs, badges, GitHub repos, etc.")
|
||||
|
||||
Container(filesystem, "File System", "FAT32", "Stores search indexes")
|
||||
|
||||
ContainerDb(nosql, "NoSQL Data Store", "MongoDB 2.2.x", "Stores from RSS/Atom feeds (blog posts) and tweets")
|
||||
|
||||
Container(updater, "Updater", "Java 7 Console App", "Updates profiles, tweets, GitHub repos and content on a scheduled basis")
|
||||
}
|
||||
|
||||
System_Ext(twitter, "Twitter")
|
||||
System_Ext(github, "GitHub")
|
||||
System_Ext(blogs, "Blogs")
|
||||
|
||||
|
||||
Rel(anonymous_user, web_app, "Uses", "HTTPS")
|
||||
Rel(aggregated_user, web_app, "Uses", "HTTPS")
|
||||
Rel(administration_user, web_app, "Uses", "HTTPS")
|
||||
|
||||
Rel(web_app, rel_db, "Reads from and writes to", "SQL/JDBC, post 3306")
|
||||
Rel(web_app, filesystem, "Reads from")
|
||||
Rel(web_app, nosql, "Reads from", "MongoDB wire protocol, port 27017")
|
||||
|
||||
Rel_U(updater, rel_db, "Reads from and writes data to", "SQL/JDBC, post 3306")
|
||||
Rel_U(updater, filesystem, "Writes to")
|
||||
Rel_U(updater, nosql, "Reads from and writes to", "MongoDB wire protocol, port 27017")
|
||||
|
||||
Rel(updater, twitter, "Gets profile information and tweets from", "HTTPS")
|
||||
Rel(updater, github, "Gets information about public code repositories from", "HTTPS")
|
||||
Rel(updater, blogs, "Gets content using RSS and Atom feeds from", "HTTP")
|
||||
|
||||
Lay_R(rel_db, filesystem)
|
||||
|
||||
@enduml
|
||||
@@ -0,0 +1,104 @@
|
||||
@startuml
|
||||
' see: https://github.com/awslabs/aws-icons-for-plantuml
|
||||
!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/master/dist
|
||||
!includeurl AWSPuml/AWSCommon.puml
|
||||
!includeurl AWSPuml/EndUserComputing/all.puml
|
||||
!includeurl AWSPuml/Storage/SimpleStorageServiceS3.puml
|
||||
|
||||
' see: https://github.com/aheil/EIP-PlantUML
|
||||
!includeurl https://raw.githubusercontent.com/aheil/EIP-PlantUML/main/dist/EIP-PlantUML.puml
|
||||
|
||||
' see: https://github.com/Roemer/plantuml-office
|
||||
!define ICONURL https://raw.githubusercontent.com/Roemer/plantuml-office/master/office2014
|
||||
!includeurl ICONURL/Servers/database_server.puml
|
||||
!includeurl ICONURL/Servers/application_server.puml
|
||||
!includeurl ICONURL/Concepts/firewall_orange.puml
|
||||
!includeurl ICONURL/Clouds/cloud_disaster_red.puml
|
||||
|
||||
' https://github.com/tupadr3/plantuml-icon-font-sprites
|
||||
!define ICONURL https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/v2.1.0
|
||||
!includeurl ICONURL/common.puml
|
||||
!includeurl ICONURL/common.puml
|
||||
!includeurl ICONURL/devicons/mysql.puml
|
||||
!includeurl ICONURL/font-awesome/database.puml
|
||||
!includeurl ICONURL/font-awesome-5/database.puml
|
||||
|
||||
' https://github.com/rabelenda/cicon-plantuml-sprites
|
||||
!define SPRITESURL https://raw.githubusercontent.com/rabelenda/cicon-plantuml-sprites/v1.0/sprites
|
||||
!includeurl SPRITESURL/tomcat.puml
|
||||
!includeurl SPRITESURL/kafka.puml
|
||||
!includeurl SPRITESURL/java.puml
|
||||
!includeurl SPRITESURL/cassandra.puml
|
||||
|
||||
' https://github.com/RicardoNiepel/Azure-PlantUML
|
||||
!define AzurePuml https://raw.githubusercontent.com/RicardoNiepel/Azure-PlantUML/release/2-1/dist
|
||||
!includeurl AzurePuml/AzureCommon.puml
|
||||
!includeurl AzurePuml/Databases/all.puml
|
||||
!includeurl AzurePuml/Compute/AzureFunction.puml
|
||||
|
||||
' Remove shadows
|
||||
skinparam shadowing true
|
||||
|
||||
actor "Person" as personAlias1
|
||||
AzureFunction(functionAlias, "Label", "Technology", "Optional Description")
|
||||
AzureCosmosDb(cosmosDbAlias, "Label", "Technology", "Optional Description")
|
||||
|
||||
personAlias1 --> functionAlias
|
||||
functionAlias --> cosmosDbAlias
|
||||
|
||||
rectangle "<$tomcat>\nwebapp" as webapp
|
||||
queue "<$kafka>" as kafka
|
||||
rectangle "<$java>\ndaemon" as daemon
|
||||
database "<$cassandra>" as cassandra
|
||||
|
||||
webapp -> kafka
|
||||
kafka -> daemon
|
||||
daemon --> cassandra
|
||||
|
||||
DEV_MYSQL(db)
|
||||
DEV_MYSQL(db4,label of db4,database,red) #DeepSkyBlue
|
||||
|
||||
MsgChannel(channel1, "Channel 1")
|
||||
MsgChannel(channel2, "Channel 2")
|
||||
Message(msg, "Message")
|
||||
|
||||
Send(channel1, msg)
|
||||
Send(msg, channel2)
|
||||
|
||||
rectangle System1
|
||||
rectangle System2
|
||||
rectangle System3
|
||||
|
||||
Message(source)
|
||||
Message(target)
|
||||
|
||||
ControlBus("cb")
|
||||
|
||||
Send(source, System1)
|
||||
Send(System1, System2)
|
||||
Send(System2, System3)
|
||||
Send(System3, target)
|
||||
|
||||
System1 <--> cb
|
||||
System2 <--> cb
|
||||
System3 <--> cb
|
||||
|
||||
SimpleStorageServiceS3(storageAlias, "Label", "Technology", "Optional Description")
|
||||
|
||||
actor User
|
||||
[Third party application] as ThirdPartyApp
|
||||
|
||||
package "Spring Boot Application" {
|
||||
rectangle Controllers <<Spring REST controllers>>
|
||||
rectangle DataStoreService <<Spring service>>
|
||||
rectangle Repository <<Spring repository>>
|
||||
}
|
||||
|
||||
User --> Controllers
|
||||
ThirdPartyApp --> Controllers
|
||||
storageAlias --> Controllers
|
||||
|
||||
Controllers --> DataStoreService
|
||||
DataStoreService --> Repository
|
||||
|
||||
@enduml
|
||||
@@ -0,0 +1,3 @@
|
||||
@startuml
|
||||
listopeniconic
|
||||
@enduml
|
||||
@@ -0,0 +1,27 @@
|
||||
@startuml
|
||||
!includeurl https://raw.githubusercontent.com/inthepocket/plantuml-styles/master/styles.plantuml!0
|
||||
|
||||
!include <logos/flask>
|
||||
!include <logos/kafka>
|
||||
!include <logos/kotlin>
|
||||
!include <logos/cassandra>
|
||||
|
||||
title Gil Barbara's logos example
|
||||
|
||||
' skinparam monochrome true
|
||||
|
||||
rectangle "<$flask>\nwebapp" as webapp
|
||||
queue "<$kafka>" as kafka
|
||||
rectangle "<$kotlin>\ndaemon" as daemon
|
||||
database "<$cassandra>" as cassandra
|
||||
|
||||
webapp -> kafka
|
||||
kafka -> daemon
|
||||
daemon --> cassandra
|
||||
|
||||
database "Database"
|
||||
package "Package"
|
||||
node "ParentNode" {
|
||||
component "Subcomponent"
|
||||
}
|
||||
@enduml
|
||||
@@ -0,0 +1,41 @@
|
||||
@startmindmap
|
||||
!includeurl https://cdn.jsdelivr.net/gh/HSLdevcom/hsl-plantuml-theme/hsl-theme.iuml
|
||||
|
||||
title Crosscutting Concepts
|
||||
|
||||
+ Crosscutting Concepts
|
||||
++ Under the hood
|
||||
+++ Persistence
|
||||
+++ Process Control
|
||||
+++ Transaction handling
|
||||
+++ Session handling
|
||||
+++ Communication and Integration
|
||||
+++ Exception and error handling
|
||||
+++ Parallelization / Threading
|
||||
+++ Plausibility checks and validation
|
||||
+++ Business Rules
|
||||
+++ Batch
|
||||
+++ Reporting
|
||||
++ Operation Concepts
|
||||
+++ Administration
|
||||
+++ Management
|
||||
+++ Disaster-Recovery
|
||||
+++ Skalierung
|
||||
+++ Clusterring
|
||||
+++ Monitoring, Logging, Protocolling
|
||||
+++ High Availability
|
||||
-- Domain Concepts
|
||||
-- Architecture and Design Patterns
|
||||
-- User Experience (UX)
|
||||
--- User Interface
|
||||
--- Ergonomics
|
||||
--- Internationalization
|
||||
-- Security and Safety
|
||||
--- Security
|
||||
--- Safety
|
||||
-- Development Concepts
|
||||
--- Build, Test, Deploy
|
||||
--- Code generation
|
||||
--- Migration
|
||||
--- Configurability
|
||||
@endmindmap
|
||||
@@ -0,0 +1,35 @@
|
||||
@startuml
|
||||
'!includeurl https://cdn.jsdelivr.net/gh/HSLdevcom/hsl-plantuml-theme/hsl-theme.iuml
|
||||
'!define LIGHTBLUE
|
||||
'!includeurl https://raw.githubusercontent.com/Drakemor/RedDress-PlantUML/master/style.puml
|
||||
|
||||
'!includeurl https://github.com/rbkmoney/plantuml-toolset/raw/master/skin.iwsd
|
||||
'!includeurl https://raw.githubusercontent.com/inthepocket/plantuml-styles/master/styles.plantuml!0
|
||||
|
||||
!includeurl https://github.com/rbkmoney/plantuml-toolset/raw/master/super-serious-skin.iwsd
|
||||
|
||||
skinparam BackgroundColor #ffffff
|
||||
|
||||
title Publish(er) Jobs Workers (Successful Block Copy)
|
||||
|
||||
hide footbox
|
||||
|
||||
Alice -> Bob: Authentication Request
|
||||
Bob --> Alice: Authentication Response
|
||||
|
||||
Alice -> Bob: Another authentication Request
|
||||
Alice <-- Bob: Another authentication Response
|
||||
|
||||
Alice -> Bob: Authentication Request
|
||||
...
|
||||
Bob --> Alice: Authentication Response
|
||||
activate Alice
|
||||
note left of Alice
|
||||
Drink that potion!
|
||||
end note
|
||||
deactivate Alice
|
||||
activate Bob
|
||||
... 5 minutes later ...
|
||||
Bob --> Alice: Bye!
|
||||
deactivate Bob
|
||||
@enduml
|
||||
@@ -0,0 +1,3 @@
|
||||
@startuml
|
||||
listsprites
|
||||
@enduml
|
||||
@@ -0,0 +1,3 @@
|
||||
@startuml
|
||||
testdot
|
||||
@enduml
|
||||
@@ -0,0 +1 @@
|
||||
[glossary]
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
@@ -0,0 +1,28 @@
|
||||
:doctitle: Fineract Documentation
|
||||
|
||||
include::config.adoc[]
|
||||
|
||||
= Fineract Documentation
|
||||
|
||||
include::preface.adoc[]
|
||||
|
||||
include::colophon.adoc[]
|
||||
|
||||
include::01_introduction.adoc[]
|
||||
|
||||
include::02_architecture.adoc[]
|
||||
|
||||
include::03_oauth.adoc[]
|
||||
|
||||
// include::04_api.adoc[]
|
||||
|
||||
include::05_client.adoc[]
|
||||
|
||||
include::06_validation.adoc[]
|
||||
|
||||
include::glossary.adoc[]
|
||||
|
||||
include::indices.adoc[]
|
||||
|
||||
include::appendix.adoc[]
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<<<
|
||||
|
||||
[index]
|
||||
== Index
|
||||
@@ -0,0 +1,9 @@
|
||||
[preface]
|
||||
== Preface
|
||||
(C) {years}
|
||||
|
||||
:hardbreaks:
|
||||
|
||||
*Apache Fineract*
|
||||
Website: https://fineract.apache.org[]
|
||||
Email: mailto:dev@fineract.apache.org[]
|
||||
@@ -0,0 +1,25 @@
|
||||
:doctitle: Fineract Documentation
|
||||
|
||||
include::config.adoc[]
|
||||
|
||||
= Fineract Documentation
|
||||
|
||||
IMPORTANT: @vidakovic migrate old documentation!
|
||||
|
||||
.Amazon
|
||||
[plantuml,amazon,svg]
|
||||
----
|
||||
include::diagrams/samples/amazon.puml[]
|
||||
----
|
||||
|
||||
.C4 Diagram
|
||||
[plantuml,c4,svg]
|
||||
----
|
||||
include::diagrams/samples/c4.puml[]
|
||||
----
|
||||
|
||||
.Mindmap
|
||||
[plantuml,mindmap,svg]
|
||||
----
|
||||
include::diagrams/samples/mindmap.puml[]
|
||||
----
|
||||
Reference in New Issue
Block a user