Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cristianuser/agradon
Agradon is a Express Middleware for Automatize CRUD proccess and query system
https://github.com/cristianuser/agradon
backend crud-generator express midd nodejs query
Last synced: 3 months ago
JSON representation
Agradon is a Express Middleware for Automatize CRUD proccess and query system
- Host: GitHub
- URL: https://github.com/cristianuser/agradon
- Owner: CristianUser
- Created: 2020-02-02T19:45:40.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2022-05-30T15:05:37.000Z (over 2 years ago)
- Last Synced: 2024-10-15T15:23:23.426Z (3 months ago)
- Topics: backend, crud-generator, express, midd, nodejs, query
- Language: JavaScript
- Size: 199 KB
- Stars: 4
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# Agradon
[![Coverage Status](https://coveralls.io/repos/github/CristianUser/agradon/badge.svg?branch=master)](https://coveralls.io/github/CristianUser/agradon?branch=master)
Extensible Express middleware for automatic generation of the models, controllers, and routes with MongoDB.
## Getting started
### How to install
Install the package
```bash
npm install agradon
```Initialize **Agradon**
Set `MONGODB_URI` environment variable and import `agradon` in your app index.
```javascript
const express = require('express');
const agradon = require('agradon');
const app = express();agradon.init(app);
app.listen(process.env.PORT, () => console.log(`Server is listening on port ${process.env.PORT}`));
module.exports = app;
```Agradon also support plugins for increase functionality.
Plugin Example:
```javascript
function customPlugin(router, mongoose, schemas) {
// Code live here
...
}const config = {
app,
plugins: [customPlugin]
}
```## Entities
Agrandon entities are composed by three different files. Entities by default are located in entities folder, Example: `entities//schema.yml` You can also change this setting path in `ENTITIES_PATH` environment variable.
-schema.yml (Required)
-model.js (Optional)
-controller.js (Optional)### schema.yml \*
Schema file defines documents structure as `Mongoose.Schema` .
```yaml
_schema:
name:
first:
type: String
default: John
last: String
phone: String
age:
type: Number
required: true
_options:
timestamps: true
```### model.js
Model file used to set `virtual`, `hooks`, etc. You also can register middlewares to default routes or to be used in controller file.
```javascript
module.exports.schema = schema => {
// Code live here
return schema;
};module.exports.middleware = [];
```### controller.js
Controller file is used to create custom endpoints or add middlewares to the default endpoints.
```javascript
module.exports = (router, model, middleware) => {
router.get('/', (req, res) => {
return model.find({}).then(result => {
res.send(result);
});
});
return router;
};
```## Authentication Module
Agradon includes a configurable authentication plugin
### How to setup
To enable authetication module follow the example bellow. This module is configurable, so you can pass your own strategies to interact with db.
```javascript
agradon.init({
app,
rootPath: '/api',
plugins: [
require('agradon/auth')()
]
});
```By default we set `/auth/local` with a local strategy
### Auth Guards
The guards are created to protect the crud routes. guards are set in `schema.yml` by http method/action in db.
```yaml
...
_auth:
get: true
post: true
put: true
delete: true
```## Routing
Agradon creates the routes based in the entity name.
- GET: `/:collection`
- GET: `/:collection/:id`
- POST: `/:collection/`
- PUT: `/:collection/:id`
- DELETE: `/:collection/:id`You can set a prefix as `/api` in the config object
Example:```javascript
agradon.init({
app,
rootPath: '/api'
});
```## Query System
Agradon includes a powerful query system for `GET` requests
- Match
- Compare
- Pick
- Omit
- Pagination
- Limit
- PopulateThose Matchers are passed as query in get request, example `/user?match=name:john`
### Match
Match filter the results matching key:value in documents.
**Use**: `match=key:value`### Compare
Compare documents with.
**Use**: `compare=key:operator:value`
In case of multiple matching can be send it as array.
Operators:- ==
- \>
- <
- \>=
- <=
- !=### Pick
Select which fields you need from each document.
**Use**: `pick=field1,field2,field4.field4A` or `pick=field1&pick=field2&pick=field3`
Can be a string separated by comma or an array.### Omit
Omit is the oposite of `pick`.
**Use**: `omit=field1,field2,field4.field4A` or `omit=field1&omit=field2`
Can be a string separated by comma or an array.### Limit
You are able to limit the results.
**Use**: `limit=20`### Pagination
We also included pagination
**Use**: `page=1&perPage=10`> Hint: `perPage` is an alias for `limit`.
### Populate
If you have some experience with MongoDB maybe you know about populate, if not read [this](https://mongoosejs.com/docs/populate.html).
**Use**: `populate=field1(subField1,subField1)`
**Example**: `populate=user(name,lastname)`