Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/luizguilhermesj/generic-rest-api

Node JS generic rest api based on your models
https://github.com/luizguilhermesj/generic-rest-api

express express-middleware expressjs generator rest rest-api sequelize

Last synced: about 3 hours ago
JSON representation

Node JS generic rest api based on your models

Awesome Lists containing this project

README

        

[![Build Status](https://travis-ci.org/luizguilhermesj/generic-rest-api.svg?branch=master)](https://travis-ci.org/luizguilhermesj/generic-rest-api)

# generic-rest-api
Express JS generic REST API based on your sequelize models

The goal is to make something that we can use to build APIs really fast, instead of using a full framework like [sailsjs](http://sailsjs.com/) or [loopback](http://loopback.io/)

#### Requirements

* expressjs
* sequelize

#### Getting Started

First you add generic-rest-api to your project:

```shell
npm install --save generic-rest-api
```

Then you add it as a middleware to your express app, informing the path where your sequelize models are:

```javascript
var genericRestApi = require('generic-rest-api');
...
app.use(genericRestApi(__dirname+'/models'));
```

Let's assume you have just one model named `user`. The first example will add your application the following routes:

GET /user
GET /user/:id
GET /user/:id/:relation
POST /user
PUT /user/:id
DELETE /user/:id

If you want to add a prefix to your API you just need to declare it in express use:

```javascript
app.use('/api/v2', genericRestApi(__dirname+'/models'));
```

This way your API will be:

GET /api/v2/user
[...]

You can also add some middlewares to all generic rest routes using an options argument:

```javascript
var options = {
middlewares: [
authentication
]
};
app.use(genericRestApi(__dirname+'/models', options));
```

#### Aditional Parameters
In way to perform more specific queries, you can pass some parameters while accessing your API route.

**Filter results by specif value (works as sql 'where [name] = [value]')**
all parameters passed as get method will be treated as a 'WHERE' rule
```
GET /api/v2/user/?firstName=Luiz
```

**Show only specific fields**
To return only specif fields, you can pass a parameter called 'fields' separeted by comma.
```
GET /api/v2/user/?firstName=Luiz&fields=user_id,age,fullName
```

**Making field relations**
If a foreign key is set to a field, you can pass with a parameter called 'populate' in order to have it retrieve within your API response. If you have more than one relation, you can pass it also separated by comma
```
GET /api/v2/user/?firstName=Luiz&fields=user_id,age,fullName&populate=company,...
```

***Advanced where queries***
In order to have advanced queries with 'LIKE' on 'WHERE', you can specify an JSON just like sequelize accepts
```
GET /api/v1/user/?where={"name":{"$like":"%25Luiz%25"}}
```

Important notes:
* If you pass 'WHERE' parameter, all others other filter rules passed by get method will be overwritten.
* You need to specify the operator name with a "$" as a prefix.
* You can find a list of all operators accepted on http://docs.sequelizejs.com/manual/tutorial/querying.html#operators

#### Authentication

There is no authentication in this module.
I know I'm forcing your hand here, but you can use a middleware for authentication and hooks on models for authorization.

#### Obs

If you want to override any method, you just need to add your own custom route BEFORE the middleware.

#### Issues

If you find any kind of issue, please make this world more beautiful and **report** this [**issue**](https://github.com/luizguilhermesj/generic-rest-api/issues) so I can correct it.
And, of course, if you want you can always make a [**pull request**](https://github.com/luizguilhermesj/generic-rest-api/pulls).

#### Next Steps

* support Restify
* support other ORMs