nss-json-server
Version:
JSON Server with other useful mixins
269 lines (207 loc) • 5.63 kB
Markdown
# 🔐 NSS JSON Server
This package will pull in useful mixins created by us and other developers. Documentation and options are simplified for instruction of beginners.
Mixins:
* JWT authentication middleware for **[JSON Server](https://github.com/typicode/json-server)** published by Jeremy Bensimon at **[Json Server with Auth](https://github.com/jeremyben/json-server-auth)**
* Nested resource expansion for multiple levels of related resources
## Getting started
### Package Install
```bash
# NPM
npm i -g nss-json-server
# Yarn
yarn global add nss-json-server
```
Create a `db.json` file with a `users` collection :
```json
{
"users": []
}
```
### Alias Setup
Open your bash or zsh initialization file and add the following alias.
```sh
alias js="nss-json-server -X 7h -p 5050 -w"
```
### Running your API
Run with following command:
```bash
js db.json
```
_It exposes and works the same for all [JSON Server flags](https://github.com/typicode/json-server#cli-usage)._
## Authentication flow 🔑
JSON Server Auth adds a simple [JWT based](https://jwt.io/) authentication flow.
### Register 👥
- **`POST /register`**
**`email`** and **`password`** are required in the request body :
```http
POST /register
{
"email": "admina@gmail.com",
"password": "bestPassw0rd"
}
```
The response contains the JWT access token, user id and username (if exists):
```http
201 Created
{
"accessToken": "xxx.xxx.xxx",
"user": {
"id": 1,
"username": "xxxxxxxx"
}
}
```
Any other property can be added to the request body without being validated:
```http
POST /register
{
"email": "admina@gmail.com",
"password": "bestPassw0rd",
"username": "admina",
"firstname": "Admina",
"lastname": "Straytor",
"age": 32
}
```
### Login 🛂
- **`POST /login`**
**`email`** and **`password`** are required:
```http
POST /login
{
"email": "admina@gmail.com",
"password": "bestPassw0rd"
}
```
The response contains the JWT access token:
```http
200 OK
{
"accessToken": "xxx.xxx.xxx",
"user": {
"id": 1,
"username": "xxxxxxxx"
}
}
```
## Creating Owned Resources
If any resource has been guarded with an ownership level route:
| Permission | Description |
| ---------- | ------------------------------------------------------------------------------------------- |
| 600 | User must own the resource to write or read the resource. |
| 640 | User must own the resource to write the resource. User must be logged to read the resource. |
| 644 | User must own the resource to write the resource. Everyone can read the resource. |
Then when you make a request with the POST or PUT method, and there is an authorization header, then the `userId` will be automatically added to the request body.
#### Example
```js
fetch("http://localhost:5050/posts", {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: "Bearer xxxxxx.xx.xxxxx"
},
body: JSON.stringify({
url: "https://media.giphy.com/media/eHWWKfSp0VZ1V87Ixj/giphy.gif",
image: null,
timestamp: Date.now()
})
})
```
Example response:
```json
{
"url": "https://media.giphy.com/media/eHWWKfSp0VZ1V87Ixj/giphy.gif",
"image": null,
"timestamp": 1575211182251,
"userId": 4,
"id": 8
}
```
## Nested Resource Expansion 🔄
NSS JSON Server enhances JSON Server's `_expand` parameter to support multiple levels of resource embedding.
### Basic Usage
The standard JSON Server `_expand` parameter allows you to embed a related resource based on a foreign key:
```
GET /people/1?_expand=city
```
Response:
```json
{
"id": 1,
"name": "John Smith",
"cityId": 4,
"city": {
"id": 4,
"name": "Pittsburgh",
"stateId": 22
}
}
```
### Nested Expansion
With the nested expansion enhancement, you can now expand multiple levels deep using dot notation:
```
GET /people/1?_expand=city.state
```
Response:
```json
{
"id": 1,
"name": "John Smith",
"cityId": 4,
"city": {
"id": 4,
"name": "Pittsburgh",
"stateId": 22,
"state": {
"id": 22,
"name": "Pennsylvania"
}
}
}
```
For more details and advanced usage, see the [Nested Expansion Documentation](docs/nested-expansion.md).
## For Local Development
1. Clone repo
1. `npm i`
1. Create a `routes.json` and `db.json`
1. Add the following to your `routes.json`
### Sample routes.json
```json
{
"/users*": "/640/users$1",
"/posts*": "/640/posts$1"
}
```
### Starting the Dev Server
1. `npm run build`
1. `node dist/bin.js -w db.json -p 5050 -X 7h -r routes.json`
### Basic Requests
Using Postman, or your favorite HTTP request client, create the following requests.
* http://localhost:5050/register
```js
// Body (raw JSON)
{
"email": "admina@gmail.com",
"password": "Admin8*",
"name": "Admina Straytor",
"username": "admin",
"location": "Nashville, TN",
"avatar": ""
}
```
* **Method** - `POST`
* **Content-Type** header - `application/json`
* http://localhost:5050/posts
```js
// Body (raw JSON)
{
"url": "https://media.giphy.com/media/eHWWKfSp0VZ1V87Ixj/giphy.gif",
"image": null,
"timestamp": 1575211182251
}
```
* **Method** - `POST`
* **Authorization** header - Use token from registration response
* **Content-Type** header - `application/json`
* **Accept** header - `application/json`