diaspora-orm/plugin-server

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Diaspora-server

> A package to add RESTful APIs to Express with [Diaspora](https://www.npmjs.com/package/diaspora)

Fancy badges:
[![Build Status](https://travis-ci.org/diaspora-orm/plugin-server.svg?branch=master)](https://travis-ci.org/diaspora-orm/plugin-server)
[![Maintainability](https://api.codeclimate.com/v1/badges/733743517275d5b31c83/maintainability)](https://codeclimate.com/github/diaspora-orm/plugin-server/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/733743517275d5b31c83/test_coverage)](https://codeclimate.com/github/diaspora-orm/plugin-server/test_coverage)  
[![npm](https://img.shields.io/npm/dm/diaspora-orm/plugin-server.svg)](https://npmjs.org/package/@diaspora/plugin-server)
[![npm version](https://badge.fury.io/js/%40diaspora%2Fplugin-server.svg)](https://npmjs.org/package/@diaspora/plugin-server)
[![GitHub commit activity the past year](https://img.shields.io/github/commit-activity/y/diaspora-orm/plugin-server.svg)](https://github.com/diaspora-orm/plugin-server)
[![license](https://img.shields.io/github/license/diaspora/plugin-server.svg)](https://github.com/diaspora-orm/plugin-server)

## Getting started

### Installation

In order to run this plugin, you need to install both the Diaspora Server plugin & [Diaspora](https://www.npmjs.com/package/@diaspora/diaspora) itself.

```bash
npm install @diaspora/plugin-server @diaspora/diaspora
```

### Configuration

```ts
import { Diaspora } from '@diaspora/diaspora';
import { ExpressApiGenerator } from '@diaspora/plugin-server' );
import express = require( 'express' );

const app = express();

/* Configure Diaspora first: create your data sources, declare your models, etc... */
Diaspora.createNamedDataSource( /* ... */ );
Diaspora.declareModel( 'PhoneBook', /* ... */);

// Generates the API handler class
const expressApiGenerator = new ExpressApiGenerator({
    models: {
        PhoneBook: {
            singular:    'PhoneBook',
            plural:      'PhoneBooks',
            middlewares: { /* ... */ },
        },
    },
});

// Use the middleware to handle your requests
app.use( '/api', expressApiGenerator.middleware );
```

In the hash `models`, you can select which models you want to expose. You can use regular expressions, [minimatch](https://www.npmjs.com/package/minimatch) or plain text matching:

```ts
const expressApiGenerator = new ExpressApiGenerator({
    models: {
        '/ab?c\\d+/': {} // Regex, will match ac1, abc1, abc09
        'Qux*':       {} // Minimatch, will match Qux, QuxFoo, etc etc
        PhoneBook:    {} // Plain text matching
    },
});
```

In your model configuration, you can use following middlewares:

| Action  | Middleware functions (singular API) | Middleware functions (plural API) |
|---------|-------------------------------------|-----------------------------------|
| Insert  | post, insert, insertOne             | post, insert, insertMany          |
| Find    | get, find, findOne                  | get, find, findMany               |
| Update  | patch, update, updateOne            | patch, update, updateMany         |
| Replace | put, update, replaceOne             | put, update, replaceMany          |
| Delete  | delete, deleteOne                   | delete, deleteMany                |

Each middleware will be called as a standard Express middleware (eg with `req`, `res` & `next`). You can use them to customize the behavior of Diaspora Server.

### Getting further

Diaspora Server uses the same Diaspora module than your app, both sharing models & the web server.

For each requests below, the server may respond:

* **204** *No Content* if the operation didn't returned an entity or the set is empty.
* **400** *Bad Request* if the parsing of the query failed
* **404** *Not Found* if using singular API with ID: `/api/foo/66b72592-b1e2-4229-82b2-c94b475c9135`

| Action | HTTP Verb | Additionnal possible responses |
|------------------|-----------|------------------------------------------------------------------------------------------------------------------------|
| Insert | POST | **201** *Created* on success, **400** *Bad request* if validation failed |
| Find | GET | **200** *OK* on success |
| Update (diff) | PUT | **200** *OK* on success, **400** *Bad request* if validation failed, **405** *Method Not Allowed* if no `where` clause |
| Update (replace) | PATCH | **200** *OK* on success, **400** *Bad request* if validation failed, **405** *Method Not Allowed* if no `where` clause |
| Delete | DELETE | **204** *No Content* if no errors occured |

The documentation will be available at [https://diaspora-server.ithoughts.io/](https://diaspora-server.ithoughts.io/)

Inspired by [this tutorial](http://www.restapitutorial.com/lessons/httpmethods.html)

## Todo

* SOAP support?
* Planned: GraphQL API