Mifos Batch API
Google Summer of Code
Google Summer of code
Google Summer of Code is a global program organized by Google that offers student developers stipends to write code for various open source software projects.
Accepted student applicants are paired with a mentor or mentors from the participating projects, thus gaining exposure to real-world software development scenarios and workflows.
Mifos
Mifos is a US-based non-profit initiative that stewards the global community that builds the Mifos X platform – an open technology platform for financial inclusion used by financial services providers worldwide, supported by a network of certified local partners and maintained and extended by a global team of volunteers.
Mifos Batch API
- Allows passing instructions for several operations in a single HTTP request
- Input consists of logical HTTP requests represented as JSON array
- Returns a JSON array of logical HTTP responses
Why do we need a Batch API?
- Reduces Network Load by clubbing together multiple HTTP requests
- Reduces overall Latency by a huge factor
- Reduces wastage of Server Resources
- Handles dependent requests
- Provides much efficient syncing for mobile and offline systems
Features
- Customization
- Extendable
- Dependency Injection
- Allows all requests to be handled as a single transaction using enclosingTransaction parameter
Functional Structure
Client
HTTP Request ( JSON Array )
HTTP Response (JSON Array)
Batch API
Mifos API
Individual Requests
Individual Responses
UML Sequence Diagram
Sequence Flow
- BatchApiResource takes a JSON Array as input
- BatchApiService takes out individual requests
- CommandStrategy forwards individual requests to base API using the HTTP "method" and "relativeUrl"
- BatchApiService consolidates all responses/errors in response JSON Array
- BatchApiResource returns the final response array to client
API EndPoints
Batch API only accepts a HTTP JSON request and responds with a JSON object as output.
BatchRequest and BatchResponse classes provides objects for input and output to and from the API.
Both the requests and responses are in the form of JSON Array, where each element represents an individual HTTP Request.
Request Fields
-
requestId - unique Id of individual request
-
relativeUrl - resource url relative to base url
-
method - HTTP Request Methods(GET, POST, etc.)
-
headers - HTTP Headers
-
reference - requestId of parent request
-
body - HTTP request Body
Response Fields
-
requestId - identifies individual input request
-
statusCode - HTTP Status Code (200, 500, etc.)
-
headers - optional headers of HTTP Response
-
body - HTTP Body of output response
Sample Request/Response
[
{
"requestId" : 1,
"relativeUrl" : "clients",
"method" : "POST",
"headers": [{"name": "Content-type", "value": "text/html"}, {"name": "X-Mifos-Platform-TenantId", "value": "text/html"}],
"body" : "{ \"officeId\": 1, \"firstname\": \"Petra\", \"lastname\": \"Yton\", \"externalId\": \"76YYP7\", \"dateFormat\": \"dd MMMM yyyy\", \"locale\": \"en\", \"active\": true, \"activationDate\": \"04 March 2009\",
\"submittedOnDate\": \"04 March 2009\", \"savingsProductId\" : 1 } "
},
{
"requestId" : 2,
"relativeUrl" : "loans",
"method" : "POST",
"headers": [{"name": "Content-type", "value": "text/html"}],
"reference": 1,
"body" : "{ \"clientId\" : \"$.clientId\", \"productId\" : 1}"
},
{
"requestId" : 3,
"method" : "POST",
"relativeUrl" : "clients",
"headers": [{"name": "Content-type", "value": "text/html"}],
"body" : "{ \"officeId\": 1, \"fullname\": \"Pocahontas\", ... }"
},
{
"requestId" : 4,
"method" : "POST",
"relativeUrl" : "savingsaccount",
"headers": [{"name": "Content-type", "value": "text/html"}],
"reference": 3,
"body" : "{ \"clientId\" : \"$.clientId\", \"productId\" : 1, ...}"
}
]
[
{
"requestId" : 1,
"statusCode" : 201,
"headers" : [
{
"name" : "Content-Type",
"value" : "application/json; charset=UTF-8"
}
],
"body" : "{ \"officeId\": 1, \"clientId\": 1, ...}"
},
{
"requestId" : 2,
"statusCode" : 201,
"headers" : [
{
"name" : "Content-Type",
"value" : "application/json; charset=UTF-8"
}
],
"body" : "{ \"officeId\": 1, \"clientId\": 1, \"loanId\": 1, ...}"
},
{
"requestId" : 3,
"statusCode" : 201,
"headers" : [
{
"name" : "Content-Type",
"value" : "application/json; charset=UTF-8"
}
],
"body" : "{ \"officeId\": 1, \"clientId\": 2, ...}"
},
{
"requestId" : 4,
"statusCode" : 201,
"headers" : [
{
"name" : "Content-Type",
"value" : "application/json; charset=UTF-8"
}
],
"body" : "{ \"officeId\": 1, \"clientId\": 2, \"savingsId\": 1, ...}"
}
]
Errors and Error Codes
-
400 Bad Request - Invalid Parameter or Data Integrity Issue.
-
401 Authentication Error.
-
403 Unauthorized Request.
-
404 Resource Not Found
-
500 Platform Internal Server Error.
Mifos Community App
The default web application built on top of the MifosX platform for the mifos user community. It is a Single-Page App (SPA) written in web standard technologies like JavaScript, CSS and HTML5. It leverages common popular frameworks/libraries such as AngularJS, Bootstrap and Font Awesome.
Community App
Enhancements
- Retrofitted end points to support Batch API
- Modified Error Handler
- Appended Front-end for Bulk JLG Loan Application
- Modified some Task controllers for more efficient Batch API
Bulk JLG Loan
- Employs Batch API to add JLG Loans to multiple User accounts, in a single request
- Common Fields for all the User accounts
- Specific Fields for individual Users
- Returns error for individual requests, if any
Limitations
- Highly Specific Code
- Can handle only a limited number of requests (50 - 100)
- Need to manually code support for further modules
Conclusion
An API Structure like Batch API is a highly desirable feature for platforms that handles a large number of transactions per second. WikiPedia and Facebook are some of the very first platforms for developing a Batch API.
It saves a lot of unused Bandwidth and provides much lesser latency time. And is primarily useful for Syncing, Bulk Operations and offline apps.
Documentation and
Source Code
- Documentation - https://demo.openmf.org/api-docs/apiLive.htm#batch_api
- Github Repo(Batch API) - https://github.com/rishy/mifosx/tree/Batch-API
- Github Repo(Community App) - https://github.com/rishy/community-app/tree/MIFOSX-1425
Thank you.
Mifos Batch API
By Rishabh Shukla
Mifos Batch API
Presentation for College Colloquium on my Google Summer of Code Project - Mifos Batch API.
- 1,759