flora v7.0.0
Flora
Flora is a FLexible Open Rest API framework for Node.js.
Features
- Resources in resources (recursive): fetch as much as possible in one request, without duplicating code
- Lightweight (but powerful) field/sub-resource selection syntax: fetch exactly what you need in one request
- Filter resources even by sub-resource-attributes: resolve inside database when possible, or return ID lists
- Pluggable data sources: currently implemented: MySQL, MongoDB, Elasticsearch, Solr/Lucene
- Combine multiple data sources: even on per-row-basis - "API-side-JOIN"
- Highly optimized database queries: internal SQL parser to remove unselected fields and thus unreferenced LEFT JOINs
- Locale: parameterize JOINs i.e. with a localeId - no need for database views which can't be parameterized
- Handle all your special cases as good as possible: hooks and events for extending features
Server features
- Node.js HTTP-Server and Cluster based implementation with self-monitoring process-management
- Extremely verbose server-status - see everytime what the server is doing and what is hanging around in production
- Straightforward logging/error handling - i.e. forward all errors to your favorite "error-monitoring-tool"
- Updates in production with zero downtime - almost every part of code and config is replaceable without shutdown
- Comfortable development-features - usual "code-change - F5 - see result"-workflow
Design goals
- Generic implementation just for reading - offer helper for writing
- Easy abstraction of complex and distributed database structures
- Easy standard cases with minimal boilerplate code - special cases possible - "everywhere"
- Flexibility, stability, performance, simplicity, transparency
Documentation
Examples
URL structure
Format
/path/to/resource/<id>
?action=<action>
&select=xxx
&filter=xxx
&limit=10
&page=1
&width=100 (additional parameters)
&height=100
Example URLs
GET /article/123
(retrieve article 123 as JSON)GET /article/
(list of all articles)
Resource implementation
module.exports = (api) => ({
actions: {
retrieve: (request, response) => {
return api.resourceProcessor.handle(request, response)
},
hello: () => {
return Promise.resolve("Hello World");
// return "Hello World"
// Also, a Stream of Buffer can be returned
},
foo: {
default: (request, response) => {
// If "foo" was a function, only the default format was allowed.
// This way you can define additional formats:
},
image: (request, response) => {
// This is executed when /myresource/123.image?action=foo is called.
// The behaviour of each format is not dictated by the framework.
response.header('Content-Type', 'image/png');
return … // Stream or Buffer
}
}
}
});
Abstract definition
<?xml version="1.0" encoding="utf-8"?>
<resource primaryKey="id" xmlns:flora="urn:flora:options">
<flora:dataSource type="mysql" database="contents" table="user"/>
<id type="int"/>
<firstname/>
<lastname/>
</resource>
License
5 months ago
10 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago